Android 我的适配器正在变空
我在活动中有一个viewpager。我是这样装的Android 我的适配器正在变空,android,android-fragments,android-viewpager,Android,Android Fragments,Android Viewpager,我在活动中有一个viewpager。我是这样装的 ArrayList<Fragment> arrayListFragment = new ArrayList<>(); Fragment first = Fragment.instantiate(MainActivity.this, MainActivityFragment.class.getName()); Fragment second = Fragment.instantiate(MainActivity.this,
ArrayList<Fragment> arrayListFragment = new ArrayList<>();
Fragment first = Fragment.instantiate(MainActivity.this, MainActivityFragment.class.getName());
Fragment second = Fragment.instantiate(MainActivity.this, SecondFragment.class.getName());
arrayListFragment.add(first);
arrayListFragment.add(second);
Log.d(TAG, "Pager created " + second);
mPagerAdapter = new SwipeScreenPagerAdapter(getSupportFragmentManager(),
arrayListFragment, pageTitles); //This is custom adapter
当我运行应用程序时,一切正常。有趣的事情发生在我把应用程序放在后台,然后在一段时间后恢复。重新启动活动并再次初始化viewpager,出于某种原因Log.d(标记“Pager created”+秒)代码>和Log.d(标签,“初始化适配器”+此)代码>语句使用不同的ID打印片段。它们在第一次运行时打印相同的id,但在我继续运行时不同。当在片段函数中使用时,mAdapter变为null(因为该函数是在从viewpager接收到的片段上调用的)
日志语句包括:
Pager created SecondFragment{269ef202}
Initialised adapter SecondFragment{298444fe #2 id=0x7f0e0084 android:switcher:2131624068:1}
从哪里创建这个新片段?起初我以为它是在以某种方式还原旧片段,但我尝试在onActivityCreate中传递null,如下所示:
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(null);
}
但是它仍然在创建单独的片段实例,并且它有不同的id。我解决了这个问题。当应用程序恢复时,activity正在还原调用中最后一次与其关联的片段
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
所以将null传递给super.onCreate(null)
会导致它避免恢复最后一个片段。在我的例子中,我需要创建片段的新副本,因为每次创建活动时都需要重新提取我的数据,所以小心地将其设置为null
我解决了问题。当应用程序恢复时,activity正在还原调用中最后一次与其关联的片段
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
所以将null传递给super.onCreate(null)
会导致它避免恢复最后一个片段。在我的例子中,我需要创建片段的新副本,因为每次创建活动时都需要重新蚀刻我的数据,所以小心地将其设置为null
是否有理由在视图上使用片段?是的。这是必要的。事实上,我有其他方法来实现我想做的事情,但我想了解为什么会发生这种情况。适配器是动态的,它们根据需要进行渲染和回收。当你推到后台时,适配器开始转储内容,因为它认为内容是不必要的,当你来到前台时会重新渲染。在初始化适配器之前,我检查了(mPagerAdapter==null),当我恢复应用时,执行此代码,这意味着我恢复应用时mPagerAdapter为null。所以除非我重新初始化它,否则它不能重新渲染。有理由在视图上使用片段吗?是的。这是必要的。事实上,我有其他方法来实现我想做的事情,但我想了解为什么会发生这种情况。适配器是动态的,它们根据需要进行渲染和回收。当你推到后台时,适配器开始转储内容,因为它认为内容是不必要的,当你来到前台时会重新渲染。在初始化适配器之前,我检查了(mPagerAdapter==null),当我恢复应用时,执行此代码,这意味着我恢复应用时mPagerAdapter为null。因此,除非我重新初始化它,否则它无法重新渲染。