如何在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" />
答案 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 的开头)文本)以及重写的原始文本。通过用旧内容替换新区域,我们有效地拒绝了更改,因此操作将被忽略。
这种方法的优点是
答案 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 是每一行的字符数限制。
此外,您应该检查复制和粘贴。