[英]How to prevent pendingintent from recreating an activity if launchmode set to 'singleTop'?
[英]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
有点扩展FragmentPagerAdapter
和TripListFragment
是一个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.