Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Viewpager 獲取當前顯示的fragment -- Android學習之路

Viewpager 獲取當前顯示的fragment -- Android學習之路

編輯:關於Android編程

Viewpager 獲取當前顯示的fragment

使用 getSupportFragmentManager().findFragmentByTag()方法

Viewpager + FragmentPagerAdapter 情況下 才好使; FragmentPagerAdapter 有一個特點 凡是加載過的Fragment 都會被保留,既然Fragment不會被銷毀,那我們就可以使用findFragmentByTag() 方法找到它;但問題是動態創建的話 tag的設置;我們知道動態加載時是可以設置tag的,但是動態創建就沒法設置了;如果viewpager使用的是適配器是 FragmentPagerAdapter 的話 ,Fragment就會被設置上tag 根據這個tag 我們就可以獲取到當前顯示的fragment了;下面看看這個過程

新創建時 tag ==null

@Override
public Fragment getItem(int position) {
   PageTab  pageTab = tabs.get(position);
    TabFragment tab = new TabFragment();
    Log.e(TAG,"====getItem===新創建時的tag:=="+tab.getTag());
    tab.getArguments().putSerializable("tab",pageTab);
    //取出數據 新建Fragment
    return tab;
}

Log 查看 tag 時為 null

 E/FileListPagerAdapter: ====getItem===新創建時的tag:==null

將 適配器設置給Viewpager後 的tag

E/MainActivity: ==findCurrentFragment==pagerId:2131492976
E/MainActivity: ==findCurrentFragment==currentItem:0
E/MainActivity: =======findCurrentFragment=========完整Tag===android:switcher:2131492976:0
E/MainActivity: =======findCurrentFragment=========當前顯示的Fragment 的tag===:android:switcher:2131492976:0

可以看到 tag的組成;四部分
- android : 固定部分
- switcher : 固定部分
- 2131492976 : ViewPager 的id
- 0 : ViewPager 當前顯示的itemPostion

既然FragmentPagerAdapter的特點是保存fragment狀態。 就可以利用這個特點通過 findFragmentByTag() 找到這個Fragment

//Viewpager + FragmentPagerAdapter 情況下 獲取 當前顯示的Fragment,只能找已經加載過的Fragment
Fragment fragment =  getSupportFragmentManager().findFragmentByTag("android:switcher:"+pager.getId()+":"+pager.getCurrentItem());

重寫適配器的 setPrimaryItem()方法 ;

這個方法在每次viewpager滑動後都會被調用 而 object參數就是顯示的Fragment ;可以在適配器中定義個變量 currentFragment 每次改變時都會獲取到顯示的Fragment

@Override
public void setPrimaryItem(ViewGroup container, int position, Object object) {
    currentFragment = (TabFragment) object;
    super.setPrimaryItem(container, position, object);
}

這種方式有一個缺陷 setPrimaryItem()是在 viewpager的滑動監聽執行完後才會調用的;所以在 換的個滑動監聽中獲取當前顯示的Fragment 是不對的


  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved