Android中一個Fragment呼叫另一個fragment的方法
阿新 • • 發佈:2019-02-18
先看需求,是要實現上圖中篩選功能。父級(“發現”頁面)已經是Fragment,子級“推薦”和“附近”也是Fragment;於是就相當於從一個fragment去動態控制另一個fragment;在苦惱並查閱了一些資料後並沒有找到好的解決方案,最後看到百度知道有人提到這個問題,最後解決了,記錄下來,也便於其他有需要的兄弟~
遇到Fragment與Fragment、Fragment與Activity需要相互通訊、傳遞資料以及進行互 操作的問題,查閱了官方文件,也實現了官方的例子,但實際專案是ViewPager+Fragment,按官方的例 子,總是獲取不到Fragment的引用,如: HeadLinesFragment headLinesFrag = (HeadLinesFragment) getSupportFragmentManager().findFragmentById(R.id.headline_fragment); 這是因為在ViewPager裡Fragment是new出來動態加到ViewPager裡的,上需的Id只是Fragment的布 局檔案的根Id,不是Fragment 的Id,故獲取的Fragment為空 查詢相關資料後,終於找到如下解決方案: 一般來講,我們再使用viewpager的時候,是在程式碼中動態的新增fragment。此時,我們不能去指定 fragment的id,也不能指定他的tag,如果你一定要去指定tag,執行時會提示,tag已經被指定。那麼,在動 態的添加了fragment之後,我們如何能獲取到該fragment並修改其中的內容呢。兩種方法: 第一種方法實際上是一種hack方法,並沒有官方文件說明支援。程式碼如下: SomeFragment someFragment = getSupportFragmentManager().FindFragmentByTag(“android:switcher:” + R.id.viewpager + “:0″); if (someFragment != null) //可能沒有例項化 { if (someFragment.getView() != null) { someFragment.updateView();//自定義方法更新 } } 這裡要記住的就是”android:switcher:” + R.id.viewpager + “:0″ 這個字元竄表示的就是該 fragment的tag,其中0 是fragment 在viewpager中的位置。 第二種方法更正規,因為第一種方法對基於FragmentPagerAdapter的實現是有效的,但對於 FragmentStatePagerAdapter就無效了。因為FragmentStatePagerAdapter不會對傳給 FragmentManager的Fragment設定tag. ViewPager pager = (ViewPager)findViewById(R.id.viewpager); FragmentStatePagerAdapter f = pager.getAdapter(); SomeFragment someFragment = (SomeFragment)f.instantiateItem(pager,position); instantiateItem(pager,position)方法會返回在position位置的fragment的引用。如果該 fragment 已經例項化了,再次呼叫instantiateItem(pager,position)的時候,該方法並不會呼叫 getItem()來再次例項化fragment,而是直接返回引用。 方法三更簡單: Activity裡的語句: mPagerAdapter = new DownloadSlidePagerAdapter(getSupportFragmentManager()); LocalVideoListFragment fragment = ((LocalVideoListFragment)mPagerAdapter.getItem(mCurrItem)); fragment.refresh(); DownloadSlidePagerAdapter: public class DownloadSlidePagerAdapter extends FragmentPagerAdapter { Fragment[] fragments = {new DownloadListFragment(),new LocalVideoListFragment()}; public DownloadSlidePagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { return fragments[position]; } @Override public int getCount() { return fragments.length; } } 直接獲取new的例項物件應用