Android 获取对support actionbar中抽屉切换的引用

Android 获取对support actionbar中抽屉切换的引用,android,android-support-library,Android,Android Support Library,我使用应用程序教程库。我需要得到一个参考导航抽屉切换按钮(又名“汉堡按钮”): 我使用工具栏作为操作栏,我不知道如何获得这个按钮。通常,要切换抽屉,我使用以下方法: @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == android.R.id.home) { toggleDrawer(Gravity.START);

我使用应用程序教程库。我需要得到一个参考导航抽屉切换按钮(又名“汉堡按钮”):

我使用工具栏作为操作栏,我不知道如何获得这个按钮。通常,要切换抽屉,我使用以下方法:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
        if (item.getItemId() == android.R.id.home) {
            toggleDrawer(Gravity.START);
        }
}
但当我使用设备监视器对屏幕进行快照时,没有id为“home”的视图


有什么建议吗

这就是所谓的导航按钮,它实际上是嵌套在
工具栏中的
图像按钮
。不幸的是,没有公共方法或字段来获取对它的引用,所以我们不得不绕道而行

对此有几种不同的方法,其有效性和谨慎程度各不相同。你挑吧

  • 迭代

    如果您可以控制它,并且能够首先设置切换,那么导航按钮应该是
    工具栏
    的第一个子按钮(可能是唯一的)
    ImageButton
    。如果您确信是这样,那么这可能是最简单的方法

    • 爪哇
    静态图像按钮getNavigationButton(工具栏){
    对于(int i=0;i
    • 科特林
    val Toolbar.navigationButton:ImageButton?
    得到(){
    孩子们{
    如果(是ImageButton){
    还它
    }
    }
    返回空
    }
    
  • 反思性的

    这种方法具有绝对确定性的优点。然而,这是一种反思,所以,你知道,无论你的想法是什么

    • 爪哇
    静态图像按钮getNavigationButton(工具栏){
    试一试{
    最终字段mNavButtonView=
    Toolbar.class.getDeclaredField(“mNavButtonView”);
    mNavButtonView.setAccessible(真);
    返回(ImageButton)mNavButtonView.get(工具栏);
    }捕获(例外e){
    返回null;
    }
    }
    
    • 科特林
    val Toolbar.navigationButton:ImageButton?
    得到(){
    工具栏::class.java
    .getDeclaredField(“mNavButtonView”)。应用{
    isAccessible=true
    退货(this@navigationButton)作为图像按钮?
    }
    }
    
  • 按内容描述查找

    这是通过将导航按钮的某些属性设置为特殊值来完成任务的三种方法中的第一种。此方法临时将其内容描述设置为唯一值,并使用
    ViewGroup#findViewsWithText()
    方法在恢复原始描述之前查找它

    此示例和下面的按标记查找示例都使用此字符串资源,其值可以是您喜欢的任何值:

    工具栏导航按钮导航器
    
    • 爪哇
    静态图像按钮getNavigationButton(工具栏){
    最终字符序列原始描述=
    toolbar.getNavigationContentDescription();
    最终字符序列定位器=
    toolbar.getResources()
    .getText(R.string.toolbar\u navigation\u button\u locator);
    toolbar.setNavigationContentDescription(定位器);
    最终ArrayList视图=新建ArrayList();
    toolbar.FindViewWithText(
    意见,
    定位器,
    查看。查找带有内容描述的视图);
    toolbar.setNavigationContentDescription(原始描述);
    用于(视图:视图){
    如果(查看ImageButton的实例){
    返回(图像按钮)视图;
    }
    }
    返回null;
    }
    
    • 科特林
    val Toolbar.navigationButton:ImageButton?
    得到(){
    val originalDescription=导航内容描述
    val定位器=
    resources.getText(R.string.toolbar\u导航\u按钮\u定位器)
    navigationContentDescription=定位器
    val views=ArrayList()
    用文本查找视图(
    意见,
    定位器,
    View.FIND\u视图\u带内容\u描述
    )
    navigationContentDescription=原始描述
    views.forEach{v->
    如果(v是图像按钮){
    返回v
    }
    }
    返回空
    }
    
  • 按标签查找

    此方法利用了能够通过
    toolbarNavigationButtonStyle
    主题属性设置导航按钮样式的优势。在指定的样式中,我们将
    android:tag
    属性设置为唯一的定位器字符串,并使用
    View\findViewWithTag()
    方法在运行时获取它

    
    ...
    @样式/Toolbar.Button.Navigation.taged
    @字符串/工具栏\导航\按钮\定位器
    
    • 爪哇
    静态图像按钮getNavigationButton(工具栏){
    最终字符序列标签=
    toolbar.getResources()
    .getText(R.string.toolbar\u navigation\u button\u locator);
    返回toolbar.findViewWithTag(标记);
    }
    
    • 科特林
    val Toolbar.navigationButton:ImageButton?
    得到(){
    回程{
    findViewWithTag(
    资源
    .getText(R.string.toolbar\u导航\u按钮\u定位器)
    )
    }
    }
    
  • 可提取回拨

    这一功能利用了
    ImageButton
    将自身设置为其源
    Drawable
    回调
    这一事实。我们创建一个一次性的
    可绘制的
    以临时设置为导航图标,检查
    回调
    对象是否是我们的
    图像按钮
    ,并恢复