【问题标题】:Permit only 1 character in EditText and always overwrite when user input it仅允许 EditText 中的 1 个字符,并在用户输入时始终覆盖
【发布时间】:2011-04-05 20:48:08
【问题描述】:

我需要创建一个EditText,它只接受一个字符并且只接受一个字符(字母/字母)。如果用户输入其他字符,它应该替换现有的字符(例如用 1 个允许的符号覆盖文本输入的方法)。

  1. 我知道如何在属性中设置文本的最大长度。但如果我设置它 为 1,则在用户删除之前不能插入其他字符 现有的。但我想用新输入的替换现有字符 一个自动删除,无需手动删除。该怎么做?

  2. 我知道如何将属性设置为仅允许 EditText 中的数字,但我 无法弄清楚如何只允许字符。那么第二个问题是如何只允许EditText中的字符?

目前我使用的是EditText,最大文本大小=2,代码如下:

final EditText editLetter = (EditText)findViewById(R.id.editHouseLetter); 
editLetter.addTextChangedListener(new TextWatcher() {

    public void afterTextChanged(Editable s) {
        if (s!=null && s.length()>1){
            editLetter.setText(s.subSequence(1, s.length()));
            editLetter.setSelection(1);
        }
    }

    public void beforeTextChanged(CharSequence s, int start, int count,
        int after) {

    }

    public void onTextChanged(CharSequence s, int start, int before,
        int count) {

    }
});

关键是,当用户输入第二个字符时,应该删除第一个字符。将文本大小设置为 2 允许用户在输入一个字符后输入另一个字符。

我真的不明白它是如何工作的,但它确实:)。此外,我不得不将 EditText 中的光标指向最后一个位置,因为它总是转到开头,这使得根本无法输入任何内容。也不明白为什么会这样。

这个解决方案的要点是它有一个 2 字符大小的 EditText,但我希望它是 1 字符大小。它允许输入除字母(字符/alpha)之外的任何内容,我只需要字符。

使用 sgarmanCharacter.isLetter() 函数提供的建议,afterTextChanged 方法现在看起来像这样:

public void afterTextChanged(Editable s) {
    int iLen=s.length();
    if (iLen>0 && !Character.isLetter((s.charAt(iLen-1)))){
        s.delete(iLen-1, iLen);
        return;
    } 
    if (iLen>1){
        s.delete(0, 1);
    } 
}

我发现在这种情况下不需要使用Selection.setSelection。现在它有一个过滤器,只允许输入字母。这几乎就是我想要的答案。剩下的唯一一件事是如何对 1 个符号大小的 EditText 做同样的事情?

【问题讨论】:

    标签: android android-edittext textwatcher


    【解决方案1】:

    您可以将这一行添加到您的布局 xml 文件中,android 会为您完成这些工作

    android:maxLength="1"
    

    当然你应该把它作为一个属性添加到editText元素中,例如

    <EditText
        android:id="@+id/editText1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:inputType="text"
        android:maxLength="1" >
    

    我遇到了同样的问题,发现这个更简单的解决方案,我知道这是一个老问题,但我决定把我的答案放出来,让那些打开这个链接的人更容易。

    我不应该忘记感谢这个blog的所有者,我引用了答案!

    【讨论】:

    • 请更仔细地阅读我的问题 - 这不仅仅是 1 个字符的限制。你的方法行不通。
    【解决方案2】:

    试试:

    s.delete(0, 1);
    Selection.setSelection(s, s.length());
    

    【讨论】:

    • 文本长度=2 的情况完全相同。长度 = 1 它根本不起作用。这只是一种不使用指向 ET 的链接(editLetter)的替代方式。感谢您的提示,但这不是答案。
    【解决方案3】:

    我想做同样的事情,我在 afterTextChanged(Editable s) 中使用了您的代码,并像这样在 editText 上设置了一个过滤器。

    editText.setFilters(new InputFilter[] {new InputFilter.LengthFilter(2)});
    

    它按我们的意愿工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-13
      • 1970-01-01
      • 1970-01-01
      • 2014-11-12
      • 2017-11-06
      • 2021-11-11
      • 1970-01-01
      相关资源
      最近更新 更多