如何在Android上创建一个EditText,使得用户可能无法输入多行文本,但显示仍然是多行的(即有文字换行而不是文本转到右侧)?
它类似于内置的SMS应用程序,我们无法输入换行符,但文本以多行显示。
答案 0 :(得分:46)
我将子窗口小部件并覆盖关键事件处理以阻止Enter
密钥:
class MyTextView extends EditText
{
...
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
if (keyCode==KeyEvent.KEYCODE_ENTER)
{
// Just ignore the [Enter] key
return true;
}
// Handle all other keys in the default way
return super.onKeyDown(keyCode, event);
}
}
答案 1 :(得分:42)
这是一种方法,您不必重写EditText类。你只需用空字符串捕获并替换换行符。
myEditTextObject.addTextChangedListener(new TextWatcher() {
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
public void afterTextChanged(Editable s) {
for(int i = s.length(); i > 0; i--) {
if(s.subSequence(i-1, i).toString().equals("\n"))
s.replace(i-1, i, "");
}
String myTextString = s.toString();
}
});
答案 2 :(得分:24)
XML中的属性
android:lines="5"
android:inputType="textPersonName"
答案 3 :(得分:14)
这个适用于我:
<EditText
android:inputType="textShortMessage|textMultiLine"
android:minLines="3"
... />
它显示笑脸而不是Enter键。
答案 4 :(得分:6)
@Andreas Rudolph提供的答案包含一个严重的错误,不应该使用。当您通过包含多个换行符的IndexOutOfBoundsException
内的文本时,代码会导致EditText
。这是由使用的循环类型引起的,Editable
对象将在其内容更改(替换,删除,插入)后立即调用afterTextChanged
方法。
正确的代码:
edittext.addTextChangedListener(new TextWatcher() {
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
public void afterTextChanged(Editable s) {
/*
* The loop is in reverse for a purpose,
* each replace or delete call on the Editable will cause
* the afterTextChanged method to be called again.
* Hence the return statement after the first removal.
* http://developer.android.com/reference/android/text/TextWatcher.html#afterTextChanged(android.text.Editable)
*/
for(int i = s.length()-1; i >= 0; i--){
if(s.charAt(i) == '\n'){
s.delete(i, i + 1);
return;
}
}
}
});
答案 5 :(得分:5)
试试这个:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_ENTER)
{
//Nothing
return true;
}
return super.onKeyDown(keyCode, event);
}
答案 6 :(得分:5)
我正在测试它,它似乎有效:
EditText editText = new EditText(context);
editText.setSingleLine(false);
editText.setInputType(android.text.InputType.TYPE_CLASS_TEXT | android.text.InputType.TYPE_TEXT_VARIATION_EMAIL_SUBJECT);
答案 7 :(得分:3)
只需添加
android:singleLine="true"
到您的EditText
答案 8 :(得分:3)
你可以像这样在xml中设置它:
android:imeOptions="actionDone"
android:inputType="text"
android:maxLines="10"
不要忘记android:inputType="text"
,如果你没有设置它,它就不会工作。我不知道为什么。
另外,请不要忘记将maxLines
更改为您的首选值。
答案 9 :(得分:2)
这是一个更正确的答案,它不会在IME键盘上显示回车键:
// IMPORTANT, do this before any of the code following it
myEditText.setSingleLine(true);
// IMPORTANT, to allow wrapping
myEditText.setHorizontallyScrolling(false);
// IMPORTANT, or else your edit text would wrap but not expand to multiple lines
myEditText.setMaxLines(6);
此外,您可以将setSingleLine(true)
替换为XML布局文件上的显式android:inputType
或代码上的setInputType(InputType.*)
–在其中,使用的输入类型就是您所需要的任何东西知道将输入限制为仅一行(即,任何已经隐式调用setSingleLine(true)
的输入。)
说明:
setSingleLine(true)
的工作是隐式调用setHorizontallyScrolling(true)
和setLines(1)
,同时更改一些IME键盘设置以禁用Enter键。
依次,对setLines(1)
的呼叫就像在一次呼叫中呼叫setMinLines(1)
和setMaxLines(1)
。
某些输入类型(即InputType.TYPE_*
中的常量)隐式调用setSingleLine(true)
,或至少达到相同的效果。
结论:
因此,要实现OP所需的功能,我们只需通过还原那些隐式调用来对那些隐式设置进行计数。
答案 10 :(得分:1)
您可以通过代码更改操作按钮
editText.imeOptions = EditorInfo.IME_ACTION_DONE
editText.setRawInputType(InputType.TYPE_CLASS_TEXT)
Xml
android:inputType="textMultiLine"
答案 11 :(得分:1)
接受的答案非常有效,直到我将带有换行符的文本复制到EditText中。所以我添加了onTextContextMenuItem来监视粘贴操作。
@Override
public boolean onTextContextMenuItem(int id) {
boolean ret = super.onTextContextMenuItem(id);
switch (id) {
case android.R.id.paste:
onTextPaste();
break;
}
return ret;
}
public void onTextPaste() {
if (getText() == null)
return;
String text = getText().toString();
text = text.replaceAll(System.getProperty("line.separator"), " ");
text = text.replaceAll("\\s+", " ");
setText(text);
}
答案 12 :(得分:0)
EditText textView = new EditText(activity);
...
textView.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) {
if(KeyEvent.KEYCODE_ENTER == keyEvent.getKeyCode()) {
return false;
}
.......
}
});
答案 13 :(得分:0)
<EditText
android:id="@+id/Msg"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dip"
android:lines="5"
android:selectAllOnFocus="true"
android:hint="Skriv meddelande...\n(max 100tkn)"/>
EditText et = (EditText)findViewById(R.id.Msg);
String strTmp = et.getText().toString();
strTmp = strTmp.replaceAll("\\n"," ");
答案 14 :(得分:0)
我将提供另一个选择,因此您不必子类化EditText。创建一个InputFilter
来过滤掉换行符。然后使用EditText.addInputFilter
。
这种输入过滤器的源代码在这里:https://gist.github.com/CapnSpellcheck/7c72830e43927380daf5205100c93977
您可以在构造函数中传递0,并且不允许任何换行符。另外,您可以将其与其他调整之一结合使用,例如android:imeOptions="actionDone"
,因为这将有助于改善某些设备上的体验。
答案 15 :(得分:0)
对于URI你可以使用:
android:inputType="textUri"
android:lines="1"
android:maxLength="128"
否则上面提到的android:inputType="textPersonName"
适用于其他EditText这样的用户名等
答案 16 :(得分:0)
这是解决方案。...
<EditText
android:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:maxLength="150"
android:textSize="15dp"
android:imeOptions="actionDone"
android:inputType="text|textMultiLine"/>
在Java类中的用法
editText.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View view, int keyCode, KeyEvent event) {
if (keyCode==KeyEvent.KEYCODE_ENTER)
{
// Just ignore the [Enter] key
return true;
}
// Handle all other keys in the default way
return (keyCode == KeyEvent.KEYCODE_ENTER);
}
});
答案 17 :(得分:0)
将此属性添加到EditText
XML对我有用:
android:lines="1"
它允许用户输入换行符,但EditText
本身的高度不会增加。