1
내 질문에 대한 완전하고 간단한 테스트 케이스를 준비했습니다

: ValidatePrefs app at GitHub : 당신은 오른쪽 상단 모서리에있는 '설정'아이콘을 클릭하면PreferenceActivity에서 입력을 확인하고 잘못된 값을 저장하는 것을 방지하는 방법은 무엇입니까?

app screenshots

, 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 :

findPreferencesetOnPreferenceChangeListener 호출을 추가 한 후 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 값이 포함되어 있기 때문에 여전히 유효성을 검사하고 잘못된 데이터를 저장하지 못합니다.

debugger

: 나는 빈 문자열의 새 (무효) 값을 입력하지만, 변수 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 
+0

어쩌면 TextWatcher – creativecreatorormaybenot

답변

1

메소드가 호출되지 않습니다하지만.

setOnPreferenceChangeListener()을 등록하는 것을 잊어 버린 것 같습니다. 콜백이 호출되지 않는 이유입니다.

+0

을 사용할 수 있습니다. 그렇지만 내 앱에서 해당 메소드를 호출 할 위치는 어디입니까? –

+0

[this] (http://stackoverflow.com/q/12737724/1083957)에서 사용법을 참조하십시오. – azizbekian

관련 문제