最近被报了一个bug,说是一个图标按钮的colorFilter属性本来不该为true的,但实际却总是为true。
自定义属性的相关语句如下:
mIsColorFilter = typedArray.getBoolean(R.styleable.RightTextImageView_need_color_filter, true);
可以看到这个值按理应从layout文件中获取,如果用户没有设置,则默认为true。
但通过检查layout文件中的属性设置,发现出问题的图标layout中,引用了一个style,在style中该属性为false,而同一列中其他图标(使用的是同一个自定义view)也使用了该style文件,也能正常呈现为false的状态。也就是说,只有出问题的那个图标没有正常应用到style文件中的false属性。
<LinearLayout
android:gravity="center_vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<cn.wps.moffice.common.beans.RightTextImageView
android:id="@+id/item_edit"
style="@style/pdf_toolbar_icon_edit_text_image"
android:drawableLeft="@drawable/pad_pdf_text_edit_icon"
android:text="@string/pdf_text_edit"
android:visibility="gone"/>
<TextView
android:id="@+id/edit_limit_free_btn"
style="@style/limit_free_btn_style"
android:layout_height="match_parent"
android:layout_marginStart="-4dp"
android:layout_marginEnd="10dp"
android:gravity="center"
android:visibility="gone"
tools:background="@color/premium_red"
tools:visibility="visible" />
</LinearLayout>
<LinearLayout
android:gravity="center_vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<cn.wps.moffice.common.beans.RightTextImageView
android:id="@+id/item_image"
style="@style/pdf_toolbar_icon_edit_text_image"
android:drawableLeft="@drawable/pad_pdf_image_edit_icon"
android:text="@string/pdf_image_edit"
android:visibility="gone" />
<TextView
android:id="@+id/image_limit_free_btn"
android:gravity="center"
style="@style/limit_free_btn_style"
android:visibility="gone"
android:layout_marginStart="-4dp"
android:layout_marginEnd="10dp"
tools:background="@color/premium_red"
tools:visibility="visible" />
</LinearLayout>
……
<item name="android:background">@drawable/pad_pdf_titlebar_item_icon_text_selector</item>
<item name="need_color_filter">false</item>
<item name="android:paddingBottom">0dp</item>
……
那问题应该就出在控件初始化时的问题了,通过debugger和打log,输出这个自定义控件的所有被创建对象的属性,也发现这个id的对象和其他不同,其他都能正常为false,只有它为默认值true(或被设为true)。
于是搜索所有这个id的控件,发现有两处地方有以此命名的控件,并分别使用了不同的style,其他一个style没有设置colorFilter属性,从而导致覆盖了使用了默认值。在更换成同样的style后问题解决了。
//todo:需要继续跟进的一些想法:
1、是否不同layout、不同view、使用相同UI View的类的条目,设置了相同的id后,只会胜场一个对象?
2、是否相同id的条目,属性会互相覆盖?从而导致了这类问题?
但按照这次的事件来说,id设置为非唯一,似乎并不妥当,也是以后要注意的一个点