2013-02-22 37 views
1

我是完成數字首選項的驗證例程的一小步。
我替換EditTextPrefernce確定按鈕onClickListener以防止如果條目不是數字時離開對話框。
我使用TextWatcher.afterTextChanged檢查條目是否爲數字,並將有效評估放在EditText標記上。
一切工作正常,當條目無效時按OK鍵不離開對話框,當條目有效時按OK ...這裏我需要調用原始OK按鈕onClick,但我沒有找到去做有看法函數callOnClick()和performOnClick(),但我看着他們的代碼,他們打算調用安裝的偵聽器,而不是原來的。Android驗證程序EditTextPreference

@Override 
public void onCreate(Bundle savedInstanceState) { 
    Log.d(TAG, "+ onCreate(savedInstanceState:" + savedInstanceState + ")"); 
    super.onCreate(savedInstanceState); 

    ... 

    prefMaxLogs = (EditTextPreference) findPreference(getText(R.string.pref_maxLogs_key)); 
    prefMaxLogsEt = prefMaxLogs.getEditText(); 
    prefMaxLogsEt.setSingleLine(); 
    prefMaxLogsEt.setOnFocusChangeListener(ofcl); 
    prefMaxLogsEt.addTextChangedListener(tw); 

    ... 

    Log.d(TAG, "- onCreate()"); 
} 

private OnFocusChangeListener ofcl = new OnFocusChangeListener() { 
    @Override 
    public void onFocusChange(View v, boolean hasFocus) { 
     Log.d(TAG, "+ onFocusChange(v:" + v + ", hasFocus:" + hasFocus + ")"); 
     if(hasFocus) { 
      prefMaxLogsEt.selectAll(); 
      Dialog dialog = prefMaxLogs.getDialog(); 
      if(dialog != null) { 
       dialog.findViewById(android.R.id.button1).setOnClickListener(ocl); 
      } 
     } 
     Log.d(TAG, "- onFocusChange()"); 
    } 
}; 

private OnClickListener ocl = new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     Log.d(TAG, "+ onClick(v:" + v + ")"); 
     Boolean valid = !(Boolean) prefMaxLogsEt.getTag(R.string.invalidEntry); 
     if(valid) { 
      Log.d(TAG, "Valid et"); 
     } 
     Log.d(TAG, "- onClick()"); 
    } 
}; 

private TextWatcher tw = new TextWatcher() { 
    @Override 
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {} 
    @Override 
    public void onTextChanged(CharSequence s, int start, int before, int count) {} 
    @Override 
    public void afterTextChanged(Editable s) { 
     Log.d(TAG, "+ afterTextChanged(s:" + s + ")"); 
     String source = s.toString(); 
     //prefMaxLogsEt.removeTextChangedListener(this); 
     if(!source.matches("^[0-9]+$")) { 
      prefMaxLogsEt.getBackground().setColorFilter(getResources().getColor(R.color.invalid), Mode.SRC_IN); 
      prefMaxLogsEt.invalidate(); 
      prefMaxLogsEt.setError(getText(R.string.invalidEntry)); 
      prefMaxLogsEt.selectAll(); 
      prefMaxLogsEt.setTag(R.string.invalidEntry, true); 
     } else { 
      prefMaxLogsEt.setError(null); 
      prefMaxLogsEt.getBackground().clearColorFilter(); 
      prefMaxLogsEt.invalidate(); 
      prefMaxLogsEt.setTag(R.string.invalidEntry, false); 
     } 
     //prefMaxLogsEt.addTextChangedListener(this); 
     Log.d(TAG, "- afterTextChanged()"); 
    } 
}; 

的onClickListener時EditText上獲得焦點,因爲我知道這個對話框已經顯示設置。
onClickListener防止對話框以無效條目關閉

+1

爲什麼不能簡單地用'preference.onPreferenceChangedListener()'? – 2013-02-22 14:37:39

+0

@AleksG當您發表評論時,我正在使用該解決方案進行回答。 – ilomambo 2013-02-22 14:42:00

回答

1

我發現了另一種驗證EditTextPreference的方法。設置OnPreferenceChangeListener並實現onPreferenceChange。

@Override 
public boolean onPreferenceChange(Preference preference, Object newValue) { 
    Log.d(TAG, "+ onPreferenceChange(preference:" + preference + ", newValue:" + newValue + ")"); 
    Boolean rv = true; 
    if(preference.equals(prefMaxLogs)) { 
     String source = newValue.toString(); 
     if(!source.matches("^[0-9]+$")) { 
      rv = false; 
     } 
    } 
    Log.d(TAG, "- onPreferenceChange()"); 
    return rv; 
} 

此功能有它,如果你接受更改,假如果你拒絕他們返回一個布爾值,真正的優勢。
我放棄了OK按鈕的onFocusListener和onClickListener,這種方式更簡單。
我仍然使用setColorFilter和afterTextChanged警告用戶無效的條目。如果用戶按下確定,對話框將關閉,但只接受有效值。

此偵聽器設置各個偏好,所以這是我在初始化的onCreate()

prefMaxLogs = (EditTextPreference) findPreference(getText(R.string.pref_maxLogs_key)); 
    prefMaxLogsEt = prefMaxLogs.getEditText(); 
    prefMaxLogsEt.setSingleLine(); 
    prefMaxLogsEt.addTextChangedListener(tcl); 
    prefMaxLogs.setOnPreferenceClickListener(this);