为什么findViewById(R.android.id.home)总是返回null?

时间:2014-12-31 15:46:02

标签: android android-navigation

我正在使用AppCompat并尝试调用属于工具栏的向上/向后按钮的ImageView

我知道R.android.id.home存在,因为我可以将其点击作为菜单项进行管理:

public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId() == android.R.id.home) {
         //this works
    }
    return super.onOptionsItemSelected(item);
}

除此之外,每当我尝试拨打findViewById(android.R.id.home)时 - 无论是onCreate,还是自定义按钮的onClick - 我都会为空。 如果在上面的示例中我调用findViewById(item.getItemId())

,我甚至会得到null

为什么? 这个问题在此之前已被提出,大多数时候都是关于ActionBarSherlock(我没有使用)。 Another time有人建议使用:

getWindow().getDecorView().findViewById(android.R.id.home)

但它不起作用。在那个问题中,OP还说findViewById(android.R.id.home)适用于API> 3.0,但这对我来说并不适用。有什么想法吗?

2 个答案:

答案 0 :(得分:3)

“home”图标是否是一个小部件,它是什么类的小部件,以及它的ID是什么(如果有的话)取决于操作栏的实现。对于不同的API级别,本机操作栏可能会以不同的方式执行此操作,并且所有这些操作栏可能与appcompat-v7执行此操作的方式不同。更不用说ActionBarSherlock或其他操作栏实现。

具体来说,android.R.id.home是一个菜单ID,这就是您可以在onOptionsItemSelected()等地方使用它的原因。它不一定是小部件ID,这就是它可能与findViewById()一起使用的原因。

理想情况下,您不要试图弄乱自己没有自己构建的UI的内部实现。

  

一个人真的必须自己设置Up按钮来设计它吗?

我不知道,因为我从来没有尝试过它。

答案 1 :(得分:0)

正如CommonsWare所说,android.R.id.home是菜单ID,而不是小部件ID。但是,如果您要访问此主页按钮,则可以执行此操作。例如,我需要它在应用程序内教程中突出显示主页按钮:

fun AppCompatActivity.getToolbarHomeIcon(): View? =
    this.findViewById<Toolbar?>(R.id.toolbar)?.let { toolbar ->
        val contentDescription: CharSequence = toolbar.navigationContentDescription.let {
            if (it.isNullOrEmpty()) {
                this.getString(R.string.abc_action_bar_up_description)
            } else {
                it
            }
        }
        // Here home button should be created even if it doesn't exist before
        toolbar.navigationContentDescription = contentDescription

        ArrayList<View>().let { potentialViews ->
            toolbar.findViewsWithText(
                potentialViews,
                contentDescription,
                View.FIND_VIEWS_WITH_CONTENT_DESCRIPTION
            )

            potentialViews.getOrNull(0)
        }
    }