FragmentStatePageAdapter 缓存,重新创建活动后如何引用旧片段? (对于前 - 横向模式)
Posted
技术标签:
【中文标题】FragmentStatePageAdapter 缓存,重新创建活动后如何引用旧片段? (对于前 - 横向模式)【英文标题】:FragmentStatePageAdapter cache, how do I reference old fragments after activity recreated? (for ex - landscape mode) 【发布时间】:2013-08-26 18:14:23 【问题描述】:在我的应用程序中,我有一个 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方法? 谢谢!
【问题讨论】:
【参考方案1】:getFragmentManager.findFragmentByTag() // 。
【讨论】:
谢谢,顺便说一下,正如您在我的 getItem 方法中看到的那样,我没有使用事务,所以我没有分配标签。我在网上找到了这个方法:public Fragment findFragmentByPosition(int position) FragmentPagerAdapter fragmentPagerAdapter = getFragmentPagerAdapter(); return getSupportFragmentManager().findFragmentByTag( "android:switcher:" + getViewPager().getId() + ":" + fragmentPagerAdapter.getItemId(position));
但是 fragmentstatepageradapter 没有 getItemId(position) 方法,那我怎么能设法通过标签找到片段呢?【参考方案2】:
我仍然不确定这一点,但我解决了调用instantiateItem(viewpager, position)
以在给定位置获取片段的问题。如果我做对了,这个方法会返回给定位置的片段(如果存在),如果不存在,它会创建另一个片段(我猜它调用getItem()
)
【讨论】:
以上是关于FragmentStatePageAdapter 缓存,重新创建活动后如何引用旧片段? (对于前 - 横向模式)的主要内容,如果未能解决你的问题,请参考以下文章