Android開發 FragmentManage的詳解


前言

  我還在學習Android開發的時候發過一篇簡單的入門Fragment demo代碼:https://www.cnblogs.com/guanxinjing/p/9708626.html 但是,Fragment遠遠不是一個簡單的Demo就能了解清楚的,所以此篇博客將講解FragmentManage的Api的功能

如何獲取FragmentManage

activity里獲取FragmentManage方式如下:

@Override
    protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_demo); FragmentManager fragmentManager = getSupportFragmentManager(); }

FragmentManage的API

findFragmentByTag

 

    private void addAndFind() {
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        transaction.add(R.id.frameLayout, new OneFragment(), "one"); //添加容器布局id/ Fragment/ tag
        transaction.add(R.id.frameLayout, new TwoFragment(), "two");
        transaction.commitNow();//commitNow()為立即提交, 如果使用commit()提交可能會導致下面findFragmentByTag獲取的Fragment為空
        Fragment fragment = fragmentManager.findFragmentByTag("one"); //查找指定tag的Fragment
        Log.e(TAG, "fragments size = " + fragmentManager.getFragments().size());
        Log.e(TAG, "Fragment id = " + fragment.getId());
        Log.e(TAG, "Fragment tag = " + fragment.getTag());
        Log.e(TAG, "Fragment name = " + fragment.getClass().getName());

    } 

結果日志:

2020-02-24 10:39:22.838 5148-5148/com.zh.fragmentdemo E/com.zh.fragmentdemo.MainActivity: fragments size = 2
2020-02-24 10:39:22.838 5148-5148/com.zh.fragmentdemo E/com.zh.fragmentdemo.MainActivity: Fragment id = 2131230838
2020-02-24 10:39:22.838 5148-5148/com.zh.fragmentdemo E/com.zh.fragmentdemo.MainActivity: Fragment tag = one
2020-02-24 10:39:22.838 5148-5148/com.zh.fragmentdemo E/com.zh.fragmentdemo.MainActivity: Fragment name = com.zh.fragmentdemo.OneFragment

findFragmentById

請注意使用findFragmentById,只會查找到指定布局最后一個添加的Fragment(棧中最上面的Fragment)

    private void addAndFindById() {
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        transaction.add(R.id.frameLayout, new OneFragment(), "one");
        transaction.add(R.id.frameLayout, new TwoFragment(), "two");
        transaction.commitNow();
        Fragment fragment1 = fragmentManager.findFragmentById(R.id.frameLayout);  //使用容器布局id查找,只會找到棧最后添加的Fragment
        Log.e(TAG, "1 Fragments size = " + fragmentManager.getFragments().size());
        Log.e(TAG, "1 Fragment id = " + fragment1.getId());
        Log.e(TAG, "1 Fragment tag = " + fragment1.getTag());
        Log.e(TAG, "1 Fragment name = " + fragment1.getClass().getName());
        FragmentTransaction transaction2 = fragmentManager.beginTransaction(); //FragmentTransaction每次調用commit后,就需要重新獲取一個
        transaction2.remove(fragment1); //移除上面獲取到的Fragment
        transaction2.commitNow();       //立即提交
        Fragment fragment2 = fragmentManager.findFragmentById(R.id.frameLayout);
        Log.e(TAG, "2 Fragments size = " + fragmentManager.getFragments().size());
        Log.e(TAG, "2 Fragment id = " + fragment2.getId());
        Log.e(TAG, "2 Fragment tag = " + fragment2.getTag());
        Log.e(TAG, "2 Fragment name = " + fragment2.getClass().getName());

    }

結果日志:

2020-02-24 11:23:25.052 5931-5931/com.zh.fragmentdemo E/com.zh.fragmentdemo.MainActivity: 1 Fragments size = 2
2020-02-24 11:23:25.052 5931-5931/com.zh.fragmentdemo E/com.zh.fragmentdemo.MainActivity: 1 Fragment id = 2131230838
2020-02-24 11:23:25.052 5931-5931/com.zh.fragmentdemo E/com.zh.fragmentdemo.MainActivity: 1 Fragment tag = two
2020-02-24 11:23:25.052 5931-5931/com.zh.fragmentdemo E/com.zh.fragmentdemo.MainActivity: 1 Fragment name = com.zh.fragmentdemo.TwoFragment
2020-02-24 11:23:25.054 5931-5931/com.zh.fragmentdemo E/com.zh.fragmentdemo.MainActivity: 2 Fragments size = 1
2020-02-24 11:23:25.055 5931-5931/com.zh.fragmentdemo E/com.zh.fragmentdemo.MainActivity: 2 Fragment id = 2131230838
2020-02-24 11:23:25.055 5931-5931/com.zh.fragmentdemo E/com.zh.fragmentdemo.MainActivity: 2 Fragment tag = one
2020-02-24 11:23:25.055 5931-5931/com.zh.fragmentdemo E/com.zh.fragmentdemo.MainActivity: 2 Fragment name = com.zh.fragmentdemo.OneFragment 

saveFragmentInstanceState

保存實例狀態

isStateSaved

是否狀態已保存

isDestroyed

是否摧毀

 

 

addOnBackStackChangedListener  

添加返回堆棧變化監聽

 

 

getBackStackEntryCount

返回堆棧輸入計數

getBackStackEntryAt

 

 

getPrimaryNavigationFragment

 

 

 

 

putFragment

 

getFragment

 

getFragments

 

popBackStack

彈出返回堆棧

 

 

 

 

 

 

end


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM