为什么这个片段在方向改变后仍然显示?

时间:2015-11-15 17:34:20

标签: java android android-fragments

我有一个简单的应用程序,用户必须首先填写一些注册信息并登录。如果用户已登录,则在MainActivity启动时将显示不同的布局。这些天大多数应用程序都很标准。

为了适应这种情况,MainActivity的布局就是:

<RelativeLayout...>
    <android.support.v7.widget.Toolbar .../>
    <RelativeLayout
        android:id="@+id/fragment_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </RelativeLayout>
</RelativeLayout>  

我根据用户是否注册而交换片段,我似乎不明白活动的生命周期是如何工作的。

我的onCreate看起来像这样:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    fragmentContainer = (RelativeLayout) findViewById(R.id.fragment_container);
    mgr = getSupportFragmentManager();

    // ALWAYS INITIALIZE!
    PrefUtils.init(getApplicationContext());

    if( PrefUtils.readBoolean(KEY_REGISTRATION_COMPLETE,false) ){
        // if registration is complete:
        // TODO: add functionality
    }else{
        // if registration is not complete
        // we need to show the RegisterFragment
        // but first we need to see if we are here
        // because of an orientation change
        // we are avoiding recreating the fragment
        // so that we can show the previously saved state
        Fragment frag = mgr.findFragmentByTag(Fragments.REGISTER_FRAGMENT);
        FragmentTransaction ft = mgr.beginTransaction();
        if( frag != null ){
            // orientation has changed
            // nothing to do
            // fragment was already added previously
            Log.d("FRAG","reuse");
        }else{
            // we are here because the activity has just been created
            // we should create a new fragment
            RegisterFragment regFrag = RegisterFragment.newInstance();
            regFrag.setRetainInstance(true);
            ft.setCustomAnimations(R.anim.enter_from_bottom, R.anim.exit_to_bottom);
            ft.add(R.id.fragment_container, regFrag, Fragments.REGISTER_FRAGMENT);
            Log.d("FRAG", "new");
        }
        ft.commit();
    }
}  

如果方向更改意味着活动在被销毁后重新创建,为什么我的注册片段仍处于保存状态?我不应该销毁fragment_container,要求我重新添加/重新创建片段吗?

1 个答案:

答案 0 :(得分:1)

regFrag.setRetainInstance(true);

这告诉Android在主机活动因配置更改(例如旋转设备)而被销毁的情况下保留您的片段。将调用片段的onDestroyView()onDetach()方法,但不会销毁片段(不会调用onDestroy())。

创建新主机活动后,将重新附加片段(attach())并再次调用onCreateView()方法。

如果您希望将片段与主机活动一起销毁并重新创建,请不要调用retainInstance(true)(默认情况下为假)。

我还应该说原始片段管理器与主机活动一起被销毁,但片段被传递给新的片段管理器并添加到它之前的相同容器中。这就是在调用onCreate()方法时片段已经在布局中的原因。