ich einen vollständigen und einfachen Testfall für meine Frage vorbereitet haben: ValidatePrefs app at GitHub:Wie überprüft man die Eingabe in PreferenceActivity und verhindert das Speichern ungültiger Werte?
Wenn Sie das Symbol „Einstellungen“ in der oberen rechten Ecke klicken, SettingsActivity angezeigt wird.
Ich möchte die 3 EditTextPreference
Felder validieren, indem true
oder false
vom onPreferenceChange
Methode zurückkehrt, aber es heißt nicht:
public class SettingsActivity extends PreferenceActivity implements Preference.OnPreferenceChangeListener {
private static final String TAG = SettingsActivity.class.getSimpleName();
public static final String ADDRESS = "address";
public static final String USERNAME = "username";
public static final String PASSWORD = "password";
@Override
public void onCreate(Bundle savedInstanceBundle) {
super.onCreate(savedInstanceBundle);
addPreferencesFromResource(R.xml.settings);
}
@Override
public boolean onPreferenceChange(Preference preference, Object value) {
if (! (preference instanceof EditTextPreference)) {
return false;
}
EditTextPreference editTextPreference = (EditTextPreference)preference;
String key = editTextPreference.getKey();
String text = editTextPreference.getText();
if (key == null || key.isEmpty() || text == null || text.isEmpty()) {
return false;
}
switch (key) {
case ADDRESS: {
try {
new URI(text);
} catch (URISyntaxException ex) {
ex.printStackTrace();
return false;
}
return true;
}
case USERNAME: {
return text.length() > 0;
}
case PASSWORD: {
return text.length() > 0;
}
}
return false;
}
}
UPDATE:
Nach der Zugabe von findPreference
und setOnPreferenceChangeListener
Anrufe in der SettingsActivity heißt das Verfahren onPreferenceChange
schließlich:
@Override
public void onCreate(Bundle savedInstanceBundle) {
super.onCreate(savedInstanceBundle);
addPreferencesFromResource(R.xml.settings);
EditTextPreference address = (EditTextPreference) findPreference(ADDRESS);
EditTextPreference username = (EditTextPreference) findPreference(USERNAME);
EditTextPreference password = (EditTextPreference) findPreference(PASSWORD);
address.setOnPreferenceChangeListener(this);
username.setOnPreferenceChangeListener(this);
password.setOnPreferenceChangeListener(this);
}
Ich kann jedoch immer noch nicht validieren und das Speichern falscher Daten verhindern, da die text
Variable den alten Wert enthält.
Sie können es im Debugger Screenshot siehe unten - ich den neuen (und ungültig) Wertes eines leeren Zeichenfolge eingeben, aber die Variable text
enthalten noch den alten Wert von user1
:
UPDATE 2:
okay, ich falsch war der alte Wert in Preference
gespeichert Inspektion, sollte ich auf den neuen Wert ausgesehen haben, als zweite ar vergangen nach onPreferenceChange
Methode. Hier ist die feste Version des Verfahrens in meinem SettingsActivity:
@Override
public boolean onPreferenceChange(Preference preference, Object obj) {
if (!(preference instanceof EditTextPreference && obj instanceof String)) {
return false;
}
EditTextPreference editTextPreference = (EditTextPreference)preference;
String key = editTextPreference.getKey();
String oldValue = editTextPreference.getText();
String newValue = String.valueOf(obj);
Log.d(TAG, String.format("key %s, value %s -> %s", key, oldValue, newValue));
// TODO validate the newValue and return true or false
vielleicht TextWatcher verwenden – creativecreatorormaybenot