Fragment中的Android没有持久性(null Bundle)

时间:2012-01-11 17:12:49

标签: android persistence bundle android-fragments android-preferences

我刚开始为Android平台开发。对于我正在处理的应用程序,我正在使用带有以下.xml文件的活动来管理应用程序属性。

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

活动正常,问题来自持久性。我在ExtendFragment的类中实现了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();
}

当我按下主页按钮时,会调用onSaveInstanceState()方法。但是当我回到PreferenceFragment时,会调用onActivityCreated(),但是bundle仍然是null。 我无法解释为什么我保存在onSaveInstanceState中的信息不会被保存。也许我在实现我的片段时犯了一个错误,也许它是从我在主要活动中启动它的方式来的。 我发现一些帖子与ListFragment有相同的问题,但没有答案。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我认为onSaveInstanceState调用更多是先发制人的调用,以防片段/活动随后被破坏(例如通过OS回收内存)并且需要由系统恢复。由于您的片段未被销毁和重新创建,因此无需从已保存的状态恢复自身。