1

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?

app screenshots

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:

debugger

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 
+0

vielleicht TextWatcher verwenden – creativecreatorormaybenot

Antwort

1

jedoch diese Methode nie aufgerufen.

Es scheint mir, Sie haben vergessen, setOnPreferenceChangeListener() zu registrieren, deshalb wird der Rückruf nicht aufgerufen.

+0

Ja, aber wo diese Methode in meiner App anrufen? –

+0

Siehe Verwendung in [this] (http://stackoverflow.com/q/12737724/1083957) Frage. – azizbekian

Verwandte Themen