繁体   English   中英

如何防止 Activity 重新创建片段

[英]How to prevent Activity from recreating fragments

我正在使用FragmentPagerAdapter在我的主应用程序类的OnCreate()中显示ListFragment 简单地:

    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有点扩展FragmentPagerAdapterTripListFragment是一个ListFragment

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

我发现问题是super.OnCreate()试图在我的OnCreate其余部分完成之前从内存中重建片段。

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

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

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

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

显然,这是一个非常广泛的解释,需要根据您的问题进行定制,但是如果您可以等到可以确保数据存在时才显示数据,那么您就不应该发生崩溃。

您需要重新设计您的设计,以便您可以在需要在活动和片段的生命周期方法的约束内访问数据。

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

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

您可以在片段中使用 setRetainInstance:

Class MyFragment extends Fragment {

   public MyFragment() {
       setRetainInstance(true);
   }

}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM