我正在使用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
有点延伸FragmentPagerAdapter
,TripListFragment
是ListFragment
。
这样可以正常工作,但是如果应用程序在长时间后被破坏,应用程序会在重新打开时崩溃。 ListFragment
直接从主Activity访问一些数据,但尚未加载数据。但是,在我将片段添加到OnCreate
中的适配器之前,数据会被加载。
我已经发现问题是super.OnCreate()
尝试在我的OnCreate
休息完成之前从内存重建片段。
问题是,我怎样才能阻止OnCreate
超级方法重新创建我的东西,让我以正确的方式做到这一点。我应该吗?让ListFragment
保留所需的数据会更合适吗?但是,如果我这样做,当我创建一个新的时,我不会在内存中的某个地方获得重复的片段吗?
答案 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中调用片段的特定方法的活动。