在onSaveInstanceState

时间:2016-01-25 20:54:19

标签: android android-fragments

我有一个Activity启动片段。我打开导航抽屉并转到同一个活动中的第二个片段。我旋转设备而不是留在第二个片段上,我带回了第一个片段。如何保存当前的片段,以便在活动被销毁时打开相应的片段?这是我尝试过的但是没有用。这是我的活动:

private FragmentTransaction ft;
private Fragment fragment;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home_page);

    if (findViewById(R.id.fragment_container) != null) {
        if (savedInstanceState != null) {

            fragment = getFragmentManager().getFragment(savedInstanceState,"currentFrag");
            ft.replace(R.id.fragment_container, fragment);
            ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
            ft.commit();
        }else{
            fragment = new HomeFragment();
            // In case this activity was started with special instructions from an
            // Intent, pass the Intent's extras to the fragment as arguments
            fragment.setArguments(getIntent().getExtras());

            // Add the fragment to the 'fragment_container' FrameLayout
            getFragmentManager().beginTransaction()
                    .add(R.id.fragment_container, fragment).commit();
        }
    }

.....

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    getFragmentManager().putFragment(outState, "currentFrag", fragment);
}

这是我的日志猫中的例外

java.lang.NullPointerException: Attempt to invoke virtual method 'android.app.FragmentTransaction android.app.FragmentTransaction.replace(int, android.app.Fragment)' on a null object reference

显然,目前的片段并未被保存。这通常是解决这个问题的正确方法吗?

这个问题与对NullPointerException的一般理解无关,而是与屏幕旋转时如何保持Fragment状态无关。

2 个答案:

答案 0 :(得分:1)

在片段构造函数中,添加以下行:

 setRetainInstance(true);
  

控制是否在Activity中保留片段实例   重新创建(例如从配置更改)。

答案 1 :(得分:0)

对不起,我不知道你在哪里初始化FragmentTransaction。 也许你错过了这个:

fragment = getFragmentManager().getFragment(savedInstanceState,"currentFrag");
ft = getFragmentManager().beginTransaction();
ft.replace(R.id.fragment_container, fragment);