Android 限制行EditText中的文本长度

Android 限制行EditText中的文本长度,android,android-layout,android-edittext,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中使用多行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" />


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

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

您可以设置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);
        }
    });
your_edit_text.addTextChangedListener(新的TextWatcher(){
@凌驾
公共无效后文本已更改(可编辑){
}
@凌驾
更改前的公共无效(字符序列、整数开始、,
整数计数,整数后){
}
@凌驾
public void onTextChanged(字符序列,int start,
前整数,整数计数){
int len=question.length();
警告_text_view.setText(100-len+“char.left”);
如果(100-透镜<0){
警告_text_view.setText(“超出限制!”);
警告\文本\视图.setTextColor(Color.RED);
}否则
警告\文本\视图.setTextColor(Color.GRAY);
}
});

您可以设置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);
        }
    });
your_edit_text.addTextChangedListener(新的TextWatcher(){
@凌驾
公共无效后文本已更改(可编辑){
}
@凌驾
更改前的公共无效(字符序列、整数开始、,
整数计数,整数后){
}
@凌驾
public void onTextChanged(字符序列,int start,
前整数,整数计数){
int len=question.length();
警告_text_view.setText(100-len+“char.left”);
如果(100-透镜<0){
警告_text_view.setText(“超出限制!”);
警告\文本\视图.setTextColor(Color.RED);
}否则
警告\文本\视图.setTextColor(Color.GRAY);
}
});

您可以尝试LengthFilter

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

你可以试试LengthFilter

EditText editText = new EditText(this);
int maxLength = 3;    
editText.setFilters(new InputFilter[] {new InputFilter.LengthFilter(maxLength)});
maxCharacterForLine是每行的字符限制

您还应该检查是否有复制和粘贴

maxCharacterForLine是每行的字符限制

此外,您还应检查是否有复制和粘贴

您可以使用此功能

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);
    }
});
final EditText edit=(EditText)findViewById(R.id.MsgText);
最终整数maxLineLength=10;
edit.addTextChangedListener(新的TextWatcher(){
最终整数标记=1;
字符串textBeforeEdit=null;
@凌驾
更改前文本之前的公共void(字符序列s、int start、int count、int after){
textBeforeEdit=s.toString().substring(开始,开始+计数);
}
@凌驾
public void onTextChanged(字符序列、int start、int before、int count){
edit.getText().setSpan(标记、开始、开始+计数、跨距.SPAN_INCLUSIVE\u EXCLUSIVE);
}
@凌驾
公共无效后文本已更改(可编辑){
字符串str=s.toString();
int spanStart=s.getSpanStart(标记);
int spanEnd=s.getSpanEnd(标记);
int lastNL=str.lastIndexOf('\n',spanStart);
int nextNL;
while(lastNLmaxLineLength+1){
//拒绝整个更改
s、 替换(spanStart、spanEnd、textBeforeEdit);
打破
}
lastNL=nextNL;
}
s、 移除平底锅(标记);
}
});
代码所做的是,它在每次更改文本(可能是键盘输入或粘贴)时观察是否有任何受影响的行已增长到超过
maxLineLength
个字符(加上一个用于
\n
)。我们不关心更改之前或之后的行,因此可以从重写区域开始之前的最后一个
\n
开始计数。(如果
lastIndexOf
也给出了
-1
,我们找到下一个
\n
,如果它不超过最后一个
maxLineLength+1
字符,那么就可以了,我们前进到跨度之后(或字符串末尾)

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

这种方法的好处在于

  • 它与插入物和粘贴物配合使用时效果良好
  • 如果结果太长,它将不允许您合并行(使用退格)
  • 它从不改变任何你不想改变的文本(比如简单地缩短或将行打断为10个字符)