7

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

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

2)我已经成功验证了EditTextusing TextWtacher。这是代码:

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 替换为过滤后的字符串,我的应用程序将挂起。猜猜我在调试中发现了什么?

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

问题是...如何替换 s 文本?

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

4

4 回答 4

8
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);
                }
         }
};
于 2012-12-26T19:23:55.017 回答
6

经过一番摸索,我终于找到了解决方案。在 s.clear() 工作之后似乎 s.append(filtered_str) 。不知道为什么它以前没有工作。

于 2010-11-23T18:12:45.463 回答
1

嘿!我正在尝试类似的事情,强制输入文本全部为小写;s.clear() 后跟 s.append() 也会对我造成 StackOverflow(或仍然)。

想知道为什么 Android 让我们通过'箍强制转换为小写?

由于使用 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())...

这行得通!

如果有人有更好的解决方案,请不吝赐教!

于 2010-12-01T23:00:19.820 回答
0

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

于 2010-11-22T18:47:21.810 回答