【问题标题】:How to Android Navigation drawer exits on Back Button press如何在按下后退按钮时退出 Android 导航抽屉
【发布时间】:2015-05-10 06:46:34
【问题描述】:

我发现之前问过类似的问题并尝试了一些;但不适合我。

我有一个主要活动,布局中有一个片段容器。我有 3 个片段将根据抽屉式导航选择替换为片段容器。我正在将所有交易添加到后台堆栈。

我想将带有 Tracker 片段的活动设置为主屏幕,这样当用户按下返回按钮时,他应该转到第一个片段。如果他已经在第一个片段中,则应用程序应该退出。

这是我的代码:

@Override
public void onNavigationDrawerItemSelected(int position) {
    // update the main content by replacing fragments
    fragmentManager = getFragmentManager();
    Fragment fragment;
    switch (position){
        case 0:
            fragment = TrackerFragment.newInstance(position);
            break;

        case 1:
            fragment = CalendarViewFragment.newInstance(position);
            break;
        case 2:
            fragment = SettingsFragment.newInstance(position);

            break;
        default:
            fragment = TrackerFragment.newInstance(position);
    }

    fragmentManager.beginTransaction()
            .replace(R.id.container, fragment).addToBackStack(null)
            .commit();

}

我不确定如何在 OnBackPressed 方法上处理这种情况。我应该做什么逻辑。有没有什么方法可以在不添加回栈的情况下做到这一点? 非常感谢任何帮助! 谢谢1

【问题讨论】:

    标签: android navigation-drawer back-button


    【解决方案1】:
    private int mCurrentFragmentPosition;
     @Override
    public void onNavigationDrawerItemSelected(int position) {
    
        // update the main content by replacing fragments
    
        mCurrentFragmentPosition = position;
        fragmentManager = getFragmentManager();
        Fragment fragment;
        switch (position){
            case 0:
                fragment = TrackerFragment.newInstance(position);
                break;
    
            case 1:
                fragment = CalendarViewFragment.newInstance(position);
                break;
            case 2:
                fragment = SettingsFragment.newInstance(position);
    
                break;
            default:
                fragment = TrackerFragment.newInstance(position);
        }
    
        fragmentManager.beginTransaction()
                .replace(R.id.container, fragment)
                .commit();
    
    }
    @Override
    public void onBackPressed() {
        if(mCurrentFragmentPosition != 0){
            onNavigationDrawerItemSelected(0);
        }
        else {
            finish();
        }
    }
    

    【讨论】:

      【解决方案2】:

      只需跟踪当前显示的片段并覆盖onBackPressed 相应的行为。不需要用 backstack 让你的生活复杂化:)

      int currentFragmentPosition = 0;
      
      @Override
      public void onNavigationDrawerItemSelected(int position) {
          // update the main content by replacing fragments
          if(postion == currentFragmentPosition)
          {
             return;
          }
          currentFragmentPosition = position;
          fragmentManager = getFragmentManager();
          Fragment fragment;
          switch (position){
              case 0:
                  fragment = TrackerFragment.newInstance(position);
                  break;
      
              case 1:
                  fragment = CalendarViewFragment.newInstance(position);
                  break;
              case 2:
                  fragment = SettingsFragment.newInstance(position);
      
                  break;
              default:
                  fragment = TrackerFragment.newInstance(position);
          }
      
          fragmentManager.beginTransaction()
                  .replace(R.id.container, fragment).addToBackStack(null)
                  .commit();
      }
      
      @Override
      public void onBackPressed() {
         if(currentFragmentPostion != 0){
            onNavigationDrawerItemSelected(0);
          }
          else {
            finish();
          }
      }
      

      【讨论】:

      • 非常感谢您的想法!但是,是否需要在 onNavigationDrawerItemSelected 中进行条件检查?在移除 onNavigationDrawerItemSelected 中的条件检查后,我可以着手处理您的建议。并且省略了将事务添加到后台堆栈。
      • 不,不是。这是一种优化
      猜你喜欢
      • 1970-01-01
      • 2015-04-11
      • 1970-01-01
      • 2020-06-04
      • 2015-01-06
      • 1970-01-01
      • 2020-12-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多