Android 实现子View的状态跟随父容器的状态

时间:2023-12-09 20:34:37

最近自学着做东西,需要做一个效果,就是我ListView的Item点击下或者选中的时候,我Item里面的各个组件的状态要和我Item的状态保持一直,这样我就可以用XML,去根据组件的不同状态去实现不同的效果。那么,我发现了XML的一条属性

< android:duplicateParentState="true" />

这条属性是什么意思呢? 我个人根据字面理解为:(duplicate)复制(Parent)父母(State)状态-----即:复制父容器的状态,也就是说,这条属性是需要加在子组件上的,带有这个属性的子组件,他的状态会和父容器的状态一样。

l例如,这是我ListView的Item的布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="100dp">
<!-- android:duplicateParentState="true" 跟随父组件的状态变化而变化 -->
<TextView
android:id="@+id/tv_showBackColor_lvItem"
android:layout_width="5dp"
android:layout_height="match_parent"
android:background="@drawable/tv_show_backcolor_lv_menu"
android:duplicateParentState="true"/>
<ImageView
android:id="@+id/iv_showIcon_lvItem"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginLeft="20dp"
android:layout_marginStart="20dp"
android:duplicateParentState="true"/>
<TextView
android:id="@+id/tv_showInfo_lvItem"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="测试测试"
android:textSize="20sp"
android:layout_gravity="center_vertical"
android:paddingTop="20dp"
android:paddingBottom="20dp"
android:textColor="@drawable/tv_show_textcolor_lv_menu"
android:layout_marginLeft="30dp"
android:duplicateParentState="true"/>
</LinearLayout>

那么这时候,我的TextView和ImageView都带有这条属性,所以他们的状态就和我ListView的Item的状态一致,那么我就可以用XML去实现效果

drawable 的代码

 <?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true" android:drawable="@color/tv_showColor_lv_menuLeft" /> <!-- focused -->
<item android:state_pressed="true" android:drawable="@color/tv_showColor_lv_menuLeft" /> <!-- pressed -->
<item android:state_selected="true" android:drawable="@color/tv_showColor_lv_menuLeft" /> <!-- pressed -->
<item android:drawable="@color/tv_showColor_lv_menuLeft_enable" /> <!-- default -->
</selector>

这个时候,就可以根据Item的状态  ,去让TextView和ImageView去根据不同的状态,曲线是不同的效果