Кэш 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())

Другие вопросы по тегам