Android 限制行EditText中的文本长度
如何在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"
<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个字符)
- 它