在支持操作栏中获取对抽屉切换的引用

Igo*_*pov 12 android android-support-library

我使用ShowcaseView库进行应用教程.我需要参考Navigation Drawer切换按钮(又名"汉堡按钮"):

在此输入图像描述

我使用工具栏作为操作栏,我不知道如何获得此按钮.通常切换抽屉我用这个:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
        if (item.getItemId() == android.R.id.home) {
            toggleDrawer(Gravity.START);
        }
}
Run Code Online (Sandbox Code Playgroud)

但是当我使用Device Monitor制作屏幕快照时,没有id为"home"的视图.

有什么建议?

Mik*_* M. 23

在原文中ActionBar,View左边常见的两个是Up ViewHome View.该向上 View是通常显示"汉堡包"图标的按钮,而首页 View显示的应用程序图标.Toolbar课堂上的情况发生了变化.不再有默认Viewandroid.R.id.homeID,虽然设置Toolbar为支撑ActionBar仍将火onOptionsItemSelected()与适当的项目标识的当View问题被点击.

当前Toolbar类现在将Up 指向View内部导航按钮 View,并View动态创建它.我使用了两种不同的方法来获取对它的引用 - 一个迭代一个Toolbar孩子View的,一个在Toolbar类上使用反射.

对于迭代方法,在设置了切换之后,但在添加任何其他ImageButtons 之前Toolbar,导航按钮 View是唯一的ImageButton子项Toolbar,您可以这样:

private ImageButton getNavButtonView(Toolbar toolbar)
{
    for (int i = 0; i < toolbar.getChildCount(); i++)
        if(toolbar.getChildAt(i) instanceof ImageButton)
            return (ImageButton) toolbar.getChildAt(i);

    return null;
}
Run Code Online (Sandbox Code Playgroud)

如果您需要引用应用程序图标View- 与旧主页 相对应View- 您可以使用类似的方法查找ImageView.

另一方面,反射方法可以在View设置之后的任何时间使用Toolbar.

private ImageButton getNavButtonView(Toolbar toolbar) {
    try {
        Class<?> toolbarClass = Toolbar.class;
        Field navButtonField = toolbarClass.getDeclaredField("mNavButtonView");
        navButtonField.setAccessible(true);
        ImageButton navButtonView = (ImageButton) navButtonField.get(toolbar);

        return navButtonView;
    }
    catch (NoSuchFieldException | IllegalAccessException e) {
        e.printStackTrace();
    }

    return null;
}
Run Code Online (Sandbox Code Playgroud)

同样,类似的方法可以用于图标View,而不是检索"mLogoView" Field.