1

我已經準備了一個完整而簡單的測試情況下我的問題:ValidatePrefs app at GitHub如何檢查PreferenceActivity中的輸入並防止存儲無效值?

app screenshots

當您單擊右上角的「設置」圖標,顯示SettingsActivity

我想從onPreferenceChange方法返回truefalse驗證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變量包含舊的值。

你可以看到它在下面的調試器的截圖 - 我進入一個空字符串的新的(無效)值,但是變量text仍然包含user1

debugger

更新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

請參閱[此](http://stackoverflow.com/q/12737724/1083957)問題中的用法。 – azizbekian

相關問題