在LinearLayout中,如果同时为LinearLayout与子TextView设置selector,是可以实现的,代码如下
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/ll_company"
android:layout_width="match_parent"
android:layout_height="102dp"
android:layout_marginStart="25dp"
android:layout_marginEnd="25dp"
android:layout_marginBottom="20dp"
android:background="@drawable/selector_company"
android:clickable="true"
android:focusable="true"
android:focusableInTouchMode="true">
<TextView
android:id="@+id/tv_company_name"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginStart="20dp"
android:drawableStart="@mipmap/company_uncheck"
android:drawablePadding="20dp"
android:gravity="center_vertical"
android:text="test"
android:textColor="@drawable/selector_company_text"
android:textSize="19sp" />
</LinearLayout>
selector文件为:
selector_company.xml:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/company_selected" android:state_focused="true" />
<item android:drawable="@drawable/company_selected" android:state_checked="true" />
<item>
<shape>
<corners android:radius="15dp" />
<solid android:color="@color/white" />
</shape>
</item>
</selector>
selector_company_text.xml:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true" android:color="@color/white" />
<item android:state_pressed="true" android:color="@color/white" />
<item android:color="@color/title" android:state_checked="false" />
</selector>
此时,textview可以响应pressed状态,但是!!
无法与LinearLayout一样保持focused状态
解决办法:
为TextView加上
android:duplicateParentState="true"
android:duplicateParentState指的是当前控件是否跟随父控件的(点击、焦点等)状态
image.png
PS:网上有说用RadioGroup来实现,但是不适用于用RecyclerView展示的LinearLayout
PS2:尝试过使用CheckBox,但是重复点击会有checked跟unchecked状态重复切换,不适用