Impostazione UI campo preferenza Sintesi al valore della preferenza
-
26-09-2019 - |
Domanda
Nuovo per Android, ho qualche codice quando l'utente cambia una preferenza aggiorno campo Riepilogo nella preferenza utente per essere il valore sono entrati. Tuttavia, quando viene creata l'attività di preferenza mi piacerebbe impostare i campi di riepilogo per essere i valori nelle preferenze corrispondenti. Si prega di avvisare. Grazie.
public class MyPreferenceActivity extends PreferenceActivity implements
OnSharedPreferenceChangeListener {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preference);
SharedPreferences sp = getPreferenceScreen().getSharedPreferences();
sp.registerOnSharedPreferenceChangeListener(this);
}
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
String key) {
Preference pref = findPreference(key);
if (pref instanceof EditTextPreference) {
EditTextPreference etp = (EditTextPreference) pref;
pref.setSummary(etp.getText());
}
}
}
Soluzione
Sono anche in modo non può essere il codice migliore, ma questo è simile a quello che sto facendo. Probabilmente si desidera registrare voi ascoltatore onResume e annullare la registrazione è OnPause se piuttosto che onCreate. Spero che questo aiuta.
Principalmente si solo bisogno di afferrare il pref, il valore pref e impostare il riepilogo.
public class MyPreferenceActivity extends PreferenceActivity implements
OnSharedPreferenceChangeListener {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preference);
SharedPreferences sp = getPreferenceScreen().getSharedPreferences();
EditTextPreference editTextPref = (EditTextPreference) findPreference("thePrefKey");
editTextPref
.setSummary(sp.getString("thePrefKey", "Some Default Text"));
}
protected void onResume() {
super.onResume();
getPreferenceScreen().getSharedPreferences()
.registerOnSharedPreferenceChangeListener(this);
}
protected void onPause() {
super.onPause();
getPreferenceScreen().getSharedPreferences()
.unregisterOnSharedPreferenceChangeListener(this);
}
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
String key) {
Preference pref = findPreference(key);
if (pref instanceof EditTextPreference) {
EditTextPreference etp = (EditTextPreference) pref;
pref.setSummary(etp.getText());
}
}
}
Altri suggerimenti
Questo ha funzionato per me.
public class PrefsActivity extends PreferenceActivity implements OnSharedPreferenceChangeListener
{
private Preference pref;
private String summaryStr;
String prefixStr;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.prefs);
SharedPreferences sharedPref = getPreferenceScreen().getSharedPreferences();
sharedPref.registerOnSharedPreferenceChangeListener(this);
}
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key)
{
//Get the current summary
pref = findPreference(key);
summaryStr = (String)pref.getSummary();
//Get the user input data
prefixStr = sharedPreferences.getString(key, "");
//Update the summary with user input data
pref.setSummary(summaryStr.concat(": [").concat(prefixStr).concat("]"));
}
}
Quello che faccio di solito è:
1 - fare una nuova classe che estende il tipo di preferenza che ho bisogno di spettacolo (1 per tipo di preferenza)
2 - Dentro il suo codice, fare l'actiob appropriata per mostrare la versione aggiornata sintesi
3 - Fare riferimento questa classe nel res / xml / preferences.xml file
Lasciatemi SWO un piccolo esempio, buono per un EditTextPreference:
CLS_Prefs_Edit.java
/**
* CLS_Prefs_Edit class
*
* This is the class that allows for a custom EditTextPrefence
* (auto refresh summary).
*
* @category Custom Preference
* @author Luca Crisi (luca.crisi.lc@gmail.com)
* @copyright Luca Crisi
* @version 1.0
*/
package com.your_name.your_app;
/* -------------------------------- Imports --------------------------------- */
import android.content.Context;
import android.preference.EditTextPreference;
import android.util.AttributeSet;
public final class CLS_Prefs_Edit
extends EditTextPreference
{
/* ---------------------------- Constructors ---------------------------- */
public CLS_Prefs_Edit(final Context ctx, final AttributeSet attrs)
{
super(ctx, attrs);
}
public CLS_Prefs_Edit(final Context ctx)
{
super(ctx);
}
/* ----------------------------- Overrides ------------------------------ */
@Override
public void setText(final String value)
{
super.setText(value);
setSummary(getText());
}
}
res / xml / preferences.xml
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
>
<PreferenceCategory android:title="@string/pref_phone_cat">
<!-- NORMAL EditTextPreference, NO summary update -->
<!-- <EditTextPreference -->
<!-- android:widgetLayout="@layout/arr_dn" -->
<!-- android:key="phone" -->
<!-- android:title="@string/pref_phone_title" -->
<!-- android:summary="@string/pref_phone_summ" -->
<!-- android:defaultValue="" -->
<!-- android:inputType="phone" -->
<!-- android:digits="+1234567890" -->
<!-- /> -->
<!-- MY EditTextPreference, WITH summary update -->
<com.your_name.your_app.CLS_Prefs_Edit
android:widgetLayout="@layout/arr_dn"
android:key="phone"
android:title="@string/pref_phone_title"
android:summary="@string/pref_phone_summ"
android:defaultValue=""
android:inputType="phone"
android:digits="+1234567890"
/>
</PreferenceCategory>
</PreferenceScreen>
Naturalmente, impostare le stringhe in / RES / valori / le stringhe, e il gioco è fatto.
Nota che questa soluzione funziona per entrambe le PreferenceFragments e PreferenceActivities .
Sto usando per un App tha gira su 2.2 Froyo (che mostra una PreferenceActivity), così come il 4.4 KitKat (mostrando un PreferenceFragment)
Spero che aiuta.
In primo luogo, per la classe:
class SettingsFragment : SettingsBaseFragment(),
// Make sure you implement the OnSharedPreferenceChangeListener
SharedPreferences.OnSharedPreferenceChangeListener,
Preference.OnPreferenceClickListener {}
In seguito, nella onSharedPreferenceChanged
, si ha un riferimento al sharedPreference, che è possibile utilizzare per ottenere il risultato preferenza. Quindi è possibile utilizzare l'ultimo risultato si ottiene per alterare il sommario:
override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) {
when (key) {
SETTINGS_AUTO_SETTLEMENT -> refreshSummaryForAutoSettlement(sharedPreferences?.getBoolean(SETTINGS_AUTO_SETTLEMENT, false))
}
}
// helper function for altering the summary for the preference
private fun refreshSummaryForAutoSettlement(isAutoSettlementEnabled: Boolean?) {
when (isAutoSettlementEnabled != null && isAutoSettlementEnabled) {
true -> findPreference(SETTINGS_AUTO_SETTLEMENT).summary = getString(R.string.auto_settlement_enabled_summary)
false -> findPreference(SETTINGS_AUTO_SETTLEMENT).summary = getString(R.string.auto_settlement_disabled_summary)
}
}