在我的应用程序中,我有3个碎片。假设fragment1,fragment2和Fragment3。这三个片段托管在单个活动上。有一个导航抽屉可用于导航每个片段。和Fragment1是默认片段,即,Fragment1在应用程序启动时可见。问题是当手机的方向改变时,当前可见片段熄灭并且默认片段显示,因为活动重新开始。我在bundle中保留了当前可见片段标记的标记,并检查onCreate方法。但是我不能用标签创建相应片段的Fragment对象。
的onCreate
if (savedInstanceState == null) {
mFragment = new Fragment1();
showFragment(mFragment, FRAGMENT1_TAG);
} else {
String tag = savedInstanceState.getString(CURRENT_FRAGMENT_TAG);
mFragment = mFragmentManager.findFragmentByTag(tag);
if (mFragment != null)
mFragmentManager.beginTransaction().replace(R.id.content_frame, mFragment, tag).commit();
else
Toast.makeText(getBaseContext(), "Something went wrong, please restart application", Toast.LENGTH_SHORT).show();
}
的onSaveInstanceState
String fragmentTag = mFragmentManager.findFragmentById(R.id.content_frame).getTag();
dataOut.putString(CURRENT_FRAGMENT_TAG, fragmentTag);
当方向改变时我得到一个空指针异常,即mFragment为null,我该怎么解决这个
更新
public static void showFragment(Fragment fragment, String tag) {
mFragmentTag = tag;
FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.content_frame, fragment, mFragmentTag);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
}
答案 0 :(得分:2)
将片段的类名保留在Bundle中。
然后使用静态方法instantiate重新创建具有类名称的Fragment。
String name = savedInstanceState.getString(CURRENT_FRAGMENT_TAG);
Fragment fragment = Fragment.instantiate (Activity.this, "com.example." + name);
该方法需要全名(包括包)。
答案 1 :(得分:-1)
最简单的方法是通过设置阻止活动重新创建
您的清单文件中的android:configChanges="screenSize|orientation"
。
覆盖 onSaveInstanceState 方法时需要致电:super.onSaveInstanceState(outState);