1

Я только начал разрабатывать платформу для Android. Для приложения, над которым я работаю, я использую действие со следующим .xml-файлом, чтобы управлять свойствами приложения.Android no persistence (null Bundle) в Fragment

<?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(); 

Активности работает отлично, проблема исходит от упорства. Я реализовал onSaveInstanceState() в расширении класса PreferenceFragment.

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(); 
} 

Когда при нажатии кнопки «домой» вызывается метод onSaveInstanceState(). Но когда я возвращаюсь к PreferenceFragment, вызывается onActivityCreated(), но пакет по-прежнему равен нулю. Я не могу объяснить, почему данные, которые я вставляю onSaveInstanceState, не сохраняются. Может быть, я допустил ошибку при реализации моего Фрагмента, возможно, это происходит от того, как я начинаю его в основном действии. Я нашел несколько сообщений с той же проблемой с ListFragment, но без ответа.

Благодарим за помощь.

ответ

0

Я думаю, что вызов onSaveInstanceState является скорее упреждающим вызовом, если фрагмент/действие впоследствии уничтожается (скажем, память восстановления ОС) и нуждается в восстановлении системой. Поскольку ваш фрагмент не уничтожается и не воссоздается, ему не нужно восстанавливать себя из сохраненного состояния.

+0

Моя проблема в том, что я вручную изменяю значение в PreferenceFragment (например, добавляя резюме к предпочтению), когда я возвращаюсь к предпочтениям, сводка исчезает. – Jef2007

+0

Не использовали PreferenceFragment, но вы можете сохранить состояние в данных экземпляра (например, обеспечить актуальность) в onDestroyView, а затем восстановить фрагмент из сохраненного состояния в onCreateView ... – PJL