【问题标题】:Why does findViewById(R.android.id.home) always return null?为什么 findViewById(R.android.id.home) 总是返回 null?
【发布时间】:2015-02-27 16:04:24
【问题描述】:

我正在使用 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 - 我都会得到null。 如果在上面的示例中调用 findViewById(item.getItemId()),我什至会得到 null。

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

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

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

【问题讨论】:

  • “我知道 R.android.id.home 存在,因为我可以将其单击作为菜单项进行管理”——这是一个菜单 ID。它不一定是小部件 ID。
  • @Commons 所以没有办法找到相关视图?由于链接的问题,我希望如此。
  • 我不知道。您找到的任何解决方案本质上都是不可靠的,因为它不是您的小部件。它是操作栏实现的小部件。操作栏可以随意命名,使用它想要的任何View 类(甚至直接将其呈现给Canvas)等等。不要假设或试图控制其他人UI 的内部实现。
  • @Commons 好的,我放弃了。如果你发布它,我会接受这个答案。 [强相关:也许你可以帮助我here。唯一的答案对我来说似乎不太好 - 真的必须制作自己的向上按钮来设置样式吗?]

标签: android android-navigation


【解决方案1】:

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

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

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

真的必须自己制作向上按钮来设置样式吗?

我不知道,因为我从未尝试过样式化。

【讨论】:

    【解决方案2】:

    正如 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)
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-12
      • 2019-09-18
      • 2014-09-02
      • 2015-02-27
      • 2021-01-10
      相关资源
      最近更新 更多