我有几个用ViewPager
整理的片段。我在MainActivity的addOnPageChangeListener
方法的ViewPager
中添加了onCreate
,该方法给出了所选片段的位置。
即使我通过声明setOffscreenPageLimit
防止片段破坏自己,但我仍然没有弄清楚如何从MainActivity访问片段,因为仅使用findViewById
就可以返回空对象异常。
我想做什么:
我想访问片段的元素,例如布局和滚动视图,位于OnPageListener
的{{1}}中:
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.onPageChangeListener
,但这似乎不是一个好的选择。
我可以处理它们各自片段中的元素,但这是一个繁琐的过程,并且难以维护,这是我寻找一种同时处理它们的方法的原因。
我知道之前也曾问过类似的问题,但是我没有找到解决方案。
答案 0 :(得分:1)
不幸的是,唯一的“安全” 方法是检查FragmentPagerAdapter
的源代码,并查看添加了片段的tag
是什么,因为{ {1}}是从FragmentManager获取Fragment的唯一安全方法。
当然,我们需要希望该实现细节在支持库版本之间不会发生变化,但实际上多年来并未发生变化:)
无论如何,所以FragmentPagerAdapter说:
findFragmentByTag
那么 // 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
?
ViewId是id
,其中container.getId()
是container
本身。
ViewPager
是:id
,默认情况下是final long itemId = getItemId(position);
。
因此,您可以找到以下片段:
return position;