防止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这样的用户名等。