我在一个片段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();
}
}
答案 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,但它实际上是创建的,因此在该方法中进行调试,使其不会被错误调用。