我有一个简单的应用程序,用户必须首先填写一些注册信息并登录。如果用户已登录,则在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
,要求我重新添加/重新创建片段吗?
答案 0 :(得分:1)
regFrag.setRetainInstance(true);
这告诉Android在主机活动因配置更改(例如旋转设备)而被销毁的情况下保留您的片段。将调用片段的onDestroyView()
和onDetach()
方法,但不会销毁片段(不会调用onDestroy()
)。
创建新主机活动后,将重新附加片段(attach()
)并再次调用onCreateView()
方法。
如果您希望将片段与主机活动一起销毁并重新创建,请不要调用retainInstance(true)
(默认情况下为假)。
我还应该说原始片段管理器与主机活动一起被销毁,但片段被传递给新的片段管理器并添加到它之前的相同容器中。这就是在调用onCreate()
方法时片段已经在布局中的原因。