首页 > 解决方案 > Android Navigation Back(汉堡包)总是带出抽屉

问题描述

因此,我构建了一个应用程序,其中包含几个主要页面作为顶级目标片段。用户可以在主页面(一、二、三等)内单击以调出更多详细信息片段(page_one_item1_details、page_two_item3_details 等)。这样做时,汉堡包按钮会按预期变为后退箭头。

public class MainActivity extends AppCompatActivity {

  private AppBarConfiguration mAppBarConfiguration;

  @Override
  protected void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    initViews();
  }

  private void initViews() {
    final Toolbar toolbar = findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    final DrawerLayout drawerLayout = findViewById(R.id.drawer_layout);

    final NavController navController = Objects.requireNonNull(
        (NavHostFragment) getSupportFragmentManager().findFragmentById(R.id.nav_host_fragment))
        .getNavController();

    mAppBarConfiguration = new AppBarConfiguration.Builder(
        R.id.nav_home,
        R.id.nav_main_page_one,
        R.id.nav_main_page_two,
        R.id.nav_main_page_three,
        R.id.nav_main_page_four)
        .setOpenableLayout(drawerLayout).build();

    NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration);
    NavigationUI.setupWithNavController(
        (NavigationView) findViewById(R.id.nav_view), navController);
    
    final ActionBarDrawerToggle actionBarDrawerToggle = new ActionBarDrawerToggle(
        this, drawerLayout, toolbar, R.string.drawer_open,
        R.string.drawer_close) {

      @Override
      public void onDrawerSlide(final View drawerView, final float slideOffset) {
        super.onDrawerSlide(drawerView, slideOffset);
        ((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE))
            .hideSoftInputFromWindow(drawerView.getWindowToken(), 0);
      }
    };
    drawerLayout.addDrawerListener(actionBarDrawerToggle);
    actionBarDrawerToggle.syncState();
  }

  @Override
  public boolean onCreateOptionsMenu(final Menu menu) {
    getMenuInflater().inflate(R.menu.menu_main, menu);
    return true;
  }

  @Override
  public boolean onSupportNavigateUp() {
    return NavigationUI.navigateUp(
        Navigation.findNavController(this, R.id.nav_host_fragment), mAppBarConfiguration)
        || super.onSupportNavigateUp();
  }
}

如果我单击 Android 后退按钮,应用程序将按预期返回到主页片段,但如果我单击顶部的后退按钮(代替汉堡包),它会打开抽屉而不是返回。谁能告诉我我是否遗漏了什么?我需要更改我的 MainActivity 代码,还是必须将一些代码放在其他地方?我在上面的代码中对 onSupportNavigateUp 尝试了几种变体,但它仍然总是会打开抽屉。

我也试过:

return Navigation.findNavController(this, R.id.nav_host_fragment), drawerLayout)
        || super.onSupportNavigateUp();

NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
    return NavigationUI.navigateUp(navController, mAppBarConfiguration)
        || super.onSupportNavigateUp()

注意 - 即使删除 onSupportNavigateUp 在任何情况下仍然总是会打开抽屉。没有后退功能。

标签: androidnavigation-drawerback-buttonandroid-navigationandroid-jetpack-navigation

解决方案


不要使用ActionBarDrawerToggle.

来自 android 开发者网站: 覆盖 onSupportNavigateUp() 以处理向上导航

@Override
public boolean onSupportNavigateUp() {
    NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
    return NavigationUI.navigateUp(navController, appBarConfiguration)
            || super.onSupportNavigateUp();
}

推荐阅读