防止EditText上的回车键,但仍然显示文本为多行

如何在Android上创build一个EditText,使用户不会input多行文本,但显示仍然是多行的(即有文字换行,而不是文本向右)?

这与内置的短信应用程序类似,我们不能input换行符,但文本显示在多行。

我将inheritance这个小部件,并重写关键事件处理以阻止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); } } 

这是一种方法,您不必重写EditText类。 你只需要用空string来replace换行符。

 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(); } }); 

XML中的属性

 android:lines="5" android:inputType="textPersonName" 

这个为我工作:

 <EditText android:inputType="textShortMessage|textMultiLine" android:minLines="3" ... /> 

它显示一个笑脸,而不是Enter键。

我正在testing这个,它似乎工作:

 EditText editText = new EditText(context); editText.setSingleLine(false); editText.setInputType(android.text.InputType.TYPE_CLASS_TEXT | android.text.InputType.TYPE_TEXT_VARIATION_EMAIL_SUBJECT); 

尝试这个:

 @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_ENTER) { //Nothing return true; } return super.onKeyDown(keyCode, event); } 

你可以像这样从xml中设置它:

 android:imeOptions="actionDone" android:inputType="text" android:maxLines="10" 

不要忘记android:inputType="text" ,如果你没有设置它,它是行不通的。 我不知道为什么。 另外不要忘记将maxLines更改为您的首选值。

只需添加

  android:singleLine="true" 

到你的EditText

@Andreas Rudolph提供的答案包含一个严重的错误,不应该使用。 当您在包含多个换行符的EditText中的文本之后,代码会导致IndexOutOfBoundsException 。 这是由所使用的循环types引起的,一旦内容改变(replace,删除,插入), 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; } } } }); 

被接受的答案工作得很好,直到我用分行复制文本到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); } 

将此属性添加到EditText XML适用于我:

 android:lines="1" 

它允许用户input换行符,但EditText本身的高度不会增加。

 <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"," "); 
  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; } ....... } }); 

对于您可以使用的URI :

 android:inputType="textUri" android:lines="1" android:maxLength="128" 

否则, android:inputType="textPersonName"如上所述适用于其他EditText这样的用户名等。