Einstellungen Teil von Android Jetpack.

Mithilfe von Einstellungen können Nutzer die Funktionen und das Verhalten einer App ändern. Einstellungen können sich auf das Verhalten im Hintergrund auswirken, z. B. darauf, wie oft die App Daten mit der Cloud synchronisiert. Sie können aber auch weiterreichende Auswirkungen haben, z. B. auf den Inhalt und die Darstellung der Benutzeroberfläche.

Verwenden Sie die AndroidX-Preference-Bibliothek, um von Nutzern konfigurierbare Einstellungen in Ihre App einzubinden. Diese Bibliothek verwaltet die Benutzeroberfläche und interagiert mit dem Speicher, sodass Sie nur die einzelnen Einstellungen definieren müssen, die der Nutzer konfigurieren kann. Die Bibliothek enthält ein Material Design-Design, das eine einheitliche Nutzererfahrung auf allen Geräten und Betriebssystemversionen bietet.

Erste Schritte

Ein Preference ist der grundlegende Baustein der Einstellungsbibliothek. Ein Einstellungsbildschirm enthält eine Preference-Hierarchie. Sie können diese Hierarchie als XML-Ressource definieren oder eine Hierarchie im Code erstellen.

In den folgenden Abschnitten wird beschrieben, wie Sie mit der AndroidX-Einstellungen-Bibliothek einen einfachen Einstellungsbildschirm erstellen.

Bevor Sie beginnen, fügen Sie der Datei build.gradle die Abhängigkeit der Präferenzbibliothek hinzu:

Groovy

dependencies {
    implementation "androidx.preference:preference-ktx:1.2.0"
}

Kotlin

dependencies {
    implementation("androidx.preference:preference-ktx:1.2.0")
}

Nach einer Gradle-Synchronisierung können Sie mit dem XML-Teil der Aufgabe fortfahren.

Hierarchie erstellen

Rufen Sie in Ihrem Projekt den Ordner res/xml auf, erstellen Sie eine Datei preferences.xml und fügen Sie ihr den folgenden Code hinzu:

<PreferenceScreen
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <SwitchPreferenceCompat
        app:key="notifications"
        app:title="Enable message notifications"/>

    <Preference
        app:key="feedback"
        app:title="Send feedback"
        app:summary="Report technical issues or suggest new features"/>

</PreferenceScreen>

Diese Hierarchie enthält zwei Preference-Objekte: ein SwitchPreferenceCompat, mit dem Nutzer eine Einstellung aktivieren und deaktivieren können, und ein einfaches Preference ohne Widget.

Beim Erstellen einer Hierarchie muss jede Preference einen eindeutigen Schlüssel haben.

Hierarchie erhöhen

Wenn Sie eine Hierarchie aus einem XML-Attribut aufblähen möchten, erstellen Sie ein PreferenceFragmentCompat, überschreiben Sie onCreatePreferences() und geben Sie die XML-Ressource an, die aufgebläht werden soll, wie im folgenden Beispiel gezeigt:

Kotlin

class MySettingsFragment : PreferenceFragmentCompat() {
    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
        setPreferencesFromResource(R.xml.preferences, rootKey)
    }
}

Java

public class MySettingsFragment extends PreferenceFragmentCompat {
    @Override
    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
        setPreferencesFromResource(R.xml.preferences, rootKey);
    }
}

Sie können dieses Fragment dann wie jedes andere Fragment zu Ihrem Activity hinzufügen:

Kotlin

class MySettingsActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        supportFragmentManager
                .beginTransaction()
                .replace(R.id.settings_container, MySettingsFragment())
                .commit()
    }
}

Java

public class MySettingsActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getSupportFragmentManager()
                .beginTransaction()
                .replace(R.id.settings_container, new MySettingsFragment())
                .commit();
    }
}

Das Ergebnis wird in der folgenden Abbildung dargestellt:

Ein Bild, das ein Beispiel für den Bildschirm „Einstellungen“ zeigt
Abbildung 1. Ein Einstellungsbildschirm, der mit zwei Preference-Objekten erstellt wurde.

Einstellungen beobachten

Sie können ein Ereignis abrufen, wenn sich eine Einstellung ändert, indem Sie einen Listener dafür registrieren:

Kotlin

findPreference<SwitchPreferenceCompat>("notifications")
    ?.setOnPreferenceChangeListener { _, newValue ->
        Log.d("Preferences", "Notifications enabled: $newValue")
        true // Return true if the event is handled.
    }

findPreference<Preference>("feedback")
    ?.setOnPreferenceClickListener {
        Log.d("Preferences", "Feedback was clicked")
        true // Return true if the click is handled.
    }

Java

SwitchPreferenceCompat notificationsPref = findPreference("notifications");

if (notificationsPref != null) {
    notificationsPref.setOnPreferenceChangeListener((preference, newValue) -> {
        Log.d("Preferences", String.format("Notifications enabled: %s", newValue));
        return true; // Return true if the event is handled.
    });
}

Preference feedbackPref = findPreference("feedback");

if (feedbackPref != null) {
    feedbackPref.setOnPreferenceClickListener((preference) -> {
        Log.d("Preferences", "Feedback was clicked");
        return true; // Return true if the event is handled.
    });
}

Aktuellen Einstellungswert lesen

PreferenceFragmentCompat verbirgt einen Großteil der Maschinen, die zum Speichern und Lesen der Einstellungen erforderlich sind. Alles wird jedoch mit SharedPreferences gespeichert und Sie können diese Werte wie gewohnt mit SharedPreferences lesen:

Kotlin

val preferences = PreferenceManager.getDefaultSharedPreferences(this).all

preferences.forEach {
    Log.d("Preferences", "${it.key} -> ${it.value}")
}

Java

var preferences = PreferenceManager.getDefaultSharedPreferences(context).getAll();

preferences.forEach((key, value) ->{
    Log.d("Preferences", String.format("%s -> %s", key, value));
});

Im vorherigen Snippet wird eine Instanz des Standard-SharedPreferences für die App abgerufen, auf alle gespeicherten Werte zugegriffen, eine Schleife darüber ausgeführt und die Werte in Logcat ausgegeben.