使用导航抽屉时,后退/向上箭头不起作用

问题描述

使用导航抽屉时,后退或向上按钮不起作用。图标从汉堡包更改(已设置了顶级目的地),但两者都打开了导航抽屉。我希望后退/后退箭头回到堆栈中。

公共类MainActivity扩展了AppCompatActivity,实现了NavigationView.OnNavigationItemSelectedListener,DrawerLocker {

public static final String TAG = MainActivity.class.getSimpleName();

private DrawerLayout drawerLayout;
private NavigationView navView;
private Toolbar toolbar;

private NavController navController;
private ActionBarDrawerToggle drawerToggle;


private AppBarConfiguration appBarConfiguration;

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

    toolbar = findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);


    //configure drawer layout
    drawerLayout = findViewById(R.id.drawer_layout);
    navView = findViewById(R.id.drawer_navigation_view);

    navController = Navigation.findNavController(this,R.id.nav_host_fragment);

    appBarConfiguration = new AppBarConfiguration.Builder(R.id.scenarioListFragment,R.id.tokenListFragment,R.id.settingsFragment,R.id.historyFragment)
            .setDrawerLayout(drawerLayout)
            .build();

    NavigationUI.setupActionBarWithNavController(this,navController,appBarConfiguration);
    NavigationUI.setupWithNavController(navView,navController);

    navView.setNavigationItemSelectedListener(this);

    drawerToggle = new ActionBarDrawerToggle(this,drawerLayout,toolbar,R.string.navigation_drawer_open,R.string.navigation_drawer_close);

    drawerLayout.addDrawerListener(drawerToggle);
    drawerToggle.syncState();

    if (savedInstanceState == null ) {
        navView.setCheckedItem(R.id.drawer_menu_scenario);
        toolbar.setTitle("Scenarios");
    }
}

我看过this video,它看起来很简单,但它指的是Kotlin,而且我的代码也不远。

This post也涵盖了类似的挑战,尽管在Kotlin中,我尝试添加setNavigationOnClickListener并在其中放入logd语句。它从来没有被解雇过,但是解决方案本身似乎没有必要。

This post似乎涵盖了同一问题,但没有答案。响应之一对setupActionBarWithNavController说,我有

NavigationUI.setupActionBarWithNavController(this,appBarConfiguration);

函数有很多重载,我已经尝试了许多重载,但它们似乎使我失去了一组顶级目的地(多个片段的汉堡图标),并使导航无法正常工作。

我试图追随this documentation,但这似乎只是使我从原地退后。这个电话:

    AppBarConfiguration appBarConfiguration =
            new AppBarConfiguration.Builder(navController.getGraph())
                    .setDrawerLayout(drawerLayout)
                    .build();

似乎可以替换topLevelDestinations并使用navController.getGraph(),但是由于我有多个,所以我一直在引用fragments themselves

我以前曾对此问题进行过ask的调查,但是对我来说很明显我没有很好地解释它(答案解决了如何弹出,而不是为什么后退箭头不起作用)。我会删除它,但人们确实回答了,因此SO提供的指导是在这种情况下我不应该删除它。如果造成混乱,很抱歉。

解决方法

有两个问题:

  1. 按照https://content.riscv.org/wp-content/uploads/2017/05/riscv-spec-v2.2.pdf

使用NavigationUI时,顶部的应用程序栏助手会在当前目的地更改时在抽屉图标和向上图标之间自动转换。您无需使用ActionBarDrawerToggle

因此,您必须删除所有ActionBarDrawerToggle代码。

  1. 按照Add a navigation drawer documentation

覆盖onSupportNavigateUp()以处理向上导航:

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

请注意,如果您已经Setting up the Action bar documentation并且正在使用if (savedInstanceState == null),则也不需要setupWithNavController

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...