我在使用 Android Fragments 时遇到了很多麻烦,我不知道为什么。
每当我暂停应用程序(onPause())时,我都想在内存中保留一个对象。
我有一个带有一些图层的 MapView。而且我想保留这些图层,这样每当我暂停和恢复应用程序时,地图就不必从头开始重新加载和重新创建它们。
问题是,我无法使用 onSaveInstanceState() 保存它们。它们是对象,而不是基元。它们也来自一个库,所以我不能让它们实现 Serializable 或 Parcelable。
我想在不诉诸于以下的情况下找到解决方案:
android:configChanges="orientation|screenSize">
到我的活动,因为它被认为是不好的做法。此外,它不适用于暂停和恢复应用程序时。
我也试过
this.setRetainInstance(true); // retain this fragment
在我的片段的 onCreate() 上,但我也想避免它。无论如何都行不通。
经过多次试验、错误和测试,我发现我的片段的 onSaveInstanceState() 甚至没有运行。每当我暂停和恢复应用程序时,我什至无法保留一个简单的布尔值。
我读:
使用 Save Instance State 保存 Android Activity 状态
https://developer.android.com/training/basics/activity-lifecycle/recreating
savedInstanceState 始终为 null
Amog 许多其他帖子,当然还有 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);
}
我错过了什么?我显然不明白什么。为什么暂停应用程序时很难保持值?
千巷猫影
慕标5832272
相关分类