Ein/Aus-Schaltflächen hinzufügen

Schreiben Sie jetzt
Jetpack Compose ist das empfohlene UI-Toolkit für Android. Informationen zum Hinzufügen von Komponenten in Compose

Wenn du ein View-basiertes Layout verwendest, gibt es drei Hauptmöglichkeiten zum Implementieren von Ein-/Aus-Schaltflächen. Wir empfehlen die Verwendung der Komponente SwitchMaterial aus der Bibliothek Materialkomponenten:

<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>

Legacy-Anwendungen verwenden möglicherweise weiterhin die ältere AppCompat-Komponente SwitchCompat, wie im folgenden Beispiel gezeigt:

<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>

Das folgende Beispiel zeigt AppCompatToggleButton, eine weitere ältere Komponente mit einer deutlich anderen Benutzeroberfläche:

<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>

Diese drei Komponenten verhalten sich gleich, sehen aber unterschiedlich aus. Die Unterschiede zwischen SwitchMaterial und SwitchCompat sind subtil, aber AppCompatToggleButton unterscheidet sich deutlich:

Die Steuerelemente „SwitchMaterial“, „SwitchCompat“ und „AppCompatToggleButton“

Abbildung 1. Drei Arten von Ein-/Aus-Schaltflächen.

Statusänderungen verarbeiten

SwitchMaterial, SwitchCompat und AppCompatToggleButton sind abgeleitete Klassen von CompoundButton und bieten ihnen daher einen gemeinsamen Mechanismus für die Verarbeitung geprüfter Statusänderungen. Dazu implementierst du eine Instanz von CompoundButton.OnCheckedChangeListener und fügst sie der Schaltfläche hinzu, wie im folgenden Beispiel gezeigt:

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 ist eine einzelne abstrakte Methodenschnittstelle (oder SAM-Schnittstelle). Sie können sie also als Lambda implementieren. Die Lambda-Funktion wird immer dann aufgerufen, wenn sich der Status ändert. Der Wert des booleschen isChecked-Werts, der an die Lambda-Funktion übergeben wird, gibt den neuen Status an.