如下图,这是一组自定义的选择 group 。
左边为 group 中没有 item 被选择,右边 group 中是有一个 item 被选择,item 被选择时的 style 如上图显示,这个自定义 view 比 checkbox 更美观。
选择 group 中的一个 item 的布局如下(check_item.xml)
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_marginTop="8dp"
android:layout_marginBottom="11dp"
android:layout_marginHorizontal="5dp"
android:id="@+id/item"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:clickable="true">
<TextView
android:id="@+id/item_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="9dp"
android:paddingVertical="10dp"
android:layout_gravity="right"
android:gravity="center"
android:text="餐前"
android:textColor="@color/light_black"
android:textSize="12dp"
android:background="@drawable/item_corners_view"
android:duplicateParentState="true"/>
<ImageView
android:id="@+id/item_imageview"
android:layout_marginRight="9dp"
android:layout_width="18dp"
android:layout_height="18dp"
android:layout_gravity="right"
android:background="@drawable/item_image"
android:visibility="invisible"
android:duplicateParentState="true"/>
</FrameLayout>
利用 FrameLayout 的特性,ImageView 可以显示 TextView 之上。在这里我默认 ImageView 为不可见,当这个 item 获得焦点之后,再将其设为可见。
我创建了一个 Java 类,这个类继承于View,这个 Java 类的布局设为 check_item.xml (即上面的那个 group 中的item布局)。在这个类中,我可以现实 item 获得焦点、改变 style 等需要的动作。
然后在布局中使用自定义的 View 就可以了,上图 group 中我向布局中添加了三个自定义的 View ,然后在逻辑里用一个布尔数组来标识这三个 Veiw 。若我要实现的是 group 的单选功能,这个布尔数组中只有一个值为 true ,当某个 item 获得焦点后,这个布尔数组对应的这个 item 的值为true,其他都设为false;若 group 需要实现的多选功能,当 item 获得焦点后只需将其对应的布尔数组的值设为 false 即可。