最近在做Android 7.0 的开发,源码中许多模块都进行了更新,用上了一些新的控件。由于现在有一个项目是有按键的,在设置模块原来的actionbar都替换成了toolbar,这就导致了一个问题,无法通过按键将焦点移动到toolbar上,这里就来分享一下如何解决这个问题。
首先找到设置界面上的toolbar在什么地方定义。在Android 7.0 中,SettingsActivity是继承于SettingsDrawerActivity,而SettingsDrawerActivity在settingslib中定义,位置如下:
android\frameworks\base\packages\SettingsLib
在这个类中有一个布局:R.layout.settings_with_drawer,toolbar就是在这里面定义的,如下:
<Toolbar
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/action_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:navigationContentDescription="@*android:string/action_bar_up_description"
android:theme="?android:attr/actionBarTheme"
style="?android:attr/toolbarStyle"
android:background="?android:attr/colorPrimary" />
可以看到他有一个style,在framework中toolbarStyle指向的是@style/Widget.Toolbar,这个style如下:
<style name="Widget.Toolbar">
<item name="titleTextAppearance">@style/TextAppearance.Widget.Toolbar.Title</item>
<item name="subtitleTextAppearance">@style/TextAppearance.Widget.Toolbar.Subtitle</item>
<item name="minHeight">?attr/actionBarSize</item>
<item name="titleMargin">4dp</item>
<item name="maxButtonHeight">@dimen/action_bar_default_height_material</item>
<item name="buttonGravity">top</item>
<item name="navigationButtonStyle">@style/Widget.Toolbar.Button.Navigation</item>
<item name="collapseIcon">?attr/homeAsUpIndicator</item>
<item name="collapseContentDescription">@string/toolbar_collapse_description</item>
<item name="contentInsetStart">16dp</item>
<item name="contentInsetStartWithNavigation">@dimen/action_bar_content_inset_with_nav</item>
<item name="touchscreenBlocksFocus">true</item>
</style>
可见最后一行有一个touchscreenBlocksFocus属性,就是当他为true时,阻止通过按键将焦点移上去。这里我们直接改为false,重新编译即可。