【问题标题】:Navigation drawer back button to primary fragment导航抽屉后退按钮到主要片段
【发布时间】:2015-07-20 19:12:52
【问题描述】:

在阅读this并搜索Android文档后,我放弃了,决定在这里问。 我试图在我的Navigation Drawer 中设置一个后退按钮,以便应用程序仅从Home 片段关闭,任何其他片段将带我们回到Home。例如,如果我们从Home 片段开始并导航到导航抽屉中的其他片段,当我们点击返回按钮时,我们将到达Home 片段,如果我们从主页片段返回,我们将退出应用程序.

我尝试过这样实现:

public void onNavigationDrawerItemSelected(int position) {   
    ...
    // If the next fragment is Home, clear the backstack.
    if (frag instanceof Home) {
        getSupportFragmentManager().popBackStack();
        fragmentManager.beginTransaction().replace(R.id.container, frag)
                .commit();
    }
    // If the backstack already contains a transaction, replace the current fragment
    else if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
        fragmentManager.beginTransaction().replace(R.id.container, frag)
                .commit();
    } 
    // If the backstack is empty, insert the Home -> Fragment transaction
    else {
        fragmentManager.beginTransaction().replace(R.id.container, frag)
                .addToBackStack("").commit();
    }
    ...
}

    ...

@Override
public void onBackPressed() {

    if (drawerLayout.isDrawerOpen(Gravity.START)) {
        drawerLayout.closeDrawer(Gravity.LEFT);
    } else {
        super.onBackPressed();
        // If returning back to Home fragment, restore action bar title.
        if (getSupportFragmentManager().getBackStackEntryCount() > 0)
            onSectionAttached(0);
    }
}

我附加的链接不能正常工作,我实施的方式也不能始终如一地工作。例如,如果我从主页导航到其他片段并返回主页(不按后退按钮),我的片段会相互重叠。

【问题讨论】:

标签: java android android-fragments navigation


【解决方案1】:

我刚刚找到了一种让这项工作变得相当容易的方法,所以我决定在这里发布:

// Are we in Home fragment?
private boolean homeFrag = true;
...
@Override
public void onNavigationDrawerItemSelected(int position) {
    ...
    // Next fragment is Home?
    if (frag instanceof Home)
        homeFrag = true;
    else
        homeFrag = false;

    fragmentManager.beginTransaction().replace(R.id.container, frag)
            .commit();
    onSectionAttached(position);
}
...
@Override
public void onBackPressed() {
    // Close navigation drawer if open
    if (drawerLayout.isDrawerOpen(Gravity.START)) {
        drawerLayout.closeDrawer(Gravity.LEFT);
    } else {
        // If not in Home, move back to Home.
        if (!homeFrag) {
            onNavigationDrawerItemSelected(0);
        } else
            super.onBackPressed();
    }
}

我想听听您对此解决方案的看法。

【讨论】:

    【解决方案2】:

    我认为您在 onBackPressed 方法中对 super.onBackPressed() 的调用应该是 else 块中的最后一个代码。原因是方法调用可能会影响 getBackStackEntryCount() 中的计数。在我看来,这样的电话已经太多了。

    【讨论】:

      【解决方案3】:

      我已经让这个方法为你管理片段和回栈。

      /**
       * Change the current displayed fragment managing fragment backstack
       * 
       * @param frag the fragment to display
       * @param saveInBackstack true if you want the previous to be in backstack
       */
      private void changeFragment(Fragment frag, boolean saveInBackstack) {
          String backStateName = ((Object) frag).getClass().getName();
      
          try {
              FragmentManager manager = getSupportFragmentManager();
              boolean fragmentPopped = manager.popBackStackImmediate(backStateName, 0);
      
              if (!fragmentPopped && manager.findFragmentByTag(backStateName) == null) { //fragment not in back stack, create it.
                  FragmentTransaction transaction = manager.beginTransaction();
                  transaction.replace(R.id.main_fragment_container, frag, ((Object) frag).getClass().getName());
      
                  if (saveInBackstack) {
                      Log.d(TAG, "Change Fragment : addToBackTack");
                      transaction.addToBackStack(backStateName);
                  } else {
                      Log.d(TAG, "Change Fragment : NO addToBackTack");
                  }
      
                  transaction.commit();
              } else {
                  Log.d(TAG, "Change Fragment : nothing to do");
                  // custom effect if fragment is already instanciated
              }
          } catch (IllegalStateException exception) {
              Log.e(TAG, "Unable to commit fragment, could be activity as been killed in background. " + exception.toString());
          }
      }
      

      同样在你的活动中,覆盖 onBackPressed :

      @Override
      public void onBackPressed() {
          int fragments = getFragmentManager().getBackStackEntryCount();
          if (fragments == 1) {
              finish();
          }
          super.onBackPressed();
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-04-11
        • 1970-01-01
        • 2014-02-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-20
        • 1970-01-01
        相关资源
        最近更新 更多