亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

Android中ViewPager獲取當(dāng)前顯示的Fragment

Original 2017-01-13 11:41:16 812
abstract:這篇文章主要介紹了Android中ViewPager獲取當(dāng)前顯示的Fragment的兩種方法,一種是使用 getSupportFragmentManager().findFragmentByTag()方法,另一種是重寫適配器的 setPrimaryItem()方法,有需要的朋友可以參考借鑒,下面來一起看看吧。前言在項(xiàng)目中,有時(shí)會(huì)用到在ViewPager中顯示同樣類型的Fragment,同時(shí)這樣的F

這篇文章主要介紹了Android中ViewPager獲取當(dāng)前顯示的Fragment的兩種方法,一種是使用 getSupportFragmentManager().findFragmentByTag()方法,另一種是重寫適配器的 setPrimaryItem()方法,有需要的朋友可以參考借鑒,下面來一起看看吧。

前言

在項(xiàng)目中,有時(shí)會(huì)用到在ViewPager中顯示同樣類型的Fragment,同時(shí)這樣的Fragment的個(gè)數(shù)是動(dòng)態(tài)的,但是PagerAdapter沒有給我們提供getCurrentFragment類似的方法。下面就給大家介紹下Android中ViewPager獲取當(dāng)前顯示的Fragment的方法,一起看看吧。

一、使用 getSupportFragmentManager().findFragmentByTag()方法

Viewpager + FragmentPagerAdapter 情況下 才好使; FragmentPagerAdapter 有一個(gè)特點(diǎn) 凡是加載過的Fragment 都會(huì)被保留,既然Fragment不會(huì)被銷毀,那我們就可以使用findFragmentByTag() 方法找到它;但問題是動(dòng)態(tài)創(chuàng)建的話 tag的設(shè)置;我們知道動(dòng)態(tài)加載時(shí)是可以設(shè)置tag的,但是動(dòng)態(tài)創(chuàng)建就沒法設(shè)置了;如果viewpager使用的是適配器是 FragmentPagerAdapter 的話 ,F(xiàn)ragment就會(huì)被設(shè)置上tag 根據(jù)這個(gè)tag 我們就可以獲取到當(dāng)前顯示的fragment了;

下面看看這個(gè)過程

新創(chuàng)建時(shí) tag ==null

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

Log 查看 tag 時(shí)為 null

E/FileListPagerAdapter: ====getItem===新創(chuàng)建時(shí)的tag:==null   

將 適配器設(shè)置給Viewpager后 的tag

E/MainActivity: ==findCurrentFragment==pagerId:2131492976

E/MainActivity: ==findCurrentFragment==currentItem:0

E/MainActivity: =======findCurrentFragment=========完整Tag===android:switcher:2131492976:0

E/MainActivity: =======findCurrentFragment=========當(dāng)前顯示的Fragment 的tag===:android:switcher:2131492976:0

   

可以看到 tag的組成;四部分

android :      固定部分

switcher :      固定部分

2131492976 :      ViewPager 的id

0 :      ViewPager 當(dāng)前顯示的itemPostion

既然FragmentPagerAdapter的特點(diǎn)是保存fragment狀態(tài)。 就可以利用這個(gè)特點(diǎn)通過 findFragmentByTag()找到這個(gè)Fragment

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

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

這個(gè)方法在每次viewpager滑動(dòng)后都會(huì)被調(diào)用 而 object參數(shù)就是顯示的Fragment ;可以在適配器中定義個(gè)變量 currentFragment 每次改變時(shí)都會(huì)獲取到顯示的Fragment

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

這種方式有一個(gè)缺陷 setPrimaryItem()是在 viewpager的滑動(dòng)監(jiān)聽執(zhí)行完后才會(huì)調(diào)用的;所以在 換的個(gè)滑動(dòng)監(jiān)聽中獲取當(dāng)前顯示的Fragment 是不對(duì)的

更多關(guān)于Android中ViewPager獲取當(dāng)前顯示的Fragment請(qǐng)關(guān)注PHP中文網(wǎng)(ipnx.cn)其他文章!

Release Notes

Popular Entries