Qualcuno ha codice di esempio per convalidare il testo inserito dall'utente nelle preferenze? Ad esempio, ho un EditTextPreference per l'utente per inserire un indirizzo email. Mi piacerebbe convalidare il formato dell'indirizzo email inserito e far apparire una finestra di avviso se il formato non è corretto. Qualcuno ha qualche codice di esempio per questo? GrazieCome convalidare il formato e i valori di EditTextPreference inseriti in Android 2.1?
risposta
Implementare Preference.OnPreferenceChangeListener
booleano onPreferenceChange (preferenza, oggetto newValue)
chiamata quando un Preferenza è stato modificato dall'utente. Questo viene chiamato prima che lo stato della preferenza sia in procinto di essere aggiornato e prima che lo stato venga mantenuto.
Restituisce True per aggiornare lo stato della preferenza con il nuovo valore.
Quindi è possibile restituire direttamente il risultato della convalida del valore.
public class Preferences extends PreferenceActivity implements OnSharedPreferenceChangeListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
findPreference("mail_preference_key").setOnPreferenceChangeListener(
new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
return Pattern.matches("mailPattern", (String) newValue);
}
});
}
}
userei Preference.OnPreferenceChangeListener
piuttosto che SharedPreferences.OnSharedPreferenceChangeListener
.
Il primo consente di convalidare il nuovo valore prima che sia persistuto (e impedire che venga mantenuto) piuttosto che dopo.
La tua domanda è stata una delle prime hit di Google quando stavo cercando di fare la stessa cosa, quindi spero che questo aiuti qualcuno. Ecco una cosa che ho hackerato insieme oggi che dimostra OnPreferenceChangeListener, consentendo così di interrompere le modifiche non valide.
nel frammento:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
Your_Pref = (EditTextPreference) getPreferenceScreen().findPreference("Your_Pref");
Your_Pref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
Boolean rtnval = true;
if (Your_Test) {
final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle("Invalid Input");
builder.setMessage("Something's gone wrong...");
builder.setPositiveButton(android.R.string.ok, null);
builder.show();
rtnval = false;
}
return rtnval;
}
});
}
ho il seguente codice: \t \t se (key.equals ("update_delay")) { \t \t \t String = newvalue sp.getString (chiave, null) ; .. \t \t \t se (Integer.parseInt (newvalue) <60) \t \t \t \t sp.edit() putString ("update_delay", "60") commit(); } e la prossima volta che clicco su EditTextPreference viene ancora visualizzato il valore basso. Sai se commit() non funziona in questo contesto? – sargas
Non sono sicuro, ma in riferimento al metodo commit dice 1. Si noti che quando due editor modificano le preferenze contemporaneamente, vince l'ultimo a chiamare commit. 2. Restituisce true se i nuovi valori sono stati scritti correttamente nella memoria permanente. Punto 1: Forse l'editor dell'utente effettua l'ultima chiamata. Punto 2: verificare se il commit restituisce true. Spero che questo aiuto. – Fede
Non si chiama dopo che il cambiamento è stato fatto? Suppongo che @Aaron abbia la risposta giusta. – iozee