由于导航抽屉活动中的方向更改而导致活动重新启动时如何保持相同的片段

Mig*_*Slv 6 android android-fragments android-activity navigation-drawer fragmentmanager

我发现很多帖子解释了如何FragmentsavedInstanceState 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)