将导航抽屉与导航组件一起使用时如何更改操作栏图标(汉堡包图标)

how to change Action bar icon (hamburger icon) when using navigation drawer with navigation component

我想更改主页向上指示器,但在使用导航组件时它不起作用

我尝试了这里的解决方案,但没有用

我的代码

    setSupportActionBar(binding.toolbar);
    getSupportActionBar().setDisplayShowTitleEnabled(false);

    AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder(R.id.myTeamFragment,
            R.id.myTasksFragment, R.id.meetingsFragment, R.id.freeTimeFragment, R.id.dashboardFilterFragment)
            .setOpenableLayout(binding.getRoot())
            .build();
    NavigationUI.setupWithNavController(binding.toolbar, getNavController(), appBarConfiguration);

然后作为提到的解决方案

ActionBar actionBar = getSupportActionBar();
    getNavController().addOnDestinationChangedListener((controller, destination, arguments) -> {
        if (destination.getId() == R.id.dest0
                || destination.getId() == R.id.dest1
                || destination.getId() == R.id.dest2
                || destination.getId() == R.id.dest3
                || destination.getId() == R.id.dest4){

            actionBar.setHomeAsUpIndicator(R.drawable.ic_hambergur_menu);
        } else {
            actionBar.setHomeAsUpIndicator(R.drawable.ic_hambergure_back);
        }
    });

您正在使用 Toolbar

的设置
NavigationUI.setupWithNavController(binding.toolbar, getNavController(), appBarConfiguration);

然后使用 Toolbar API 而不是 ActionBar API:

    navController.addOnDestinationChangedListener { controller, destination, arguments ->
        if (destination.id == R.id.nav_home){
            toolbar.setNavigationIcon(R.drawable.xxxx)
        }
    }

如果您只想显示后退箭头按钮而不是汉堡按钮,您可以从 appBarConfiguration

中删除要显示后退按钮的片段

在您的代码段中,后退按钮不会显示在这些片段中 (R.id.myTasksFragment, R.id.meetingsFragment, R.id.freeTimeFragment, R.id.dashboardFilterFragment),请删除其中任何片段以显示后退按钮。

AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder(R.id.myTeamFragment,
        R.id.myTasksFragment, R.id.meetingsFragment, R.id.freeTimeFragment, R.id.dashboardFilterFragment)
        .setOpenableLayout(binding.getRoot())
        .build();

我不知道,为什么?但对我来说,它适用于 postDelay 函数。即使我设置 delay 等于 zero

 navController.addOnDestinationChangedListener { controller, destination, arguments ->
        if (destination.id == R.id.fragment_orders) {
            view.postDelayed(
                {
                    supportActionBar?.setHomeAsUpIndicator(R.drawable.ic_amount)
                },
                0
            )
        }
    }

添加一个延迟为 post 0 英里的处理程序对我有用。

  @Override
    public void onDestinationChanged(@NonNull NavController controller,
                                     @NonNull NavDestination destination,
                                     @Nullable Bundle arguments) {
        Log.d(TAG, "onDestinationChanged: current destination: "+navController.getCurrentDestination().getLabel());
        this.currentFragmentId = destination.getId();
        if(currentFragmentId == R.id.addItemFragment){
            new Handler().postDelayed(()->{
                mToolbar.setNavigationIcon(R.drawable.ic_baseline_arrow_back_ios_24);
            },0);
        }
        super.setTitle(destination.getLabel());
    }