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

1),这是很简单,但我不能鳍它的任何地方:可以将数据库表名接受什么样的角色?它可以接受数字?并且可以在数是第一个字符?

2)我已经成功地验证使用EditTextTextWtacher。下面的代码:

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,当然)似乎不工作或者

有帮助吗?

解决方案 2

一些撞头后,我终于找到了解决方案。看来以后s.clear()的作品s.append(filtered_str)。说不上为什么它没有工作之前。

其他提示

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()引起的StackOverflow对我来说太(或静止)。

奇怪为什么Android的把我们通”箍力转换为小写?

由于使用TextWatcher被撞毁,我(这是正确的......我无法弄清楚如何工作的跨度),我看着TransformationMethod。

1日尝试是做对的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;
        }
    });

这造成死机由于IndexArrayOutOfBounds只要我键入的ET单个字符...无法弄清楚为什么。

所以,我检查了代码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.setTransformationMethod(LowerCaseReplacement.getInstnace())...

这个作品!

如果任何人有一个更好的解决方案,然后请大家指教!

但问题是,当你调用插件的方法,文本改变方法再次被调用。这导致了一个恶性循环,从而堆栈溢出。您可以通过不替换被正确格式化的字符串避免这种情况。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top