定位改变后保留当前可见片段

时间:2015-07-22 08:19:47

标签: android android-fragments android-orientation

在我的应用程序中,我有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();
    }

2 个答案:

答案 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);