1

我剛開始開發Android平臺。對於我正在處理的應用程序,我正在使用具有以下.xml文件的活動來管理應用程序屬性。Android沒有持久性(空包)在片段

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="horizontal" 
    android:layout_width="match_parent" android:layout_height="match_parent"> 

    <fragment class="fr.berard.preference.ManagePreferenceActivity$PreferenceMenuFragment" 
      android:id="@+id/titles" android:layout_weight="20" 
      android:layout_width="0px" android:layout_height="match_parent" /> 

    <FrameLayout android:id="@+id/details" android:layout_weight="80" 
      android:layout_width="0px" android:layout_height="match_parent" 
      android:background="?android:attr/detailsElementBackground" /> 

</LinearLayout> 

當用戶選擇從PreferenceMenuFragment的元件,其細節片段通過以下行加載:

FragmentManager fragmentManager = getFragmentManager(); 
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
PreferenceFragment pdf = new CustomPreferenceFragment(); 
fragmentTransaction.replace(R.id.details, pdf); 
fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);  
fragmentTransaction.commit(); 

活性工作正常,問題是來自於持久性。我在擴展PreferenceFragment的類中實現了onSaveInstanceState()。

public final String WRONG_CARD_KEY = "wrong_card_value"; 

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 

    if (savedInstanceState != null) { 
     if (savedInstanceState.containsKey(WRONG_CARD_KEY)) { 
      Toast.makeText(this.getActivity(), " loaded", Toast.LENGTH_SHORT).show(); 
     } 
    } 
} 

@Override 
public void onSaveInstanceState(Bundle savedInstanceState) { 
    super.onSaveInstanceState(savedInstanceState); 

    savedInstanceState.putString(WRONG_CARD_KEY, "test"); 
    Toast.makeText(this.getActivity()," saved", Toast.LENGTH_SHORT).show(); 
} 

當我按Home按鈕時,調用onSaveInstanceState()方法。但是當我回到PreferenceFragment時,onActivityCreated()被調用,但是bundle仍然是空的。 我無法解釋爲什麼我放入onSaveInstanceState的信息沒有保存。也許我在實施我的片段時犯了一個錯誤,也許它是從我在主要活動中開始它的方式而來的。 我發現一些與ListFragment相同的問題,但沒有答案。

謝謝你的幫助。

回答

0

我認爲onSaveInstanceState調用是更多的先發制人的調用,以防碎片/活動隨後被銷燬(例如由操作系統回收內存)並需要系統恢復。由於你的片段沒有被破壞並重新創建,它不需要從保存的狀態中恢復自己。

+0

我的問題是,當我手動更改PreferenceFragment中的某個值(例如將摘要添加到首選項)時,當我回到首選項時,摘要消失。 – Jef2007 2012-01-13 10:10:26

+0

尚未使用PreferenceFragment,但可以將實例數據中的狀態(比如確保最新)保存在onDestroyView中,然後從onCreateView中的已保存狀態恢復片段... – PJL 2012-01-13 10:15:35