[英]How to get elements of fragments created by ViewPager in MainActivity?
我有幾個用ViewPager
組織的ViewPager
。 我在MainActivity的onCreate
方法中將ViewPager
添加到addOnPageChangeListener
,該方法給出了所選片段的位置。
即使我通過聲明setOffscreenPageLimit
防止片段破壞自身,我仍然沒有弄清楚如何從MainActivity訪問片段,因為僅使用findViewById
返回空對象異常。
我想做的事:
我想在OnPageListener
的ViewPager
訪問片段的元素,例如布局和滾動ViewPager
:
mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageSelected(int i) {
if(i == 0) {
// Do something with the first fragment.
} else if(i == 1) {
// Do something with the second fragment.
}
}
}
ViewPager
使用FragmentPagerAdapter
:
public class SectionsPagerAdapter extends FragmentPagerAdapter {
public SectionsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
return Fragment1.newInstance(position);
case 1:
return Fragment2.newInstance(position);
case 2:
return Fragment3.newInstance(position);
case 3:
return Fragment4.newInstance(position);
default:
throw new IllegalArgumentException();
}
}
@Override
public int getCount() {
return 4;
}
}
像這樣添加:
mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
mViewPager.setAdapter(mSectionsPagerAdapter);
〜
還是應該改變我的方法?
如果使用此設計無法訪問片段,那么什么是有效的替代途徑?
我嘗試在自定義ViewPager
實現ViewPager.onPageChangeListener
,但這似乎不是一個好選擇。
我可以處理它們各自片段中的元素,但這是一個繁瑣的過程,並且很難維護,這就是我尋找一種同時處理它們的方法的原因。
我知道以前曾問過類似的問題,但我沒有找到解決方案。
不幸的是,唯一的“安全”方法是檢查FragmentPagerAdapter
的源代碼,並查看該片段添加了什么tag
-因為findFragmentByTag
是從FragmentManager獲取片段的唯一安全方法。
當然,我們需要希望實現細節在支持庫版本之間不會改變,但實際上多年來沒有改變:)
無論如何,所以FragmentPagerAdapter說:
// Do we already have this fragment? String name = makeFragmentName(container.getId(), itemId); Fragment fragment = mFragmentManager.findFragmentByTag(name);
那name
什么呢?
private static String makeFragmentName(int viewId, long id) { return "android:switcher:" + viewId + ":" + id; }
什么是viewId
,什么是id
?
ViewId是container.getId()
,其中container
是ViewPager
本身。
id
是: final long itemId = getItemId(position);
默認情況下是return position;
。
因此,您可以找到片段,如下所示:
Fragment fragment = fragmentManager.findFragmentByTag("android:switcher:" + viewPager.getId() + ":" + fragmentPosition);
// if fragment is null, it was not created yet by ViewPager
注意:
值得注意的是,您不應該依賴getItem(int position) {
返回傳入的片段實例 ,因為那樣會導致此問題 。 (此問題正確執行, getItem()
方法必須始終返回新的Fragment實例。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.