我有一个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状态无关。
答案 0 :(得分:1)
在片段构造函数中,添加以下行:
setRetainInstance(true);
控制是否在Activity中保留片段实例 重新创建(例如从配置更改)。
答案 1 :(得分:0)
对不起,我不知道你在哪里初始化FragmentTransaction。 也许你错过了这个:
fragment = getFragmentManager().getFragment(savedInstanceState,"currentFrag");
ft = getFragmentManager().beginTransaction();
ft.replace(R.id.fragment_container, fragment);