如何为Material Toolbar的导航图标设置焦点?
解决Material Toolbar整体高亮、仅需导航图标获焦点的问题
1. 先禁用Toolbar自身的焦点能力
默认情况下Material Toolbar会作为可聚焦容器,进入页面时自动抢占焦点导致整体高亮。先把它的焦点能力关掉:
- XML布局方式:
<com.google.android.material.appbar.MaterialToolbar android:id="@+id/toolbar" ... android:focusable="false" android:focusableInTouchMode="false" />
- 代码方式:
toolbar.isFocusable = false toolbar.isFocusableInTouchMode = false
2. 开启导航图标的焦点并主动请求
导航图标默认可能未开启可聚焦属性,需要先配置,再在页面进入前台时主动请求焦点:
// 获取导航图标对应的View val navIconView = toolbar.findViewById<View>(R.id.navigationIcon) // 开启焦点属性 navIconView.isFocusable = true navIconView.isFocusableInTouchMode = true // 在页面进入前台时请求焦点,比如onResume或onViewCreated中 override fun onResume() { super.onResume() navIconView.requestFocus() }
如果找不到R.id.navigationIcon,可以尝试给自定义导航图标设置id后查找,或通过反射获取Toolbar内部的导航图标视图。
3. 兜底:拦截Toolbar的焦点分发
如果上述方法仍无效,可以通过拦截Toolbar的焦点变化,强制把焦点转移到导航图标:
toolbar.setOnFocusChangeListener { _, hasFocus -> if (hasFocus) { navIconView.requestFocus() } }
另外检查页面内其他可聚焦视图(如EditText)是否抢占了焦点,必要时调整焦点优先级,确保导航图标是页面中第一个可获取焦点的元素。
内容的提问来源于stack exchange,提问作者sneha
相关产品推荐
相关产品推荐

