例如:在8.1 Launcher3界面,连接蓝牙鼠标,点击Folder或者进入Allapss界面,会发现个别应用或者Folder会有背景高亮显示
分析:
通过本地对Launche3的代码布局进行check,并没有设置任何背景,因此,初步怀疑为谷歌原生View中在某种状态下设置了什么东东,以至于在满足某种情形下,如鼠标悬停,会有个别View背景高亮显示。
下一步对谷歌原生View.java进行check,发现View的成员变量初始值默认为true。
/Anrdroid8.1/frameworks/base/core/java/android/view/View.java
4244 * Whether this View should use a default focus highlight when it gets focused but doesn't 4245 * have { @link android.R.attr#state_focused} defined in its background. 4246 */ 4247 boolean mDefaultFocusHighlightEnabled = true;
该变量的含义:是否该视图获取焦点后,应该使用一个默认焦点高亮;而此高亮并非在背景中定义的state_facused,也就是说不是用户自己定义的View的background里设置的。系统将设置一个默认的高亮。
接着往下看,View的构造器中,初始化数据时,会获取TypedArray值:
4720 public View(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
4781 switch (attr) {
5236 case R.styleable.View_defaultFocusHighlightEnabled:
5237 if (a.peekValue(attr) != null) { 5238 setDefaultFocusHighlightEnabled(a.getBoolean(attr, true)); 5239 } 5240 break;
也就是说,如果定义的View的布局中设置了如下属性值,将会读取保存给成员 mDefaultFocusHighlightEnabled
<item name="android:defaultFocusHighlightEnabled">false</item>
有set就有get方法:
10431 public final boolean getDefaultFocusHighlightEnabled() { 10432 return mDefaultFocusHighlightEnabled;