Mig*_*Slv 6 android android-fragments android-activity navigation-drawer fragmentmanager
我发现很多帖子解释了如何Fragment从savedInstanceState Bundle但是,因为Activity可以在 4 之间交换,所以当方向开始改变时Fragments,我需要一种方法来知道哪个 Fragment在旋转之前是活动的。
我有几个 Fragment 的原因是因为我使用的是 Navigation Drawer,所以每个菜单项都是一个 Fragment。
小智 7
我遇到了同样的问题,我修复了它,将它添加到导航抽屉活动代码中:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if(savedInstanceState==null){
//Handle the initial fragment transaction
}
...
}
Run Code Online (Sandbox Code Playgroud)
例如,我有一个带有“主页”、“设置”和“关于”作为菜单项的导航抽屉,每个菜单项都有一个片段“home_fragment”、“settings_fragment”和“about_fragment”。
如果我希望在导航抽屉活动启动时出现“home_fragment”,我会在 OnCreate 函数上使用以下代码:
FragmentManager fM = getSupportFragmentManager();
fM.beginTransaction().replace(R.id.NavDrawContent,new home_fragment()).commit();
Run Code Online (Sandbox Code Playgroud)
但我希望它仅在 (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();
}
Run Code Online (Sandbox Code Playgroud)
Mig*_*Slv -1
找到了我自己的答案,毕竟这是一件非常简单的事情。我把解决方案留在这里给那些不熟悉android的人,比如我。
//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));
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5112 次 |
| 最近记录: |