【问题标题】:Make edittext uneditable after 60 characs使edittext在60个字符后不可编辑
【发布时间】:2015-04-13 06:19:50
【问题描述】:

我正在尝试禁用 60 个字符后输入到 edittext 中的文本。这是我尝试实现的代码,

edittext.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                if (s.toString().replaceAll("\\s", "").length() <= 40) {
                    edittext.setKeyListener(variable);
                } else {
                    //edittext.setCursorVisible(false);
                    edittext.setKeyListener(null);

                    Toast.makeText(PersonalChatActivity.this, "60 characs allowed", Toast.LENGTH_SHORT).show();
                }

            }

            @Override
            public void afterTextChanged(Editable s) {
                    edittext.setKeyListener((KeyListener)edittext.getTag());
            }
        }); 

还尝试设置 cetCoursorVisiblefalse(false) 、 setEnabled(false) 、 setFocusable(false) 、 setFocusableinTouchMode( false)。所有这些都可以正常工作。但是当我尝试通过按键盘上的后退按钮来清除文本时,文本 ain 't clearing.任何关于如何实施的建议。提前谢谢。

【问题讨论】:

  • 是键盘的后退键还是删除键?
  • @AbhishekDabral 后退按钮键盘..用于清除文本..

标签: android android-edittext


【解决方案1】:
    edittext.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

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

            if (!(s.toString().length() <= 60)) {
                edittext.setText(s.subSequence(0, 60));
                edittext.setSelection(edittext.getText().length());
            }

        }

        @Override
        public void afterTextChanged(Editable s) {
        }
    });

【讨论】:

  • 你可以添加去除空格的方法,我忘记添加了
  • @AndroidMech 随时:)
【解决方案2】:

试试:

int maxLength = 60;
InputFilter[] fArray = new InputFilter[1];
fArray[0] = new InputFilter.LengthFilter(maxLength);
myEditText.setFilters(fArray);

【讨论】:

  • 我应该在 addTextChangedListener 中添加这个吧?
  • 不,在听者之前。
  • 它的工作...但不像预期的那样。在 60 个字符后,不应将任何字符附加到输入的文本。但如果我继续在这里输入,新字符将被旧字符替换。另外在 textChanged 方法中,我有一个 toast 显示,上面写着“只允许 60 个字符”,也没有显示。
【解决方案3】:

在布局xml中,对于edittext小部件,您可以设置edittext的android:maxLength属性。

例子:

<Edittext 
  android:id="@+id/et_entry"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:maxLength="60"
/>

因此,在 60 个字符之后,它将不再接受来自用户的更多输入。但是如果用户删除了一些字符,那么 edittext 将再次接受输入并接受直到字符长度为 60。

【讨论】:

  • @Rajan Raiyaresia 是的,我可以这样做,但是我的字符串之间不包含空格,所以我用 replaceAll("\\s","") 替换空格,所以空格删除的字符串实际上是 60 个字符。如果我添加 maxlength 属性,那么我处于劣势
  • 没有得到你想要做什么?从您的代码中,我看到您正在删除所有空格,然后检查长度是否小于或等于 40。那么您实际上是否希望在 edittext 中输入的字符串的长度应该是最大 40 而没有空格。而不是 60?根据你想要的,这可以使用 maxlength 属性来完成。
  • 我提到了 40?..我真的很抱歉..我一定是出于某些测试目的错误地写了 40,因为 60 太长了。应该是 60。
  • 我只是想让文本在 60 个字符后停止在 edittext 中输入,即使用户继续点击键盘,他也应该看到一条消息,即 60 个字符是限制。
  • 我不确定你是否知道。在新的 Android 版本中,应用设置页面中有一个带有复选框的属性“显示通知”。如果用户取消选中该复选框,则不会显示 toast。所以更好的解决方案是在edittext下面放置一个显示剩余字符数的标签,在textwatcher的ontextchange或afterTextChanged方法中,您可以更新该标签。因此,超过 60 个字符将显示 0 个字符,因为它在堆栈溢出中显示在 cmets 中。
【解决方案4】:

我不确定这是确切的解决方案,但试试这个:

   in xml.
 <EditText
    android:id="@+id/editText1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:layout_marginLeft="40dp"
    android:maxLength="60"
    android:layout_marginTop="72dp"
    >
   <requestFocus />
   </EditText>

  In activity:

   editText = (EditText) findViewById(R.id.editText1);
   editText.addTextChangedListener(new TextWatcher() {
   @Override
   public void beforeTextChanged(CharSequence s, int start, int count, int after) {

   }

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

            if(editText.getText().length() >= 60){
                Toast.makeText(MainActivity.this, "60 characs allowed", Toast.LENGTH_SHORT).show();
            }
             }

   @Override
   public void afterTextChanged(Editable s) {
        }
    }); 

【讨论】:

  • 不..这是正确的..我如何禁用和启用输入文本?..当达到 60 个字符时禁用文本..然后再次启用..如果用户清除一些文本并再次输入一些文字..
  • 因为它被指定为 android:maxLength="20" 它永远不会允许输入文本 mroe 超过 20 .... 所以没有使用 if(editText.getText() 的条件.length() >= 60) 在 ontextchanged 方法中。
  • 对不起,它是 60 仅用于测试我已将其更改为 20。无论如何,谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-25
  • 2011-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多