1

在我的应用程序中,我有一个 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 方法?谢谢!

4

2 回答 2

0

getFragmentManager.findFragmentByTag() // <<-- 如果您正在动态管理片段 getFragmentManager.findFragmentById() // <<-- 如果您在布局文件中使用 <fragment>。

于 2013-08-26T21:04:12.823 回答
0

我仍然不确定这一点,但我解决了调用instantiateItem(viewpager, position)以在给定位置获取片段的问题。如果我做对了,这个方法返回给定位置的片段(如果存在),如果不存在,它会创建另一个(我猜它调用getItem()

于 2013-08-27T09:17:59.673 回答