AppCompatCheckedTextView是继承自CheckedTextView的,在Androidx中进行支持。CheckedTextView可以看成是CheckBox、RadioGroup、TextView的组合使用,可以显示文字的同时进行单选或者复选。
当我们配合CheckedTextView使用ListView(RecyclerView不支持该方法的使用)时,使用setChoiceMode设置CHOICE_MODE_SINGLE或者CHOICE_MODE_MULTIPLE时即将列表选项设置为了单选或者多选列表。
List<String> mData = new ArrayList<>();
for (int i = 0; i < 5; i++) {
mData.add("item" + i);
}
ListView listView = findViewById(R.id.lv_single);
//通过listView设置模式 CHOICE_MODE_SINGLE(单选模式)
listView.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE);
// 或者使用系统默认的布局 ,布局只决定显示样式,不决定是是单选还是复选模式
// android.R.layout.simple_list_item_single_choice 显示的是圆的选择框
// android.R.layout.simple_list_item_multiple_choice 显示的是方框的选择框
ArrayAdapter adapter = new ArrayAdapter(this, R.layout.item_checked_textview);
adapter.addAll(mData);
listView.setAdapter(adapter);
// activity_main.xml文件如下:
<ListView
android:id="@+id/lv_single"
android:layout_width="match_parent"
android:layout_height="match_parent">
</ListView>
item_checked_textview.xml文件如下:
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
android:layout_width="match_parent"
android:layout_height="?android:attr/listPreferredItemHeightSmall"
android:checkMark="@drawable/selector_checked_textview"
android:gravity="center_vertical"
android:minHeight="?android:attr/listPreferredItemHeight"
android:paddingStart="?android:attr/listPreferredItemPaddingStart"
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
android:textAppearance="?android:attr/textAppearanceLarge"
android:textColor="@color/blue_trans" />
<!-- android:checkMark="?android:attr/listChoiceIndicatorSingle" 显示的是圆形风格勾选框 -->
<!-- android:checkMark="?android:attr/listChoiceIndicatorMultiple" 显示的是方形风格勾选框 -->
<!-- android:textAppearance="?android:attr/textAppearanceListItemSmall" 文字风格 -->
<!-- android:textColor="?android:attr/textColorAlertDialogListItem" 文字的颜色-->
selector_checked_textview.xml文件如下:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/checked" android:state_selected="true" />
<item android:drawable="@drawable/checked" android:state_pressed="true" />
<item android:drawable="@drawable/checked" android:state_checked="true" />
<item android:drawable="@drawable/unchecked" />
</selector>
drawable="@drawable/unchecked"和drawable="@drawable/checked"用的两张图片。
// 未被选中的矢量图片
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="32dp"
android:height="32dp"
android:viewportWidth="1024"
android:viewportHeight="1024">
<path
android:pathData="M120.47,177.69v662.59c0,30.12 24.09,60.24 60.24,60.24h662.59c30.12,0 60.24,-24.09 60.24,-60.24v-662.59c0,-30.12 -24.09,-60.24 -60.24,-60.24h-662.59c-36.14,0 -60.24,30.12 -60.24,60.24zM60.24,177.69c0,-66.26 54.21,-120.47 120.47,-120.47h662.59c66.26,0 120.47,54.21 120.47,120.47v662.59c0,66.26 -54.21,120.47 -120.47,120.47h-662.59c-66.26,0 -120.47,-54.21 -120.47,-120.47v-662.59z"
android:fillColor="#bfbfbf"/>
</vector>
//被选中的矢量图片
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="32dp"
android:height="32dp"
android:viewportWidth="1024"
android:viewportHeight="1024">
<path
android:pathData="M849.32,334.31l-48.19,-48.19 -409.6,415.62 -168.66,-168.66 -48.19,42.16 216.85,216.85z"
android:fillColor="#13227a"/>
<path
android:pathData="M120.47,177.69v662.59c0,30.12 24.09,60.24 60.24,60.24h662.59c30.12,0 60.24,-24.09 60.24,-60.24v-662.59c0,-30.12 -24.09,-60.24 -60.24,-60.24h-662.59c-36.14,0 -60.24,30.12 -60.24,60.24zM60.24,177.69c0,-66.26 54.21,-120.47 120.47,-120.47h662.59c66.26,0 120.47,54.21 120.47,120.47v662.59c0,66.26 -54.21,120.47 -120.47,120.47h-662.59c-66.26,0 -120.47,-54.21 -120.47,-120.47v-662.59z"
android:fillColor="#13227a"/>
</vector>
属性使用补充说明:
1. 负责复选框着色。两属性只在SDK>=21中生效,且会覆盖checkMark="@drawable/selector_checked_textview"的效果
android:checkMarkTint="@android:color/black"
android:checkMarkTintMode="src_in"
xml文件修改后:
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
android:layout_width="match_parent"
android:layout_height="?android:attr/listPreferredItemHeightSmall"
android:checkMark="@drawable/selector_checked_textview"
android:gravity="center_vertical"
android:checkMarkTint="@android:color/black"
android:checkMarkTintMode="src_in"
android:minHeight="?android:attr/listPreferredItemHeight"
android:paddingStart="?android:attr/listPreferredItemPaddingStart"
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
android:textAppearance="?android:attr/textAppearanceLarge"
android:textColor="@color/blue_trans" />
图片,虚拟机API=21。
如上图片我使用android:checkMarkTint="@android:color/black"和android:checkMarkTintMode="src_in"的效果将我使用checkMark属性的效果给覆盖了。
其他常用的方法:
1.是否选中。
public boolean isChecked ()
2.为一个给定的Drawable设定检查标记。当isChecked()为true时则绘制
public void setCheckMarkDrawable (Drawable d)
3.为一个给定的Drawable设定检查标记,使用它的资源id来标识。当isChecked()为true时则绘制
public void setCheckMarkDrawable (int resid)
4.改变文本视图的选中状态
public void setChecked (boolean checked)
5.反转当前视图的选中状态
public void toggle ()
6.在单选模式下获取被选中的item的索引index
listView.getCheckedItemPosition();
7.在复选模式下获取item的选中情况Boolean集
listView.getCheckedItemPositions();
CheckedTextView使用上还是比Text和CheckBox的使用方便很多,还是推荐大家进行使用。