像导航抽屉一样切换片段(带后退箭头)

Posted

技术标签:

【中文标题】像导航抽屉一样切换片段(带后退箭头)【英文标题】:Switch fragment like Nav drawer does (with back arrow) 【发布时间】:2021-02-07 05:36:19 【问题描述】:

我正在尝试制作应用程序,但我正在努力解决一个问题。 我想通过单击按钮从“Accueil”(家庭)到例如“Depense”(费用)。 正如您可以查看 gif(在帖子末尾),如果我通过菜单查看,我在顶部有一个后退箭头。而且,如果我从家里去“Avance”(高级),我就有了菜单图标。

我设法找出它的来源,我使用标准的导航抽屉,如果我在代码中添加我的片段,我有菜单,如果没有,我有箭头。

        mAppBarConfiguration = new AppBarConfiguration.Builder(
            R.id.nav_home, R.id.nav_gallery, R.id.nav_avance)
            .setDrawerLayout(drawer)
            .build();

R.id.nav_avance 在但 R.id.depense 不在。这就是我得到箭头的原因。

我正在尝试与标准抽屉在单击时所做的相同,但我无法做到。 我暂时在我的“Accueil”(家庭)片段代码中尝试了这个:

        Button b = root.findViewById(R.id.player_1);
        b.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View v) 
                Fragment fragment = new DepenseFragment();

                FragmentManager fragmentManager = getFragmentManager();
                FragmentTransaction ft = fragmentManager.beginTransaction();
                ft.replace(R.id.nav_host_fragment, fragment);
                ft.commit();
           
    );

但是如果我点击按钮,新的片段就会出现但是.. 我在顶部有菜单图标,旧文本是“Accueil”而不是“Depense”。

你能帮我实现这个吗? 有关信息,我想在这个新片段中根据我单击的按钮提供一个数字。 例如,如果我点击 player_1,我想传递 1.. player_2 将 2 传递给新片段等。

感谢您的帮助:)

【问题讨论】:

【参考方案1】:

我认为没有“内置”解决方案,即,当您单击按钮时,您必须手动操作/更新 ActionBar 中的图标。因此,我会将以下代码添加到您的 onClick() 方法中:

ActionBar actionbar = this.getSupportActionBar();
if (actionbar != null) 
    // get the drawable which you want to show
    Drawable icon = this.getResources().getDrawable(R.drawable.baseline_arrow_back_white_24);

    // if necessary, adapt it to your theme
    icon.setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_ATOP);

    // set/update the icon
    actionbar.setHomeAsUpIndicator(backArrow);
    actionbar.setDisplayHomeAsUpEnabled(true);
    actionbar.setHomeButtonEnabled(true);

请注意this 指的是您的活动对象,因此您必须调整该部分。由于我不知道b 的“位置”,我只能猜测您必须如何适应它。例如,如果b 已经在您的活动中,您可以将this 替换为MainActivity.this

如果this.getSupportActionBar() 返回null,您可能需要调整您的XML 布局。请参阅此处作为起点: https://developer.android.com/training/appbar/setting-up

请在此处查看所用方法的详细说明(例如,setDisplayHomeAsUpEnabled): https://developer.android.com/reference/android/app/ActionBar

请注意,上面的drawable来自这里(两个图标都可用): https://material.io/resources/icons/?style=baseline

【讨论】:

感谢您的回答我一直在尝试其他方法以实现我想要的,我想出了一个解决方案。我将在这个问题中分享它【参考方案2】:

经过(几个)小时的研究和尝试,我自己的答案出来了。

        Button b = root.findViewById(R.id.player_1);
        b.setOnClickListener(new View.OnClickListener() 
        @Override
            public void onClick(View v) 
                NavOptions.Builder builder = new NavOptions.Builder();
                NavController navController = Navigation.findNavController(root);

                NavOptions options = builder.build();
                try 
                    navController.navigate(R.id.nav_joueur, null, options);
                 catch (IllegalArgumentException e) 
                
        
    );

我发现抽屉使用导航控制器来更改显示的片段。 我已经设法得到它并改变它以获得与我点击菜单相同的行为:)

【讨论】:

以上是关于像导航抽屉一样切换片段(带后退箭头)的主要内容,如果未能解决你的问题,请参考以下文章

actionBarDrawerToggle.setDrawerIndicatorEnabled(false) 后退箭头没有动作

如何通过后退按钮(箭头)将活动导航到片段?

如何使向上按钮返回而不是打开导航抽屉

应用ActionBar中的返回按钮

导航抽屉切换图标

使用导航组件将返回箭头添加到片段