إذا كنت تستخدم تنسيقًا يستند إلى View
، تتوفّر ثلاثة خيارات رئيسية لتفعيل خيارات الإيقاف/التفعيل. ننصحك باستخدام المكوِّن
SwitchMaterial
من مكتبة Material
Components:
<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>
قد تظل التطبيقات القديمة تستخدم مكوِّن
SwitchCompat
AppCompat
القديم، كما هو موضَّح في المثال التالي:
<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>
يوضح المثال التالي السمة AppCompatToggleButton
، وهي مكوّن قديم آخر له واجهة مستخدم مختلفة بشكل ملحوظ:
<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>
توفِّر هذه المكوّنات الثلاثة السلوك نفسه، ولكنّها تبدو مختلفة. الفرق بين SwitchMaterial
وSwitchCompat
دقيق، ولكن AppCompatToggleButton
يختلف بشكل ملحوظ:
معالجة التغييرات في حالة الاسم
SwitchMaterial
وSwitchCompat
وAppCompatToggleButton
هي جميعها فئات فرعية
من CompoundButton
، ما يمنحها آلية شائعة للتعامل مع تغييرات الحالة التي تم التحقق منها. يمكنك تنفيذ مثيل CompoundButton.OnCheckedChangeListener
وإضافته إلى الزر، كما هو موضَّح في المثال التالي:
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
هي واجهة طريقة مجردة واحدة
(أو واجهة SAM)، لذا يمكنك تنفيذها باعتبارها lambda. تُسمى دالة lambda كلما تغيرت الحالة التي تم فحصها، وتشير قيمة القيمة المنطقية isChecked
التي يتم تمريرها إلى دالة lambda إلى الحالة المحددة الجديدة.