- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是完成数字偏好验证例程的一小步。
我将 EditTextPrefernce OK 按钮替换为 ClickListener,以防止在条目不是数字时离开对话框。
我使用 TextWatcher.afterTextChanged 来检查条目是否为数字,并将有效的评估放在 EditText 标签上。
一切正常,当输入无效时按确定不会离开对话框,当输入有效时按确定...这里我需要调用原始确定按钮onClick,但是我没有找到如何去做。有 View 函数 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 防止对话框因无效条目而关闭
最佳答案
我找到了一种不同的方法来验证 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;
}
此函数的优点是它返回一个 bool 值,如果您接受更改则返回 true,如果您拒绝更改则返回 false。
我去掉了 OK 按钮的 onFocusListener 和 onClickListener,这样更简单。
我仍然使用 setColorFilter 和 afterTextChanged 来警告用户输入无效。如果用户按下 OK,对话框将关闭,但只会接受一个有效值。
这个监听器是为每个偏好单独设置的,所以这是我在 onCreate() 中的初始化
prefMaxLogs = (EditTextPreference) findPreference(getText(R.string.pref_maxLogs_key));
prefMaxLogsEt = prefMaxLogs.getEditText();
prefMaxLogsEt.setSingleLine();
prefMaxLogsEt.addTextChangedListener(tcl);
prefMaxLogs.setOnPreferenceClickListener(this);
关于Android EditTextPreference 的验证例程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15024692/
我最近购买了《C 编程语言》并尝试了 Ex 1-8这是代码 #include #include #include /* * */ int main() { int nl,nt,nb;
早上好!我有一个变量“var”,可能为 0。我检查该变量是否为空,如果不是,我将该变量保存在 php session 中,然后调用另一个页面。在这个新页面中,我检查我创建的 session 是否为空,
我正在努力完成 Learn Python the Hard Way ex.25,但我无法理解某些事情。这是脚本: def break_words(stuff): """this functio
我是一名优秀的程序员,十分优秀!