我正在使用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())
。
为什么? 这个问题在此之前已被提出,大多数时候都是关于ActionBarSherlock(我没有使用)。 Another time有人建议使用:
getWindow().getDecorView().findViewById(android.R.id.home)
但它不起作用。在那个问题中,OP还说findViewById(android.R.id.home)
适用于API> 3.0,但这对我来说并不适用。有什么想法吗?
答案 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)
}
}