只是片段的许多问题之一。 在Activity.onCreate()
方法中,我正在初始化一个ViewPager
,其中有两个Fragments
。ViewPager的第二个片段尚未实例化
viewPager = (ViewPager) findViewById(R.id.viewpager);
viewPager.setOffscreenPageLimit(1);
adapter = new ViewPagerAdapter(getSupportFragmentManager());
adapter.addFragment(new AutoFragment(), getString(R.string.song_header_automatic));
adapter.addFragment(new ManualFragment(), getString(R.string.song_header_manual));
adapter.notifyDataSetChanged();
viewPager.setAdapter(adapter);
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
tabLayout.setupWithViewPager(viewPager);
之后,我需要在ViewPager的第二个片段中的View
上执行一个操作。
((Fragment) adapter.getItem(1)).getView().findViewById(...)
但它提供了NPE,因为用户从不浏览到第二个片段,因此它尚未连接。以相同的方式访问第一个片段的元素不会产生任何问题。
不应该setOffscreenPageLimit(1)
方法告诉Android也渲染第二个片段?
我也试过在适配器里面没有调用destroyItem
的超级方法,但没有运气,因为问题是片段甚至没有初始化。
public class ViewPagerAdapter extends FragmentStatePagerAdapter {
private final List<Fragment> mFragmentList = new ArrayList<>();
private final List<String> mFragmentTitleList = new ArrayList<>();
public ViewPagerAdapter(FragmentManager manager) {
super(manager);
}
@Override
public Fragment getItem(int position) {
return mFragmentList.get(position);
}
@Override
public int getCount() {
return mFragmentList.size();
}
public void addFragment(Fragment fragment, String title) {
mFragmentList.add(fragment);
mFragmentTitleList.add(title);
}
@Override
public CharSequence getPageTitle(int position) {
return mFragmentTitleList.get(position);
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {}
}
我该如何强制它,以便不可见的片段被渲染?
注意:这个问题只发生在应用程序用户,我无法重现它。我只有一次遇到这个问题,所以我认为这是关于在正确的生命周期事件之后执行错误的操作。
只是尝试使用'FragmentPagerAdapter'而不是'FragmentStatePagerAdapter' –
@EduardoHerzer任何想法,为什么这应该解决这个问题? – fillobotto
查看答案...太久无法做评论 –