私は、数値設定の検証ルーチンを完了するための小さなステップです。
エントリが数値でない場合にダイアログを離れないように、EditTextPrefernce OK ボタン onClickListener を置き換えました。
TextWatcher.afterTextChanged を使用してエントリが数値かどうかを確認し、有効な評価を EditText タグに付けます。
エントリが無効なときに [OK] を押してもダイアログが表示されず、エントリが有効なときに [OK] を押します...ここでは、元の [OK] ボタン onClick を呼び出す必要がありますが、その方法が見つかりませんでした。
ビュー関数 callOnClick() と performOnClick() がありますが、それらのコードを調べたところ、元のリスナーではなく、インストールされたリスナーを呼び出すことを意図しています。
@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()");
}
};
ダイアログが既に表示されていることがわかっているため、EditText がフォーカスを取得すると、onClickListener が設定されます。
onClickListener は、ダイアログが無効なエントリで閉じるのを防ぎます