Just one of the many issue with fragments.
In Activity.onCreate()
method I'm initializing a ViewPager
with two Fragments
in it.
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);
After that I need to perform an action on a View
in the second Fragment of the ViewPager.
((Fragment) adapter.getItem(1)).getView().findViewById(...)
But it gives NPE since the user never browse to the second fragment hence it was not attached yet. Accessing an element of the first Fragment in the same way gives no problems instead.
Shouldn't setOffscreenPageLimit(1)
method tell Android to render also the second Fragment?
I also tried not calling super method of destroyItem
inside the adapter, but no luck since the problem is that the fragment is not even initialized.
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) {}
}
How can I force it so also non visible fragment is rendered?
NOTE: this problem happens only sometimes to app users and I'm not able to reproduce it. Only once I had this problem, so I think it's all about performing the faulty operation after the correct lifecycle event.