我们知道,让一个布局或者控件随着状态(是否获取焦点),改变背景颜色可以通过在drawable目录下创建selector来实现。
前些日子UI出了一个设计:列表(RecyclerView)展示数据,每一个item都是一个RelativeLayout的布局,item获取焦点之后,RelativeLayout的背景颜色和里面的TextView的颜色都会发生变化。
下面是item的layout文件:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="@dimen/dp_452" android:layout_height="@dimen/dp_93" android:background="@drawable/selector_friend_bg" android:focusable="true"> <TextView android:id="@+id/item_writer" android:layout_width="wrap_content" android:layout_height="wrap_content" android:duplicateParentState="true" android:layout_centerInParent="true" android:textColor="@drawable/selector_btn_txt" android:textSize="@dimen/dp_17" /> </RelativeLayout>
RelativeLayout布局设置android:focusable="true",背景设置需要的selector。
重点是子控件TextView设置属性android:duplicateParentState="true",该属性的意思是重复父控件焦点状态。然后再把TextView的字体颜色设置需要的selector。
Tips:android:duplicateParentState="true"属性可以依次向下传递,比如RelativeLayout中包裹RelativeLayout然后是TextView,可以把两个RelativeLayout和最终的TextView依次设置android:duplicateParentState="true",即可把焦点状态从第一个RelativeLayout传递到最终的TextView。