[英]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.