如何防止Activity重新创建片段

时间:2016-10-18 14:48:53

标签: android

我正在使用FragmentPagerAdapter在我的主要Application类的ListFragment中显示OnCreate()。简单地:

    viewPager = (ViewPager) findViewById(R.id.viewpager);


    ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
    adapter.addFragment(new TripListFragment(), "Reissulista");
    viewPager.setAdapter(adapter);

    tabLayout = (TabLayout) findViewById(R.id.tabs);
    tabLayout.setupWithViewPager(viewPager);

ViewPagerAdapter有点延伸FragmentPagerAdapterTripListFragmentListFragment

这样可以正常工作,但是如果应用程序在长时间后被破坏,应用程序会在重新打开时崩溃。 ListFragment直接从主Activity访问一些数据,但尚未加载数据。但是,在我将片段添加到OnCreate中的适配器之前,数据会被加载。

我已经发现问题是super.OnCreate()尝试在我的OnCreate休息完成之前从内存重建片段。

问题是,我怎样才能阻止OnCreate超级方法重新创建我的东西,让我以正确的方式做到这一点。我应该吗?让ListFragment保留所需的数据会更合适吗?但是,如果我这样做,当我创建一个新的时,我不会在内存中的某个地方获得重复的片段吗?

4 个答案:

答案 0 :(得分:1)

  

“ListFragment直接从主Activity访问一些数据,但尚未加载数据。”

这听起来像是一个问题 - 在你知道它之前你不应该加载数据。我会用听众或其他东西来做这件事。也许在您的活动中,如果您正在运行AsyncTask来加载数据,您可以告诉Fragment显示如下:

 protected void onPostExecute(String result) {
     //TODO: Implement your own way
     ((MyFragment)getFragment()).displayData(result);
 }

显然这是一个非常广泛的解释,需要针对您的问题进行自定义,但是如果您可以等到显示数据,直到您可以确保它存在,那么您不应该崩溃。

答案 1 :(得分:0)

您需要重新设计设计,以便在需要满足活动和片段的生命周期方法限制时访问数据。

答案 2 :(得分:0)

我所做的是更改我的ViewPagerAdapter实现,以便不会在每个oncreate上重新创建片段。我之前有一个基于列表的实现,现在我依赖于更常见的实现,其中片段是在getItem()上生成的(如果尚不存在)。

在数据创建之后移动super.oncreate()解决数据解决之前重建片段的问题。

答案 3 :(得分:0)

您可以在片段中使用setRetainInstance:

Class MyFragment extends Fragment {

   public MyFragment() {
       setRetainInstance(true);
   }

}

请注意,这解决了重新创建片段的问题,仍然会根据生命周期重新创建活动。但是,您已在片段内引用的数据仍将存在。你不应该直接连接片段和活动,我建议在onResume和/或onPause或onDestroy中调用片段的特定方法的活动。

相关问题