我发现很多文章都解释了如何从savedInstanceState Bundle中获取Fragment,但是因为Activity可以在4个Fragments之间切换,所以我需要一种方法在方向开始改变时知道哪个Fragment是活动的。我有几个Fragments的原因是我正在使用Navigation Drawer,每个菜单项都作为一个Fragment。
我遇到了同样的问题,通过在导航抽屉活动代码中添加以下内容来解决:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if(savedInstanceState==null){
//Handle the initial fragment transaction
}
...
}
FragmentManager fM = getSupportFragmentManager();
fM.beginTransaction().replace(R.id.NavDrawContent,new home_fragment()).commit();
但我希望它只在(savedInstanceState == null)时执行,这样当我们在settings_fragment(例如)中更改手机方向时,它不会膨胀home_fragment。
因此,在导航抽屉活动OnCreate中的最终代码:
super.onCreate(savedInstanceState);
if(savedInstanceState==null){
FragmentManager fM = getSupportFragmentManager();
fM.beginTransaction().replace(R.id.NavDrawContent,new home_fragment()).commit();
}
onSaveInstanceState()
中保存片段的实例并在onCreate()
中进行恢复。@Override
public void onCreate(Bundle savedInstanceState) {
...
if (savedInstanceState != null) {
fragment = getSupportFragmentManager().getFragment(savedInstanceState, "KEY");
changeFragment(fragment, "MY TAG")
} else {
setupFragment();
}
...
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Fragment fragment = getSupportFragmentManager().findFragmentByTag("MY TAG");
if (fragment != null) {
getSupportFragmentManager().putFragment(outState, "KEY", fragment);
}
}
instanceof
进行检查,例如:if (fragment instanceof SettingsFragment) {
// ...
}
fragment.getClass().getSimpleName()
来获取类名。outState.putString("CLASS", fragment.getClass().getSimpleName());
- Jean Pimentel我找到了自己的答案,其实这是一件非常简单的事情。我在这里留下解决方案,供那些像我一样不熟悉安卓的人参考。
//current fragment
int fragment_id;
//make fragment selection available form the menu resource id
private void setFragment(MenuItem item) {
Fragment fragment = null;
fragment_id = item.getItemId();
switch (fragment_id) {
case R.id.nav_option_1:
fragment = MyFragment1.newInstance(true);
break;
...
//Set fragment
FragmentTransaction t = getSupportFragmentManager().beginTransaction();
t.replace(R.id.content_navigation, fragment);
t.commit();
}
item.setChecked(true);
}
private class DrawerItemClickListener implements NavigationView.OnNavigationItemSelectedListener {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
setFragment(item);
return false;
}
}
//save the state
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(SAVE_INSTANCE_FRAGMENT_KEY, fragmentid);
}
//restore the saved fragment on create
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_navigation);
///...
if (savedInstanceState != null) {
int fragment_id = savedInstanceState.getInt(SAVE_INSTANCE_FRAGMENT_KEY);
selectItem(mDrawerList.getMenu().findItem(fragment_id));
} else {
selectItem(mDrawerList.getMenu().findItem(R.id.home_fragment_id));
}
}
onPause()
之后调用isChangingConfigurations()
方法来查找是否正在发生配置更改。虽然不完全符合您的要求,但如果正在发生配置更改,则此方法将返回true,否则返回false,即Activity正在被销毁而不是重新创建。 - Mark