我在Android片段上遇到了很多麻烦,我不知道为什么。
每当我暂停应用程序(onPause())时,我都希望将一个对象保存在内存中。
我有一个包含一些层的MapView。我想保留这些图层,这样地图就不需要从头开始重新加载,每当我暂停并恢复应用程序时就重新创建它们。
问题是,我不能用onSaveInstanceState()来保存它们。它们是对象,而不是原语。它们也来自库,所以我不能让它们实现可序列化或可Parcelable。
我想找出一种解决办法,而不诉诸:
android:configChanges="orientation|screenSize">对我的活动,因为这被认为是不好的做法。而且,当您暂停并继续应用程序时,它也不起作用。
我也试过
this.setRetainInstance(true); // retain this fragment在我的片段的onCreate()上,但是我也想避免它。反正也没用。
经过多次试验、错误和测试,我发现我的片段的onSaveInstanceState()甚至没有运行。我甚至不能保持一个简单的布尔每当我暂停并继续应用程序。
我读到:
https://developer.android.com/training/basics/activity-lifecycle/recreating
很多其他的帖子,当然还有Android文档。
我的一些代码:
创建片段:
navFragment = FragNavigation.newInstance(); // keeping the reference to the navFragment
// setting up the viewpager
ViewPager viewPager = findViewById(R.id.vpMainViewPager);
MainPagerAdapter mainAdapter = new MainPagerAdapter(getSupportFragmentManager(), this);
mainAdapter.addFragment(navFragment);
viewPager.setAdapter(mainAdapter);试图在实例状态保存一个简单的布尔值(记住:这甚至没有运行):
@Override
public void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
Log.e(TAG, "onSaveInstanceState: is map loaded? " + mapIsLoaded );
outState.putBoolean("mapIsLoaded", mapIsLoaded);
}并试图装载它:
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setRetainInstance(true); // retain this fragment
Log.e(TAG, "onCreate: null? " + (savedInstanceState == null) );
if (savedInstanceState != null)
mapIsLoaded = savedInstanceState.getBoolean("mapIsLoaded", false);
}我遗漏了什么?很明显我不明白什么。为什么当你暂停应用程序时很难保留价值呢?
发布于 2018-09-19 14:30:20
我建议按照架构组件使用一个MapView层来存储ViewModel层。如果这不是一个选项,则可以使用活动getLastNonConfigurationInstance手动存储和检索对象。
发布于 2018-09-19 14:11:31
@Override
public void onPause() {
/**
* store your data
*/
super.onPause();
}
@Override
public void onResume() {
/**
* retrieve your data
*/
super.onResume();
}https://stackoverflow.com/questions/52405345
复制相似问题