[英]EditText validation with TextWatcher
我有一个带有EditText
和按钮的Dialog。 这个EditText
将命名我将创建的数据库表,以便验证它的最重要性。 所以我想提出2个问题:
1)这很简单,但我无法在任何地方找到它:数据库表名称可以接受哪些字符? 可以接受号码吗? 并且数字可以是第一个字符吗?
2)我设法使用TextWtacher
验证EditText
。 这是代码:
et_name.addTextChangedListener(new TextWatcher() {
public void afterTextChanged(Editable s) {
String filtered_str = s.toString();
if (filtered_str.matches(".*[^a-z^0-9].*")) {
filtered_str = filtered_str.replaceAll("[^a-z^0-9]", "");
s.clear();
// s.insert(0, filtered_str);
Toast.makeText(context,
"Only lowercase letters and numbers are allowed!",
Toast.LENGTH_SHORT).show();
}
}
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
public void onTextChanged(CharSequence s, int start, int before, int count) {}
});
目前,如果用户插入除小写字母和数字以外的任何字符,则清除文本框。 如果我取消注释s.insert(0, filtered_str);
为了用过滤后的字符串替换EditText,我的应用程序挂起。 猜猜我在调试中发现了什么?
ERROR / AndroidRuntime(2454): java.lang.StackOverflowError
= D.
问题是......我怎样才能替换s文本?
- > s.replace(0, s.toString().length(), filtered_str);
(删除s.clear,当然)似乎也没有用。
private TextWatcher listenerTextChangedFiltro = new TextWatcher() {
public void afterTextChanged(Editable editable) {
final String textoFiltrado = StaticString.filterTextCustom(String.valueOf(editable.toString().toLowerCase()));
if (!textoFiltrado.equals(editable.toString().toLowerCase())) {
editable.clear();
editable.append(textoFiltrado);
}
}
};
经过一番轰动,我终于找到了解决方案。 在s.clear()工作之后似乎s.append(filtered_str)。 不知道为什么之前没有工作。
嘿! 我正在尝试类似的事情,强制输入文本全部小写; s.clear()后跟s.append()也会导致StackOverflow(或者仍然)。
因为使用TextWatcher对我来说是崩溃的(这是正确的......我无法弄清楚如何工作跨度),我看了TransformationMethod。
第一次尝试是使用以下内容在EditText上执行内联TransformationMethod:
et.setTransformationMethod(new TransformationMethod() {
public void onFocusChanged(View view, CharSequence sourceText, boolean focused, int direction,
Rect previouslyFocusedRect) {
}
public CharSequence getTransformation(CharSequence source, View view) {
String ret = source.toString().toLowerCase();
System.out.println(ret);
return ret;
}
});
一旦我在ET中输入单个字符,就会导致由于IndexArrayOutOfBounds导致崩溃...无法找出原因。
所以,我检查了PasswordTransformation的代码,然后检查了ReplacementTransformation - 两者看起来都很复杂,我不想打扰所有这些?东西?
然后检查出SinglelineTransformation子类,这很简单......所以我创建了LowerCaseTransformation作为ReplacementTransformation的子类,如下所示:
public class LowerCaseReplacement extends ReplacementTransformationMethod {
private static final char[] ORIG = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' };
private static final char[] REPS = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' };
private static LowerCaseReplacement singleton;
@Override
protected char[] getOriginal() {
return ORIG;
}
@Override
protected char[] getReplacement() {
return REPS;
}
public static LowerCaseReplacement getInstance() {
if (singleton == null)
singleton = new LowerCaseReplacement();
return singleton;
}
}
并将此xform添加到et ...中,如et.setTransformationMethod(LowerCaseReplacement.getInstnace())...
这个有效!!
如果有人有更好的解决方案,那么请指教!
问题是,当您调用insert方法时,将再次调用text changed方法。 这导致恶性循环,因此堆栈溢出。 您可以通过不替换格式正确的字符串来避免这种情况。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.