Nếu bạn đang sử dụng bố cục dựa trên View
, thì có ba lựa chọn chính để triển khai nút bật/tắt. Bạn nên dùng thành phần SwitchMaterial
trong thư viện Thành phần Material:
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp">
<com.google.android.material.switchmaterial.SwitchMaterial
android:id="@+id/material_switch"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/material_switch"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
Các ứng dụng cũ có thể vẫn sử dụng thành phần AppCompat SwitchCompat
cũ, như trong ví dụ sau:
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp">
<androidx.appcompat.widget.SwitchCompat
android:id="@+id/switchcompat"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/switchcompat"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
Ví dụ sau đây cho thấy
AppCompatToggleButton
,
một thành phần cũ khác có giao diện người dùng khác biệt đáng kể:
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp">
<TextView
android:id="@+id/toggle_button_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toStartOf="@id/toggle"
app:layout_constraintHorizontal_chainStyle="packed"
app:layout_constraintBaseline_toBaselineOf="@id/toggle"
android:text="@string/toggle_button" />
<androidx.appcompat.widget.AppCompatToggleButton
android:id="@+id/toggle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/toggle_button_label"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>
Ba thành phần này cung cấp hành vi giống nhau nhưng trông khác nhau. Sự khác biệt giữa SwitchMaterial
và SwitchCompat
là rất nhỏ, nhưng AppCompatToggleButton
có sự khác biệt đáng kể:
Xử lý các thay đổi về trạng thái
SwitchMaterial
, SwitchCompat
và AppCompatToggleButton
đều là các lớp con của CompoundButton
, cung cấp cho chúng một cơ chế chung để xử lý các thay đổi về trạng thái đã đánh dấu. Bạn triển khai một thực thể của CompoundButton.OnCheckedChangeListener
và thêm thực thể đó vào nút, như trong ví dụ sau:
Kotlin
class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val binding: SwitchLayoutBinding = SwitchLayoutBinding.inflate(layoutInflater) setContentView(binding.root) binding.materialSwitch.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { // The switch is checked. } else { // The switch isn't checked. } } } }
Java
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); SwitchLayoutBinding binding = SwitchLayoutBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); binding.materialSwitch.setOnCheckedChangeListener((buttonView, isChecked) -> { if (isChecked) { // The switch is checked. } else { // The switch isn't checked. } }); } }
CompoundButton.OnCheckedChangeListener
là giao diện phương thức trừu tượng đơn lẻ (hoặc giao diện SAM), vì vậy, bạn có thể triển khai giao diện này dưới dạng lambda. Lambda được gọi bất cứ khi nào trạng thái đã đánh dấu thay đổi và giá trị của boolean isChecked
được truyền vào lambda cho biết trạng thái đã đánh dấu mới.