Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/215.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 我的适配器正在变空_Android_Android Fragments_Android Viewpager - Fatal编程技术网

Android 我的适配器正在变空

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,

我在活动中有一个viewpager。我是这样装的

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。因此,除非我重新初始化它,否则它无法重新渲染。