我在使用 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
提交
取消