Java 使用TextWatcher进行EditText验证

Java 使用TextWatcher进行EditText验证,java,android,string,android-edittext,textwatcher,Java,Android,String,Android Edittext,Textwatcher,我有一个对话框和一个按钮。此EditText将命名我将创建的数据库表,以便对其进行最重要的验证。因此,我想提出两个问题: 1) 这很简单,但我无法在任何地方找到它:数据库表名可以接受哪些字符?它能接受数字吗?数字可以是第一个字符吗 2) 我已经设法使用textwacher验证了EditText。代码如下: et_name.addTextChangedListener(new TextWatcher() { public void afterTextChanged(Editable s) {

我有一个对话框和一个按钮。此
EditText
将命名我将创建的数据库表,以便对其进行最重要的验证。因此,我想提出两个问题:

1) 这很简单,但我无法在任何地方找到它:数据库表名可以接受哪些字符?它能接受数字吗?数字可以是第一个字符吗

2) 我已经设法使用
textwacher
验证了
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,过滤的字符串)
为了用过滤字符串替换EditText,我的应用程序挂起。猜猜我在调试中发现了什么

错误/AndroidRuntime(2454):
java.lang.StackOverflowerError
=D

问题是。。。如何替换s文本


->
s.replace(0,s.toString().length(),filtered_str)
(当然是remove s.clear)似乎也不起作用。

问题是,当您调用insert方法时,会再次调用text changed方法。这会导致恶性循环,从而导致堆栈溢出。您可以通过不替换格式正确的字符串来避免这种情况。

经过一番努力,我终于找到了解决方案。似乎在s.clear()工作后添加了s.append(过滤的_str)。不知道为什么它以前不起作用。

嘿! 我正在尝试类似的事情,强制输入文本都是小写的;s、 clear()后跟s.append()也会导致堆栈溢出

想知道为什么Android让我们通过“箍”来强制转换成小写? 因为使用TextWatcher对我来说太难了(这是正确的……我也不知道如何使用它),所以我研究了TransformationMethod

第一次尝试是对EditText执行一个内联转换方法,如下所示:

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中键入一个字符时,这导致了由于索引排列而导致的崩溃。。。不知道为什么

所以,我检查了PasswordTransformation和ReplacementTransformation的代码——这两个代码看起来都很复杂,我不想为这些东西烦恼

然后in签出了简单的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.getInstance())中一样

这个有用


如果有人有更好的解决方案,请开导

嗯,它不应该陷入无限循环。如您所见,如果s中不包含[a-z]或[0-9]以外的任何字符,则不会对其进行处理。因此,如果我错了,请纠正我:当键入“坏字符”时,将触发if子句,将s复制到筛选的字符,然后将筛选的字符删除。然后s被清除(调用PostTextChanged,但若并没有触发子句,那个么它什么也不做)。然后插入filtered_str,再次调用PostTextChanged,但不触发if子句。我是不是遗漏了什么?
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);
                }
         }
};