我已經準備了一個完整而簡單的測試情況下我的問題:ValidatePrefs app at GitHub:如何檢查PreferenceActivity中的輸入並防止存儲無效值?
當您單擊右上角的「設置」圖標,顯示SettingsActivity。
我想從onPreferenceChange
方法返回true
或false
驗證3個EditTextPreference
領域,但它永遠不會被調用:
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:
加入findPreference
和setOnPreferenceChangeListener
後來電在SettingsActivity中最後調用方法onPreferenceChange
:
@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);
}
但是我仍然無法驗證和防止保存錯誤的數據,因爲text
變量包含舊的值。
你可以看到它在下面的調試器的截圖 - 我進入一個空字符串的新的(無效)值,但是變量text
仍然包含老值user1
:
更新2:
好吧,我被錯誤地檢測存儲在Preference
舊值,我應該看着新的價值,爲第2 AR傳遞方法爲onPreferenceChange
。這裏的方法在我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
也許使用TextWatcher – creativecreatorormaybenot