【问题标题】:Navigation in Navigation Drawer导航抽屉中的导航
【发布时间】:2015-12-15 09:03:31
【问题描述】:

我有一个Navigation Drawer,它有 5 个项目。 如果用户选择一个项目,我将在 FrameLayout 中加载相应的 Fragment 现在,如果用户拉出Navigation Drawer 并选择与之前相同的项目,我不应该再次加载相同的Fragment,所以我正在保存所选位置,如果之前选择的位置等于当前选择,我只是关闭Navigation Drawer如下:

    String title = null;
    invalidateOptionsMenu();
    android.support.v4.app.Fragment fragment = null;
    if (position == getPrevSelectedItem()) {
        // Already selected fragment is being displayed
    } else {
        switch (position) {
            case Numerics.ZERO:
                fragment = new DashBoardFragment();
                title = fragment.getClass().getSimpleName();
                break;
            case Numerics.ONE:
                break;
            case Numerics.TWO:
                break;
            case Numerics.THREE:
                break;
            case Numerics.FOUR:
                break;
            default:
                break;
        }
        if (fragment != null) {
            showFragment(fragment, title);
        }
        setSelectedItem(position);
    }

我通过添加到backstack 来添加片段,以便提供返回到前一个片段的导航,如下所示:

    if (fragment != null) {
        String backStateName = fragment.getClass().getName();
        mFragmentManager = getSupportFragmentManager();
        mFragmentTransaction = mFragmentManager.beginTransaction();
        mFragmentTransaction.replace(R.id.dashboard_container, fragment);
        mFragmentTransaction.addToBackStack(backStateName);
        mFragmentTransaction.commit();
    }

问题是: 如果我选择项目编号:3,然后选择项目:4,如果我返回之前的选择仍然是 4,但我显示Fragment 没有:3。因此,如果我再次从 Navigation Drawer 中选择 Item no:3,Fragment 将再次加载。这个怎么解决??

编辑:

public int getPrevSelectedItem() {
    return selectedItem;
}

public void setSelectedItem(int selectedItem) {
    this.selectedItem = selectedItem;
}

【问题讨论】:

  • 当您按下 back 时,drawer 不会得到 updated - 因此您需要在 activity 中向 onBackPressed() 添加一些代码,您可以根据弹出的位置更新位置BackstackEntry.

标签: android android-fragments navigation navigation-drawer hamburger-menu


【解决方案1】:

试试这个

Fragment currentFragment = getActivity().getFragmentManager().findFragmentById(R.id.dashboard_container);
if(currentFragment instanceof YouFragmentName)
    return

【讨论】:

  • 这是一个更好的主意,但我认为我的实现中缺少一个小逻辑。如果我找不到我的错误,添加它会更好。谢谢你:)
【解决方案2】:

您可以在单击菜单时检查加载片段的实例

Fragment loadedFragment= getFragmentManager().findFragmentById(R.id.fragmentLoadingSpace);

  if( !(loadedFragment instanceof  FragmentName1)){

// load fragment

        }

【讨论】:

  • 这是一个更好的主意,但我认为我的实现中缺少一个小逻辑。如果我找不到我的错误,添加它会更好。谢谢你:)
【解决方案3】:

我认为不需要else 声明,或者您可以使用else 仅用于关闭drawer

public int prevPosition=-1;    

if (getPrevSelectedItem() != prevPosition) {
        // Already selected fragment is being displayed
        prevPosition =getPrevSelectedItem();  
        callFragment(position);
 } 
private void callFragment(int position) {
    // TODO Auto-generated method stub
    switch (position) {
    case Numerics.ZERO:
        fragment = new DashBoardFragment();
        title = fragment.getClass().getSimpleName();
        break;
    case Numerics.ONE:
        break;
    case Numerics.TWO:
        break;
    case Numerics.THREE:
        break;
    case Numerics.FOUR:
        break;
    default:
        break;
    }
    if (fragment != null) {
        showFragment(fragment, title);
    }
    setSelectedItem(position);

}

【讨论】:

  • 如果我接下来选择 2,我会选择 3。如果我仍然按下 getPrevSelectedItem() 给我 3,但当前位置将是 2。所以您的代码将加载项目编号:2 fragment再次
  • 发帖getPrevSelectedItem
  • 所以您只是告诉我再添加一个变量以将一项保存回之前的fragment。如果超过 2 会发生什么??
  • 你实现了修改后的代码吗?你的getPrevSelectedItem 会给你选择的位置不是以前的
【解决方案4】:

来自我的评论:

当您按下back 时,drawer 不会更新 - 因此您需要在activity 中向onBackPressed() 添加一些代码,根据弹出的BackstackEntry 更新position

@Override
public void onBackPressed(){

    String backStackEntryName = fragmentManager.getBackStackEntryAt(backCount - 2).getName(); 
     int id =  R.id.my_main_frag; //default option
     if (MyMainFrag.class.getName().equals(backStackEntryName)){
         id =  R.id.my_main_frag;
         selectedItem = 0;
     } else if (MySecondFrag.class.getName().equals(backStackEntryName)){
         id = R.id.my_second_frag;
         selectedItem = 1;
     }
      ...

     navigation.setCheckedItem(id);
     super.onBackPressed();
}

【讨论】:

  • 如果我被否决,我将不胜感激,因此我可以改进我的答案或查看我的错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-20
  • 1970-01-01
  • 2021-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多