Android-实现切换Fragment页功能的实现代码
程序员文章站
2023-12-17 13:07:28
场景:使用fragment实现切页。
类结构:
一:activity
activity中使用getsupportfragmentmanager().b...
场景:使用fragment实现切页。
类结构:
一:activity
activity中使用getsupportfragmentmanager().begintransaction()来填充一个fragment(管理用的fragmenta)
activity部分代码:
fragmenta fragment = fragmenta.newinstant(null); getsupportfragmentmanager().begintransaction().add(r.id.f_tab_fragment,fragment).commit();
xml:
<framelayout android:id="@+id/fl_container" android:layout_width="match_parent" android:layout_above="@+id/f_tab_fragment" android:layout_height="match_parent"/> <framelayout android:id="@+id/f_tab_fragment" android:layout_width="match_parent" android:layout_height="52dp" android:layout_alignparentbottom="true"/>
二:fragmenta
加载一个主fragmenta,作为管理其它子叶片fragmentx。
现在比如有两个子叶片fragmentb、fragmentc.
fragmenta 使用fragmentmanager和fragmenttransaction管理fragmentb、fragmentc的切换
fragmenta代码:
public class fragmenta extends basefragment { private static final string tab_home = com.timediffproject.module.home.mymainfragment.class.getname(); private static final string tab_test = com.timediffproject.module.home.testfragment.class.getname(); private basefragment mlastshowfragment; private static tabfragment fragment; public static tabfragment newinstant(bundle bundle){ if (fragment == null){ fragment = new tabfragment(); fragment.setarguments(bundle); } return fragment; } @override public void oncreate(@nullable bundle savedinstancestate) { super.oncreate(savedinstancestate); inittabinfo(); } private void inittabinfo(){ fragmentmanager fm = getfragmentmanager(); if (fm == null){ return; } fragmenttransaction ft = fm.begintransaction(); basefragment home = (basefragment) fm.findfragmentbytag(tab_home); if (home != null){ ft.hide(home); } basefragment test = (basefragment) fm.findfragmentbytag(tab_test); if (test != null){ ft.hide(test); } ft.commit(); } @nullable @override public view oncreateview(layoutinflater inflater,viewgroup container,bundle savedinstancestate) { return inflater.inflate(r.layout.fragment_tab,container,false); } @override public void onviewcreated(view view, @nullable bundle savedinstancestate) { super.onviewcreated(view, savedinstancestate); view.findviewbyid(r.id.btn_change_home).setonclicklistener(new view.onclicklistener() { @override public void onclick(view view) { switchto(tab_home,null); } }); view.findviewbyid(r.id.btn_change_test).setonclicklistener(new view.onclicklistener() { @override public void onclick(view view) { switchto(tab_test,null); } }); switchto(tab_home,null); } //切换fragment的方式(fragmentb、fragmentc) //tab为fragment的类名(如:fragmentb.class.getname()) //r.id.fl_container是在activity的布局里,不是在fragmenta的布局里 private void switchto(string tab, bundle bundle){ //初始化管理fragment的类 fragmentmanager fm = getfragmentmanager(); if (fm == null){ return; } fragmenttransaction ft = fm.begintransaction(); //从fragmentmanager里寻找类名为tab的fragment basefragment fragment = (basefragment)fm.findfragmentbytag(tab); if (fragment == null){ fragment = (basefragment) fragment.instantiate(getactivity(),tab); fragment.setarguments(bundle); ft.add(r.id.fl_container,fragment,tab); }else{ ft.show(fragment); } //隐藏现在正显示的fragment if (mlastshowfragment != null) { ft.hide(mlastshowfragment); } //记录最后点击的fragment mlastshowfragment = fragment; ft.commitallowingstateloss(); } }
xml:
<?xml version="1.0" encoding="utf-8"?> <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="52dp"> <button android:id="@+id/btn_change_home" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="切换home" /> <button android:id="@+id/btn_change_test" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="切换test" /> </linearlayout>
三:fragmentx(fragmentb、fragmentc)
子页的逻辑根据具体业务自己定义,实现与一般fragmeng一样
例如:
public class testfragment extends basefragment { @nullable @override public view oncreateview(layoutinflater inflater, viewgroup container, bundle savedinstancestate) {return inflater.inflate(r.layout.fragment_test,container,false); } @override public void onviewcreated(view view, bundle savedinstancestate) { super.onviewcreated(view, savedinstancestate); } }
到这里,就可以简单的实现-用底部tab切换fragment实现切页的功能
附图:
ps:实现过程中出现的错误
复制代码 代码如下:
java.lang.illegalstateexception: the specified child already has a parent. you must call removeview() on the child's parent first.
正确方式: 有关的fragment的初始化布局应该加上false,与父类布局建立关系。
原因:不加的话这个inflater出来的view系统会绑定一个未知父类,这时候当你把这个fragment又作为子页绑定给activity或者另一个fragment时,就会出现以上错误。
@nullable @override public view oncreateview(layoutinflater inflater, viewgroup container, bundle savedinstancestate) { //这里正确的写法是: //return inflater.inflate(r.layout.fragment_test,container,false); return inflater.inflate(r.layout.fragment_test,container); }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。