CheckedTextView: TextView ที่มีสถานะ Checkable
CheckedTextView เป็นคลาสที่สืบทอดมาจาก TextView และ implements Checkable interface ใช้สำหรับรายการที่ต้องการให้ผู้ใช้เลือก/ยกเลิกเลือก (เช่น รายการใน ListView, การตั้งค่า, ฟอร์ม) สามารถแสดงเครื่องหมายถูก (check mark) ได้อัตโนมัติ
ขั้นตอนที่ 1: สร้างโปรเจกต์ใหม่
Android Studio → File → New Project → Empty Activity
ขั้นตอนที่ 2: Layout - activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:app="https://schemas.android.com/apk/res-auto"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<CheckedTextView
android:id="@+id/checkedTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="CheckedTextView - กดเพื่อเลือก"
android:textSize="22sp"
android:padding="24dp"
android:checkMark="?android:attr/listChoiceIndicatorMultiple"
android:background="?android:attr/selectableItemBackground"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
คุณสมบัติสำคัญ:
android:checkMark- ไอคอนเครื่องหมายถูก (ใช้ built-in หรือ drawable ของตัวเอง)android:background- ให้ ripple effect เมื่อกด
ขั้นตอนที่ 3: MainActivity.java
package com.example.checkedtextviewdemo;
import android.os.Bundle;
import android.view.View;
import android.widget.CheckedTextView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
private CheckedTextView checkedTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
checkedTextView = findViewById(R.id.checkedTextView);
// ตั้งค่าเริ่มต้น
checkedTextView.setChecked(false);
checkedTextView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// สลับสถานะ checked
checkedTextView.toggle();
// หรือตั้งค่าโดยตรง
// checkedTextView.setChecked(!checkedTextView.isChecked());
String status = checkedTextView.isChecked() ? "✅ เลือกแล้ว" : "⬜ ยังไม่เลือก";
Toast.makeText(MainActivity.this, status, Toast.LENGTH_SHORT).show();
}
});
}
}
การใช้งานใน ListView/RecyclerView (Pattern แบบคลาสสิก)
CheckedTextView มักใช้ร่วมกับ ListView ที่มี CHOICE_MODE_MULTIPLE หรือ CHOICE_MODE_SINGLE
<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:choiceMode="multipleChoice" />
// ใน Adapter getView()
CheckedTextView checkedTextView = (CheckedTextView) convertView;
if (checkedTextView == null) {
checkedTextView = new CheckedTextView(context);
checkedTextView.setCheckMarkDrawable(android.R.drawable.checkbox_on_background);
}
checkedTextView.setText(items.get(position));
checkedTextView.setChecked(checkedItems.get(position));
return checkedTextView;
การปรับแต่ง Check Mark แบบกำหนดเอง
สร้าง res/drawable/custom_check_mark.xml:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="https://schemas.android.com/apk/res/android">
<item android:state_checked="true">
<vector xmlns:android="https://schemas.android.com/apk/res/android"
android:width="24dp" android:height="24dp"
android:viewportWidth="24" android:viewportHeight="24">
<path android:fillColor="#4CAF50" android:pathData="M9,16.17L4.83,12l-1.42,1.41L9,19 21,7l-1.41-1.41L9,16.17z"/>
</vector>
</item>
<item android:state_checked="false">
<vector xmlns:android="https://schemas.android.com/apk/res/android"
android:width="24dp" android:height="24dp"
android:viewportWidth="24" android:viewportHeight="24">
<path android:fillColor="#CCCCCC" android:pathData="M19,19H5V5H19V19ZM19,3H5C3.89,3 3,3.89 3,5V19C3,20.11 3.89,21 5,21H19C20.11,21 21,20.11 21,19V5C21,3.89 20.11,3 19,3Z"/>
</vector>
</item>
</selector>
ใช้ใน XML: android:checkMark="@drawable/custom_check_mark"
ความแตกต่าง CheckedTextView vs CheckBox
| คุณสมบัติ | CheckedTextView | CheckBox |
|---|---|---|
| สืบทอดจาก | TextView | Button (CompoundButton) |
| รูปแบบ | ข้อความพร้อม check mark | กล่อง checkbox แยกจากข้อความ |
| เหมาะสำหรับ | รายการใน List, เมนูตั้งค่า | ฟอร์ม, การตั้งค่า獨立 |
| Click behavior | toggle() สลับสถานะ | toggle() สลับสถานะ |
สรุป
CheckedTextView เหมาะสำหรับ UI ที่ต้องการให้ข้อความตัวเองเป็นพื้นที่กดเลือก พร้อมแสดงสถานะด้วย check mark ใช้งานง่าย แค่เรียก toggle() หรือ setChecked() และตรวจสอบด้วย isChecked()