: 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
변수에 old 값이 포함되어 있기 때문에 여전히 유효성을 검사하고 잘못된 데이터를 저장하지 못합니다.
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