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