我是完成數字首選項的驗證例程的一小步。
我替換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防止對話框以無效條目關閉
爲什麼不能簡單地用'preference.onPreferenceChangedListener()'? – 2013-02-22 14:37:39
@AleksG當您發表評論時,我正在使用該解決方案進行回答。 – ilomambo 2013-02-22 14:42:00