国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

Android-實現(xiàn)切換Fragment頁功能的實現(xiàn)代碼

2019-12-12 03:41:42
字體:
供稿:網(wǎng)友

場景:使用Fragment實現(xiàn)切頁。

類結(jié)構(gòu):

一: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,作為管理其它子葉片F(xiàn)ragmentX。

現(xiàn)在比如有兩個子葉片F(xiàn)ragmentB、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);    }    //隱藏現(xiàn)在正顯示的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)

子頁的邏輯根據(jù)具體業(yè)務自己定義,實現(xiàn)與一般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);  }} 

到這里,就可以簡單的實現(xiàn)-用底部Tab切換Fragment實現(xiàn)切頁的功能

附圖:

 

PS:實現(xiàn)過程中出現(xiàn)的錯誤 

復制代碼 代碼如下:

java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.

正確方式: 有關(guān)的fragment的初始化布局應該加上false,與父類布局建立關(guān)系。

原因:不加的話這個inflater出來的view系統(tǒng)會綁定一個未知父類,這時候當你把這個fragment又作為子頁綁定給Activity或者另一個fragment時,就會出現(xiàn)以上錯誤。

@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);   }   

 以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 石首市| 图片| 保德县| 桃江县| 渭源县| 荣成市| 洪泽县| 鹿泉市| 剑河县| 姜堰市| 黄石市| 惠来县| 阿合奇县| 社旗县| 南郑县| 云梦县| 秭归县| 侯马市| 浦县| 政和县| 西乌| 招远市| 容城县| 万山特区| 牙克石市| 江安县| 和龙市| 霍州市| 衢州市| 会同县| 荔波县| 平阴县| 马龙县| 徐闻县| 鄂伦春自治旗| 安远县| 清远市| 岢岚县| 威海市| 太康县| 潜江市|