1. 程式人生 > >Android中一個Fragment呼叫另一個fragment的方法

Android中一個Fragment呼叫另一個fragment的方法


先看需求,是要實現上圖中篩選功能。父級(“發現”頁面)已經是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的例項物件應用