Android知识Android开发Android技术知识

android基础知识--切换Fragment解决方案

2016-10-20  本文已影响282人  IT枫

简略查看Fragment生命周期


生命周期图
与Activity生命周期函数关系图

1 Fragment预先写入布局文件中

这种方案的问题:如果更换Fragment,需改动两个文件,而且不能动态加载,局限性比较大。

  <FrameLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" 
    android:layout_height="match_parent">
    <fragment 
           class="com.example.android.apis.app.FragmentA"
            android:id="@+id/fragmenta"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    <fragment 
           class="com.example.android.apis.app.FragmentB"
            android:id="@+id/fragmentb"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    <fragment 
            class="com.example.android.apis.app.FragmentC"
            android:id="@+id/fragmentc"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    <fragment 
            class="com.example.android.apis.app.FragmentD"
            android:id="@+id/fragmentd"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
</FrameLayout>

2 Replace()替换Fragment

这种方案的问题在于每次调用replace()方法时Fragment的生命周期会重走。这在现实开发中是不允许的。
说明:在替换之前,系统会调用之前Fragment的生命周期函数
onPause()
onStop()
onDestroy()
onDetach()
然后调用替换的Fragment生命周期函数
onAttach()
onCreat()
onCreatView()
onActivityCreated()
onStart()
onResume()

  transaction.replace(R.id.fragment_, fragmentCurrent);

3 添加(add),隐藏(hide),显示(show)

预先将Fragment对象添加到集合,加载时从集合取出Fragment对象添加到FragmentTransaction即可,切换Fragment,调用show()。隐藏之前Fragment,调用hide()。
说明:无论调用show()还是hide(),系统不会调用Fragment的任何生命周期函数。

{
  //定义集合
  List<Fragment> fragments = new ArrayList();
  //判断Fragment是否添加
  Fragment fragment = getSupportFragmentManager().findFragmentByTag(fragments.get(currentIndex).getClass().getName());
  fragment.isAdded();
  //Fragment对象添加到FragmentTransaction
  FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
  ft.add(R.id.fragment, fragment, fragment.getClass().getName());
  //隐藏Fragment
  ft.hide(fragment);
  //显示Fragment
  ft.show(fragment);
  //最后一步,提交
  ft.commit();
}

4 添加(add),分离(detach),粘贴(attach)

预先将Fragment对象加入集合,使用时从集合取出Fragment对象添加到FragmentTransaction事物中。
之后每次切换Fragment,分离之前Fragment,粘贴切换的Fragment。
说明:调用detach()函数后Fragment的生命周期函数
onPause()
onStop()
onDestroyView()都会被执行;
调用attach()函数后Fragment的生命周期函数
onCreateView()
onActivityCreated(Bundle)
onResume()会被再次执行。

{
   FragmentTransaction ft = mFragmentManager.beginTransaction();
   ft.add(mContainerId, fragment, newNavButton.getTag());
   ft.detach(oldNavButton.getFragment());
   ft.attach(newNavButton.getFragment());
   ft.commit();
}

Android Fragment切换解决方案

上一篇下一篇

猜你喜欢

热点阅读