2012-11-23 35 views
3

我想要做的就是調用我的片段類的函數。但我似乎無法找到一種方法來訪問ViewPager中的碎片實例。在ViewPager中的片段上調用方法

我活動的XML:(?可我)

<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/pager" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context=".MainActivity" /> 

沒有,所以我不能叫findFragmentById() 也我不知道該怎麼給findFragmentByTag(),它總是返回null:/

回答

6

的pagerAdapter.getItem(INT )方法通常會創建片段的新實例,但是,您可以使用HashMap來存儲對已存在片段的引用。

// ViewPagerAdapter 
private HashMap<Integer, Fragment> fragmentHashMap = new HashMap<>(); 

@Override 
public Fragment getItem(int position) { 
    if (fragmentHashMap.get(position) != null) { 
     return fragmentHashMap.get(position); 
    } 
    TabFragment tabFragment = new TabFragment(); 
    fragmentHashMap.put(position, tabFragment); 
    return recipeTabFragment; 
} 

然後你可以找到你的片段調用它的方法:

FragmentAdapter fa = (FragmentAdapter)viewPager.getAdapter(); 
MyFragment f = (MyFragment)fa.getItem(index); 
f.myMethod(Object obj); 

您必須跟蹤哪些片段與哪個指標,因爲你爲了扮演他們自己的具體類來訪問方法。

2

ViewPager應該有一個與之關聯的FragmentAdapter。所以,你可以這樣做:

FragmentAdapter fa = (FragmentAdapter)viewPager.getAdapter(); 
Fragment f = fa.getItem(index); 
+1

是的,但getItem創建了一個不是我想要的新實例。除非我應該照顧創建一次,然後在隨後的調用中返回相同的實例?但我不確定這是正確的做法 – foke

+0

viewPagers不會自己做垃圾回收,所以你應該回收你的碎片。請參閱片段尋呼機適配器(http://developer.android.com/reference/android/support/v4/app/FragmentPagerAdapter.html)如果您想要自我GCing尋呼機 –

+0

不要使用getItem(),因爲它會創建一個新的你的片段的實例。請參閱下面的答案。 –