在EditText中只允许使用1个字符,并在用户输入时始终覆盖

时间:2011-04-05 20:48:09

标签: android android-edittext textwatcher

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

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

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

  3. 目前,我使用的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个字符大小。它允许输入除字母之外的任何内容(字符/字母),我只想要字符。

    使用 sgarman Character.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

3 个答案:

答案 0 :(得分:11)

你可以将这一行添加到你的布局xml文件中,android会为你做这些事情

android:maxLength="1"

肯定你应该把它作为属性添加到editText elemet,例如

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

我遇到了同样的问题并发现这个更简单的解决方案,我知道这是一个老问题,但我决定将我的答案放在那些打开这个链接的人身上。

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

答案 1 :(得分:3)

尝试:

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

答案 2 :(得分:2)

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

CREATE TABLE DEPT(
 deptno number(2) NOT NULL,
 DNAME varchar2(13)
);

CREATE TABLE EMP(
 EMPNO number(4) NOT NULL,
 ENAME varchar2(13),
 DEPTNO NUMBER(2) NOT NULL (this is referencing DEPT (DEPTNO)
);

它按我们的意愿工作。

相关问题