代码之家  ›  专栏  ›  技术社区  ›  Tivie

使用TextWatcher进行EditText验证

  •  7
  • Tivie  · 技术社区  · 13 年前

    我和一个 EditText 还有一个按钮。这个 编辑文本 将命名我将创建的数据库表,以便对其进行验证。所以我想提出两个问题:

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

    2)我已经设法验证了 编辑文本 使用 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 =天

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

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

    4 回复  |  直到 13 年前
        1
  •  8
  •   Bo Persson tox    11 年前
    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);
                    }
             }
    };
    
        2
  •  6
  •   Tivie    13 年前

    经过一番讨价还价,我终于找到了解决办法。在s.clear()工作之后,似乎是s.append(filtered_str)。不知道为什么以前没用过。

        3
  •  1
  •   Sheshadri Mantha    13 年前

    嘿! 我正在尝试类似的方法,强制输入文本全部小写;s.clear()后跟s.append()也会(或仍然)导致StackOverflow。

    想知道为什么安卓让我们通过箍来强制转换成小写字母?

    因为使用文本观察程序对我来说太麻烦了(没错。。。我不知道如何计算跨度),我研究了转换方法。

    第一次尝试是对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中键入一个字符时,由于索引边界排列,这导致了崩溃。。。不知道为什么。

    所以,我检查了密码转换和替换转换的代码——这两个代码看起来都很复杂,我不想为此而烦恼?什么东西?.

    然后在签出了简单的SinglelineTransformation子类。。。所以我创建了小写转换作为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(小写的erePlacement.getInstance())。。。

    这能行!!

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

        4
  •  0
  •   kgiannakakis    13 年前

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