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

如何覆盖抽屉导航按钮行为并更改图标?

车子平
2023-03-14

我有一个应用程序,它使用抽屉导航来显示具有主要主题的不同片段。抽屉导航

在Home片段中,我显示不同的类别(那些彩色框),当我选择一个类别时,它会显示包含该类别的每日和一般详细信息的新片段。(让我们称之为详细片段)Home片段

我想要的,但不知道如何完成的,是在细节片段中,我希望有带我回到主页片段的返回箭头,而不是打开抽屉导航的汉堡菜单图标。细节片段

共有3个答案

卫博雅
2023-03-14

谢谢你的帮助,我从你的答案和Stackoverflow的其他帖子中得到了一些想法。如果你认为这是一个糟糕的解决方案,请让我知道。这就是我如何使用非常简单的解决方案(Kotlin)使其工作的原因:

把这个放到你的activitys onCreate中

supportFragmentManager.addOnBackStackChangedListener {
       actionBarDrawerToggle?.isDrawerIndicatorEnabled = supportFragmentManager.backStackEntryCount <= 0
}

并覆盖onSupport portNavigate Up():

override fun onSupportNavigateUp(): Boolean {
    supportFragmentManager.popBackStack()
    return super.onSupportNavigateUp()
}
施阎宝
2023-03-14

您可以通过将工具栏动态添加到主活动中来实现,而不是使用内置的导航抽屉,从头开始。添加片段时,请在片段上添加工具栏。工具栏myChildToolbar=(Toolbar)findViewById(R.id.my\u child\u Toolbar);设置支持操作栏(myChildToolbar);

// Get a support ActionBar corresponding to this toolbar
ActionBar ab = getSupportActionBar();

// Enable the Up button
ab.setDisplayHomeAsUpEnabled(true);

然后,您将能够覆盖按钮导航上的方法向上方法,以启用工具栏上所需的后退按钮。

段干河
2023-03-14

如果我假设您在布局中使用android.support.v4.widget.DrawerLayout,那么这种方法可能适合您;我只在API 21上进行了测试,但考虑到它主要使用支持库,它应该可以在较低或较高的目标上工作(著名的遗言)。

导入android。支持v7.app。ActionBarDrawerToggle导入android。支持v4.widget。抽屉布局

ActionBarDrawerToggle mDrawerToggle;
DrawerLayout drawerLayout;
private boolean mToolBarNavigationListenerIsRegistered = false;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setSupportActionBar(mToolbar);
    getSupportActionBar().setDisplayShowTitleEnabled(false);
    // Get DrawerLayout ref from layout
    drawerLayout = (DrawerLayout)findViewById(R.id.drawer);
    // Initialize ActionBarDrawerToggle, which will control toggle of hamburger.
    // You set the values of R.string.open and R.string.close accordingly.
    // Also, you can implement drawer toggle listener if you want.
    mDrawerToggle = new ActionBarDrawerToggle (this, drawerLayout, mToolbar, R.string.open, R.string.close);
    // Setting the actionbarToggle to drawer layout
    drawerLayout.setDrawerListener(mDrawerToggle);
    // Calling sync state is necessary to show your hamburger icon...
    // or so I hear. Doesn't hurt including it even if you find it works
    // without it on your test device(s)
    mDrawerToggle.syncState();
}

/**
 * To be semantically or contextually correct, maybe change the name
 * and signature of this function to something like:
 *
 * private void showBackButton(boolean show)
 * Just a suggestion.
 */
 private void enableViews(boolean enable) {

    // To keep states of ActionBar and ActionBarDrawerToggle synchronized,
    // when you enable on one, you disable on the other.
    // And as you may notice, the order for this operation is disable first, then enable - VERY VERY IMPORTANT.
    if(enable) {
        //You may not want to open the drawer on swipe from the left in this case  
        drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
        // Remove hamburger
        mDrawerToggle.setDrawerIndicatorEnabled(false);
        // Show back button
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        // when DrawerToggle is disabled i.e. setDrawerIndicatorEnabled(false), navigation icon
        // clicks are disabled i.e. the UP button will not work.
        // We need to add a listener, as in below, so DrawerToggle will forward
        // click events to this listener.
        if(!mToolBarNavigationListenerIsRegistered) {
            mDrawerToggle.setToolbarNavigationClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // Doesn't have to be onBackPressed
                    onBackPressed();
                }
            });

            mToolBarNavigationListenerIsRegistered = true;
        }

    } else {
        //You must regain the power of swipe for the drawer. 
        drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);

        // Remove back button
        getSupportActionBar().setDisplayHomeAsUpEnabled(false);
        // Show hamburger 
        mDrawerToggle.setDrawerIndicatorEnabled(true);
        // Remove the/any drawer toggle listener
        mDrawerToggle.setToolbarNavigationClickListener(null);
        mToolBarNavigationListenerIsRegistered = false;
    }

    // So, one may think "Hmm why not simplify to:
    // .....
    // getSupportActionBar().setDisplayHomeAsUpEnabled(enable);
    // mDrawer.setDrawerIndicatorEnabled(!enable);
    // ......
    // To re-iterate, the order in which you enable and disable views IS important #dontSimplify.
}

该解决方案使用ActionBarDrawerToggle.setDrawerIndicatorEngic来切换汉堡包图标的可见性,并使用ActionBar.setDisplayHomeAsUpEngic来切换Up按钮的可见性,基本上利用了它们各自的可绘制资源。

 类似资料:
  • 在我的应用程序中,我使用动作栏和导航抽屉。操作栏中有一个按钮用于打开和关闭导航抽屉。我想把它的颜色改成红色。我该怎么做?

  • 我对Android开发相当陌生。我正在检查材料设计库,我已经实现了一个带有底部导航的抽屉菜单,可以轻松浏览片段。两个组件都很好,但我不知道如何协调两个组件的导航。例如,当一个片段在抽屉菜单上切换时,它会改变布局,但按钮导航选定的项目不会随之改变。 如何解决此问题,并将这两个组件链接起来,使其相互工作,并同步更改的选定项? 这是我的java文件的样子,下面是GitHub上整个项目的链接:https:

  • 我开始创建一个应用程序,它使用一个活动(导航抽屉)和许多片段。但我无法使用工具栏上的“后退”按钮从片段中导航回来。硬件后退按钮工作正常。我知道我需要覆盖选项ItemSelected,捕捉android。R、 id.home,检查后堆栈中是否有内容,然后弹出它。在更改片段后,“burger”按钮变为“back arrow”,但当我单击它时,选项ItemSelected将打开NavigationDra

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

  • 问题内容: 我知道这些类型的问题已经在这里,但仍然找不到这个问题的答案: 我已经创建了一个应用程序,并使用了由该应用程序自动创建的导航抽屉(AndroidStudio) 这是我所拥有的: 还有更多: 我想使用导航抽屉中的按钮显示另一个片段。我想使用此代码,所以请不要向我发送任何制作自己的抽屉的指南或教程。 现在的问题是,我该怎么放 ,并在情况下,我想打开另一个片段?谢谢。 还有一个问题: 如何添加

  • 问题内容: 我是Android编程的新手,但是到目前为止一直表现不错。我已经读过很多关于这个问题的答案,但似乎无法使我的工作正常。基本上,我拥有的是带有导航抽屉的MainActivity。我有两个用相应的片段布局xmls正确初始化的片段。目前,我可以在启动应用程序时以及在单击抽屉中的每个项目时显示我的第一个片段;标题会发生变化;但是,片段保持不变。有什么建议?我认为相关的代码在下面(未显示的是Na