在EditText Android中限制文本长度

时间:2016-10-17 11:55:31

标签: android android-layout android-edittext

如何在android中使用多行EditText限制一行中的字符数 我这样做是因为这不允许多行

  <EditText
        android:id="@+id/MsgText"
        android:layout_width="0dp"
        android:layout_height="fill_parent"
        android:layout_margin="5sp"
        android:layout_weight="1"
        android:background="@drawable/message_field"
        android:inputType="textMultiLine"
        android:maxLength="10"
        android:padding="5sp"
        android:hint="Type a Message"
        android:textColor="@color/textFieldColor" />

5 个答案:

答案 0 :(得分:2)

你可以使用它。

final EditText edit = (EditText)findViewById(R.id.MsgText);
final int maxLineLength = 10;

edit.addTextChangedListener(new TextWatcher() {
    final Integer mark = 1;
    String textBeforeEdit = null;

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        textBeforeEdit = s.toString().substring(start, start + count);
    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        edit.getText().setSpan(mark, start, start + count, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
    }

    @Override
    public void afterTextChanged(Editable s) {
        String str = s.toString();
        int spanStart = s.getSpanStart(mark);
        int spanEnd = s.getSpanEnd(mark);
        int lastNL = str.lastIndexOf('\n', spanStart);
        int nextNL;
        while(lastNL < spanEnd) {
            nextNL = str.indexOf('\n', lastNL + 1);
            if(nextNL == -1)
                nextNL = str.length();
            if(nextNL - lastNL > maxLineLength + 1) {
                // reject the entire change
                s.replace(spanStart, spanEnd, textBeforeEdit);
                break;
            }
            lastNL = nextNL;
        }
        s.removeSpan(mark);
    }
});

代码的作用是在每次更改文本时(可能同样是键盘输入或粘贴)观察,是否有任何受影响的行已增长到maxLineLength个字符以上(加上{ {1}})。我们不关心更改之前或之后的行,因此我们可以在重写的区域开始之前的最后\n开始计数。 (如果\n也提供了lastIndexOf也没关系。)我们找到下一个-1,如果它不超过最后一个\n个字符,那就没事了,我们就推进了直到跨度之后(或在字符串的末尾)。

当条件被破坏时,事情变得有趣:因此我们在已更改的区域的开头和末尾存储一个不可见标记(相对于 new 的开头)文本)以及重写的原始文本。通过用旧内容替换新区域,我们有效地拒绝了更改,因此操作将被忽略。

这种方法的优点是

  • 使用Paste,
  • ,插入也很顺利
  • 如果结果太长,它将不允许你合并行(使用退格键),
  • 它永远不会改变你没有意义改变的任何文字(比如简单地将行缩短或分成10个字符),
  • 它给出了没有闪烁的预期用户行为。你按下一个不合适的钥匙 - 没有任何反应。

答案 1 :(得分:0)

您可以尝试android:ems="10",这不会将您的字符限制为每行10个,但会使EditText的宽度相当于10“M”个字符。

答案 2 :(得分:0)

您可以设置 android:maxWidth =“size”。选择字符数可以达到的宽度。还可以在dp中使用大小,以便它在所有设备中的行为相似。

限制总字符数 -

在Java下面的代码中检查edittext的长度。如果超出限制,您可以将其显示为警告。

 your_edit_text.addTextChangedListener(new TextWatcher() {

        @Override
        public void afterTextChanged(Editable s) {
        }

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

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

            int len = question.length();
            warning_text_view.setText(100 - len + " char. left");
            if (100 - len < 0) {
                warning_text_view.setText("limit Exceeded!");
                warning_text_view.setTextColor(Color.RED);
            } else
                warning_text_view.setTextColor(Color.GRAY);
        }
    });

答案 3 :(得分:0)

您可以尝试使用LengthFilter

EditText editText = new EditText(this);
int maxLength = 3;    
editText.setFilters(new InputFilter[] {new InputFilter.LengthFilter(maxLength)});

答案 4 :(得分:0)

private final TextWatcher textWatcher = new TextWatcher() {
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

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

            public void afterTextChanged(Editable s) {
                if (s.length() == maxCharacterForLine) {
                    s.append("\n");
                    editText.setText(s);
                    editText.setSelection(s.length());
                } 
            }
        };

editText.addTextChangedListener(textWatcher); 

maxCharacterForLine 是每一行的字符数限制。

此外,您应该检查复制和粘贴