Кэш FragmentStatePageAdapter, как я могу ссылаться на старые фрагменты после воссоздания активности? (для экс - ландшафтного режима)
В моем приложении я получил ViewPager, который показывает 3 фрагмента в разметке пролистывания. Если действие воссоздается (например, если я перехожу в альбомный режим), я больше не могу получить ссылку на фрагменты.
Это мой адаптер
public class TabsPagerAdapter extends FragmentStatePagerAdapter{
public static final String FRAGMENT_MAP = "fragmentMap";
private SparseArray<MyFragment> myFragmentMap = new SparseArray<MyFragment>();
public TabsPagerAdapter(FragmentManager fm){
super(fm);
}
@Override
public Fragment getItem(int arg0) {
MyFragment fragment = new MyFragment();
Bundle args = new Bundle();
String nameOfTab = actionBar.getTabAt(arg0).getText().toString();
ArrayList<VideoBookmark> listOfFragment = myBookmarkManager.getList(nameOfTab);
args.putParcelableArrayList(MyFragment.ARG_LIST, listOfFragment);
fragment.setArguments(args);
myFragmentMap.put(arg0, fragment);
return fragment;
}
@Override
//return mytabs.size()???
public int getCount() {
return NUM_OF_TABS;
}
public void destroyItem (ViewGroup container, int position, Object object) {
super.destroyItem(container, position, object);
myFragmentMap.remove(position);
}
public Fragment getFragment(int key) {
return myFragmentMap.get(key);
}
public SparseArray<MyFragment> getFragmentMap(){
return myFragmentMap;
}
public void setNewFragmentMap(SparseArray<MyFragment> newMap){
myFragmentMap = newMap;
}
}
Я получаю исключение нулевого указателя в этой строке
//get current fragment
int index = myViewPager.getCurrentItem();
Fragment fragment = myTabsPagerAdapter.getFragment(index);
EditText title = (EditText) fragment.getView().findViewById(R.id.new_title);
Я проверил, это происходит потому, что метод getItem не вызывается, поэтому я предполагаю, что адаптер каким-то образом повторно использует старые фрагменты, но как я могу получить доступ к этому кешу фрагментов, чтобы получить мои старые фрагменты и иметь возможность использовать метод findViewById? Спасибо!
2 ответа
getFragmentManager.findFragmentByTag() // << - если вы динамически управляете фрагментами getFragmentManager.findFragmentById () // << - если вы используете <фрагмент> в файле макета.
Я до сих пор не уверен в этом, но я решил позвонить instantiateItem(viewpager, position)
получить фрагмент в заданной позиции. Если я правильно понял, этот метод возвращает фрагмент в заданной позиции, если он существует, если нет, он создает другой (я предполагаю, что он вызывает getItem()
)