美文网首页Android知识Android开发Android技术知识
android基础知识--切换Fragment解决方案

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

作者: IT枫 | 来源:发表于2016-10-20 21:49 被阅读282次

    简略查看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切换解决方案

    相关文章

      网友评论

        本文标题:android基础知识--切换Fragment解决方案

        本文链接:https://www.haomeiwen.com/subject/ejhquttx.html