当前位置: 首页 > 知识库问答 >
问题:

Android导航返回(汉堡)总是带出抽屉

唐珂
2023-03-14

因此,我构建了一个应用程序,其中包含一些主页作为顶级目标片段。用户可以在主页(一、二、三等)中单击以调出更多详细信息片段(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后退按钮,应用程序将按预期返回主页片段,但如果我单击顶部后退按钮(代替汉堡包),它会弹出抽屉而不是返回。有人能告诉我是否遗漏了什么吗?我需要更改我的主活动代码,还是必须将一些代码放在其他地方?我已经尝试了上述代码的几个变体,但它仍然会弹出抽屉。

我也尝试过:

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,在任何情况下都会打开抽屉。无后台功能。

共有2个答案

东门修能
2023-03-14

不要使用ActionBarDrawerToggle。

从android开发者网站:覆盖onSupportNavigateUp()以处理导航

@Override
public boolean onSupportNavigateUp() {
    NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
    return NavigationUI.navigateUp(navController, appBarConfiguration)
            || super.onSupportNavigateUp();
}
徐嘉勋
2023-03-14

我不得不移除我的整个:

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();

现在一切都像我所期望的那样,当它是一个后退箭头时,后退汉堡按钮后退/向上,当它是一个汉堡时,会打开抽屉。

我是从一个示例项目开始这个项目的,所以我没有仔细研究ActionBarDrawerToggle是什么或做什么就把这部分放在了里面。现在花时间在谷歌上。。。

 类似资料:
  • 我正在用最新的appcompat支持库实现Lollipop风格的导航抽屉,但问题是汉堡包图标从未显示。仅显示后退图标。 这是我的活动代码 这是我的样式文件 布局文件 在这两种情况下,只有返回箭头显示,我读了很多帖子,但似乎没有什么不同。任何帮助都将不胜感激。

  • 我知道如何改变抽屉图标,如果它在左侧,但我没有找到任何解决方案,改变导航抽屉汉堡图标,如果抽屉是在右侧。任何帮助都是可以感激的。

  • 有人能告诉我如何创建活动到这个主要活动,导航抽屉将看到在所有他们?我需要使用这个特定的MainActivity代码。我不需要使用碎片,只要3个简单的活动将添加到这个抽屉。 NavDrawer布局:

  • 我实现了双抽屉布局。我还建立了一个ActionBarDrawerToggle。 我的问题是当我点击主页按钮时,我的左抽屉打开并播放动画。打开时我的右抽屉也显示抽屉打开动画。这会导致与主页图标奇怪的同步问题,即使使用mDrawerToggle.sync状态(); 我要做的是拦截打开左侧抽屉的home button click事件,以便测试哪个抽屉打开,然后适当地关闭那个抽屉。有没有办法在主页图标上设

  • 我有一个在几个活动之间过渡的导航抽屉。在每个活动中,我都有一个基础片段,它可能启动其他片段。我希望导航抽屉切换图标显示时,我在基础片段,但当我添加另一个片段,我需要显示后箭头。 我一直在遵循riwnodennyk在的示例:使用片段时在Android导航抽屉图像和上插入符号之间切换 但这对我不起作用。箭头确实会出现,但我无法单击它。当点击它时,什么也不会发生。 非碱基片段中的OptionsMenuL

  • 你知道我如何在Android/支持库中找到原来的汉堡包图标吗?(或如何显示) 在我的活动中 布局文件 styles.xml