如何正确处理片段的onSaveInstanceState?

时间:2014-07-15 07:08:51

标签: android android-activity android-fragments bundle android-lifecycle

我在一个片段onSaveInstanceState中有一个OwnershipFragment方法,定义为:

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

    for(int i = 0; i <mDirectors.size(); i++)
        mDirectors.get(i).updateFromForm();

    outState.putSerializable(DIRECTORS, mDirectors);
}

但是,当我回到上一个片段HomeFragment时,OwnershipFragment会被放在后台,但如果我转动手机/更改方向,onSaveInstanceState OwnershipFragment仍然会调用1}}。

问题是,自从onSaveInstanceState调用OwnershipFragment后,我在nullpointerexception上获得了mDirectors,因为它从未初始化,因为OwnershipFragment从未{调用{1}}(看到它在后面的堆栈中)。

那我该如何正确处理呢?

我猜我必须在运行片段事务的Activity中实现onCreateView,但我不知道该怎么做。

这是在onSaveInstanceState中替换片段的方法:

HomeActivity

这是我的logcat:

public void displayView(int position) {

    Fragment fragment = null;

    switch (position) {

    case HOME:
        fragment = new HomeFragment();
        break;

    case OWNERSHIP:
        fragment = new OwnershipFragment();
        break;

    }
        //Replace fragment
        FragmentTransaction ft = mManager.beginTransaction();
        ft.replace(R.id.home_container, fragment, FRAGMENT_TAG);
        ft.addToBackStack(null).commit();
    }
}

1 个答案:

答案 0 :(得分:0)

您是否创建了OwnershipFragment但从未附加到窗口?如果您从support.Fragment扩展,则可以覆盖 setUserVisibleHint()方法,以检查您的片段是否真的对用户可见。

public class OwnershipFragment extend android.support.v4.app.Fragment {
    ...
    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        if (isVisibleToUser) {
            System.out.println("VISIBLE");
        } else {
            System.out.println("GONE");
        }
    }
    ...
}

我认为你用差异位置两次调用displayView(),因此你无法看到OwnershipFragment,但它实际上是创建的,因此在该方法中进行调试,使其不会被错误调用。