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:
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
setPreferencesFromResource(R.xml.preferences, rootKey)
val signaturePreference: EditTextPreference? = findPreference("signature")
// Do something with this preference.
}
@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:
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
setPreferencesFromResource(R.xml.preferences, rootKey)
if(/*some feature*/) {
val signaturePreference: EditTextPreference? = findPreference("signature")
signaturePreference?.isVisible = true
}
}
@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:
listPreference.summaryProvider = ListPreference.SimpleSummaryProvider.getInstance()
editTextPreference.summaryProvider = EditTextPreference.SimpleSummaryProvider.getInstance()
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:

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:
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
}
}
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.
val numberPreference: EditTextPreference? = findPreference("number")
numberPreference?.setOnBindEditTextListener { editText ->
editText.inputType = InputType.TYPE_CLASS_NUMBER
}
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:
val intent = Intent(context, ExampleActivity::class.java)
activityPreference.setIntent(intent)
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>
val intent = Intent(Intent.ACTION_VIEW)
intent.data = Uri.parse("http://www.google.com")
val webpagePreference = findPreference
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:
onClickPreference.setOnPreferenceClickListener({
// Do something.
true
})
onClickPreference.setOnPreferenceClickListener(preference -> {
// Do something.
return true;
});