Einstellungen anpassen Teil von Android Jetpack

In diesem Dokument wird beschrieben, wie Sie Preference-Objekte in Ihrer Hierarchie.

Einstellungen aufrufen

So greifen Sie auf ein einzelnes Preference zu, beispielsweise beim Abrufen oder Festlegen eines Wert Preference, verwenden PreferenceFragmentCompat.findPreference() Diese Methode sucht in der gesamten Hierarchie nach einem Preference mit dem angegebenen Schlüssel.

Um beispielsweise auf ein EditTextPreference mit einem Schlüssel von "signature", gehen Sie so vor:

<EditTextPreference
        app:key="signature"
        app:title="Your signature"/>

Rufen Sie diese Preference mit dem folgenden Code ab:

Kotlin

override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
    setPreferencesFromResource(R.xml.preferences, rootKey)
    val signaturePreference: EditTextPreference? = findPreference("signature")
    // Do something with this preference.
}

Java

@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
    setPreferencesFromResource(R.xml.preferences, rootKey);
    EditTextPreference signaturePreference = findPreference("signature");
    // Do something with this preference.
}

Sichtbarkeit der Einstellungen verwalten

Sie können festlegen, welche Preference-Objekte für den Nutzer sichtbar sind, wenn sie navigiere zu einem Einstellungsbildschirm. Wenn beispielsweise eine bestimmte Preference nur dann aussagekräftig, wenn eine entsprechende Funktion aktiviert ist, können Sie Preference, wenn die Funktion deaktiviert ist.

Damit ein Preference nur dann angezeigt wird, wenn eine Bedingung erfüllt ist, legen Sie zuerst die Preference fest. Sichtbarkeit in der XML auf false, wie im folgenden Beispiel gezeigt:

<EditTextPreference
        app:key="signature"
        app:title="Your signature"
        app:isPreferenceVisible="false"/>

In onCreatePreferences() wird Preference angezeigt, wenn die entsprechende Bedingung erfüllt ist:

Kotlin

override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
    setPreferencesFromResource(R.xml.preferences, rootKey)
    if(/*some feature*/) {
        val signaturePreference: EditTextPreference? = findPreference("signature")
        signaturePreference?.isVisible = true
    }
}

Java

@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
    setPreferencesFromResource(R.xml.preferences, rootKey);
    if(/*some feature*/) {
        EditTextPreference signaturePreference = findPreference("signature");
        if (signaturePreference != null) {
            signaturePreference.setVisible(true);
        }
    }
}

Zusammenfassungen dynamisch aktualisieren

Ein Preference, der Daten enthält, muss den aktuellen Wert in seiner Zusammenfassung, damit Nutzer den aktuellen Status der Preference Ein EditTextPreference muss beispielsweise den gespeicherten Text anzeigen und ListPreference muss den ausgewählten Listeneintrag anzeigen. Sie können auch haben Preference Objekte, deren Zusammenfassung basierend auf internen oder Status einer externen App, z. B. eine Preference, die eine Version anzeigt Nummer. Dazu können Sie ein SummaryProvider

SimpleSummaryProvider verwenden

ListPreference und EditTextPreference einfache SummaryProvider-Implementierungen enthalten, die automatisch hat Preference-Wert als Zusammenfassung gespeichert. Wenn kein Wert gespeichert wird, wird „Keine festgelegt.“

Um diese Implementierungen aus XML zu aktivieren, legen Sie Folgendes fest: app:useSimpleSummaryProvider="true"

Alternativ können Sie im Code ListPreference.SimpleSummaryProvider.getInstance() und EditTextPreference.SimpleSummaryProvider.getInstance() um die einfache SummaryProvider-Instanz abzurufen und auf der Preference, wie im folgenden Beispiel gezeigt:

Kotlin

listPreference.summaryProvider = ListPreference.SimpleSummaryProvider.getInstance()
editTextPreference.summaryProvider = EditTextPreference.SimpleSummaryProvider.getInstance()

Java

listPreference.setSummaryProvider(ListPreference.SimpleSummaryProvider.getInstance());
editTextPreference.setSummaryProvider(EditTextPreference.SimpleSummaryProvider.getInstance());

Benutzerdefinierten SummaryProvider verwenden

Sie können Ihre eigene SummaryProvider erstellen und provideSummary() , um die Zusammenfassung anzupassen, wenn sie vom Preference angefordert wird. Für Beispiel: Die folgende EditTextPreference zeigt die Länge der gespeicherten Wert als Zusammenfassung verwenden:

<ph type="x-smartling-placeholder">
</ph> Ein Bild mit einem Beispiel für „EditTextPreference“ <ph type="x-smartling-placeholder">
</ph> Abbildung 1: Ein Beispiel für EditTextPreference.

Nehmen wir als Beispiel die folgende EditTextPreference an:

<EditTextPreference
        app:key="counting"
        app:title="Counting preference"/>

In onCreatePreferences() können Sie eine neue SummaryProvider erstellen und überschreiben provideSummary(), um die anzuzeigende Zusammenfassung zurückzugeben:

Kotlin

val countingPreference: EditTextPreference? = findPreference("counting")

countingPreference?.summaryProvider = SummaryProvider<EditTextPreference> { preference ->
    val text = preference.text
    if (text.isNullOrEmpty()) {
        "Not set"
    } else {
        "Length of saved value: " + text.length
    }
}

Java

EditTextPreference countingPreference = findPreference("counting");

if (countingPreference != null) {
    countingPreference.setSummaryProvider(new SummaryProvider<EditTextPreference>() {
        @Override
        public CharSequence provideSummary(EditTextPreference preference) {
            String text = preference.getText();
            if (TextUtils.isEmpty(text) || text == null){
                return "Not set";
            }
            return "Length of saved value: " + text.length();
        }
    });
}

In der Zusammenfassung „Preference“ wird die Länge des gespeicherten Werts oder „Nicht festgelegt“ angezeigt wenn kein gespeicherter Wert vorhanden ist.

Dialogfeld „EditTextPreference“ anpassen

In einem EditTextPreference-Dialogfeld können Sie das Textfeldverhalten anpassen, indem Sie Anhängen eines OnBindEditTextListener Dieser Listener wird aufgerufen, wenn dem Nutzer das Dialogfeld angezeigt wird.

Beispielsweise können Sie ein Dialogfeld so anpassen, dass nur Zahlen akzeptiert werden. Erstellen Sie zuerst EditTextPreference:

<EditTextPreference
        app:key="number"
        app:title="Numbers only preference"/>

Erstellen Sie als Nächstes in onCreatePreferences() eine neue OnBindEditTextListener und onBindEditText() überschreiben, um EditText anzupassen, wenn sie dem Nutzer.

Kotlin

val numberPreference: EditTextPreference? = findPreference("number")

numberPreference?.setOnBindEditTextListener { editText ->
    editText.inputType = InputType.TYPE_CLASS_NUMBER
}

Java

EditTextPreference numberPreference = findPreference("number");

if (numberPreference != null) {
    numberPreference.setOnBindEditTextListener(
            new EditTextPreference.OnBindEditTextListener() {
                @Override
                public void onBindEditText(@NonNull EditText editText) {
                    editText.setInputType(InputType.TYPE_CLASS_NUMBER);
                }
            });
}

Wenn der Nutzer das Dialogfeld sieht, öffnet sich die Tastatur nun in numerischer Form Modus, sodass der Nutzer nur Zahlen in die EditText eingeben kann.

Aktionen für Einstellungen

Ein Preference kann beim Antippen eine bestimmte Aktion ausführen. Beispiel: Preference kann als Link zu einem separaten Teil deiner App fungieren. So fügen Sie eine Aktion hinzu: mit einem Preference verknüpft sind, können Sie direkt im Preference eine Intent festlegen. kann Folgendes festlegen: OnPreferenceClickListener für eine spezifischere Logik.

Intent festlegen

Sie können einen Intent auf einem Preference festlegen, um einen neuen Fragment zu starten. Activity oder eine separate App verwenden, wenn Preference angetippt wird. Dies ist die wie bei der Verwendung von Context.startActivity() mit einem bestimmten Intent.

Du kannst ein Intent in XML mit einem verschachtelten <intent>-Tag festlegen. Die folgenden In diesem Beispiel wird ein Intent definiert, das ein Activity startet:

<Preference
        app:key="activity"
        app:title="Launch activity">
    <intent
            android:targetPackage="com.example"
            android:targetClass="com.example.ExampleActivity"/>
</Preference>

Alternativ können Sie setIntent() so direkt für Preference verwenden:

Kotlin

val intent = Intent(context, ExampleActivity::class.java)
activityPreference.setIntent(intent)

Java

Intent intent = new Intent(getContext(), ExampleActivity.class);
activityPreference.setIntent(intent);

Sie können Extras auch mit einem Intent unter Verwendung von XML einfügen:

<Preference
        app:key="activity"
        app:title="Launch activity">
    <intent
            android:targetPackage="com.example"
            android:targetClass="com.example.ExampleActivity">
        <extra
                android:name="example_key"
                android:value="example_value"/>
    </intent>
</Preference>

Hier ein Beispiel für ein Preference mit einem Intent, das eine Webseite aufruft:

<Preference
        app:key="webpage"
        app:title="View webpage">
    <intent
            android:action="android.intent.action.VIEW"
            android:data="http://www.google.com" />
</Preference>

Kotlin

val intent = Intent(Intent.ACTION_VIEW)
intent.data = Uri.parse("http://www.google.com")

val webpagePreference = findPreference("webpage")
webpagePreference?.intent = intent

Java

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.google.com"));
webpagePreference.setIntent(intent);

OnPreferenceClickListener

Sie können ein OnPreferenceClickListener auf einem Preference festlegen, wodurch ein Callback von onPreferenceClick() an, wenn auf Preference getippt wird. Beispiel: Mit dem Listener können Sie zu einer anderen Fragment oder Activity wechseln, wenn Sie eine komplexere Logik für die Navigation haben.

Zum Festlegen eines OnPreferenceClickListener verwenden Sie Code ähnlich dem folgenden:

Kotlin

onClickPreference.setOnPreferenceClickListener({
    // Do something.
    true
})

Java

onClickPreference.setOnPreferenceClickListener(preference -> {
    // Do something.
    return true;
});