我在使用 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/recreatingsavedInstanceState 始终为 nullAmog 许多其他帖子,当然还有 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);试图在实例状态中保存一个简单的布尔值(记住:这甚至不会运行):@Overridepublic void onSaveInstanceState(@NonNull Bundle outState) { super.onSaveInstanceState(outState); Log.e(TAG, "onSaveInstanceState: is map loaded? " + mapIsLoaded ); outState.putBoolean("mapIsLoaded", mapIsLoaded);}并尝试加载它:@Overridepublic 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);}我错过了什么?我显然不明白什么。为什么暂停应用程序时很难保持值?
2 回答
千巷猫影
TA贡献1829条经验 获得超7个赞
我建议根据架构组件使用ViewModel存储 MapView 层。如果这不是一个选项,您可以使用活动getLastNonConfigurationInstance手动存储和检索对象。
慕标5832272
TA贡献1966条经验 获得超4个赞
@Override
public void onPause() {
/**
* store your data
*/
super.onPause();
}
@Override
public void onResume() {
/**
* retrieve your data
*/
super.onResume();
}
添加回答
举报
0/150
提交
取消