如何在Android上创建EditText,以便用户不会输入多行文本,但显示仍然是多行的(即存在文字包装,而不是文字向右)?防止在EditText上输入键,但仍然显示文本为多行
它与内置SMS应用程序类似,我们无法输入换行符,但文本显示为多行。
如何在Android上创建EditText,以便用户不会输入多行文本,但显示仍然是多行的(即存在文字包装,而不是文字向右)?防止在EditText上输入键,但仍然显示文本为多行
它与内置SMS应用程序类似,我们无法输入换行符,但文本显示为多行。
我会继承窗口小部件并覆盖关键事件,以阻止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);
}
}
试试这个:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_ENTER)
{
//Nothing
return true;
}
return super.onKeyDown(keyCode, event);
}
不可以。这会将编辑限制为单行。 OP需要多条线路;他只是不希望用户能够输入换行符。 – 2011-05-20 10:59:21
看到我编辑的答案 – 2011-05-20 11:06:31
好的......我提议的同样的东西 – 2011-05-20 11:11:46
这是一个方法,你不要必须重写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();
}
});
+1这比我接受的答案更有用,原因很简单,我可以使用它作为TextWatcher的默认实现,它可以通过子类扩展(那么只需要调用super.afterTextChanged(...)来保留检查换行符。Works! – AgentKnopf 2012-07-11 10:42:23
For循环条件应该是'i> 0'而不是'i> = 0'。 ','s.subSequence(i-1,i)'得到一个'IndexOutOfBoundsException' – TalkLittle 2014-11-04 22:01:29
我认为这会抛出一个IndexOutOfBoundsException,用于复制和粘贴多行新的行字符。 – Chriskot 2015-03-24 00:17:34
我测试这一点,似乎工作:
EditText editText = new EditText(context);
editText.setSingleLine(false);
editText.setInputType(android.text.InputType.TYPE_CLASS_TEXT | android.text.InputType.TYPE_TEXT_VARIATION_EMAIL_SUBJECT);
真棒谢谢。在XML中设置任何东西都会禁用我的ET单击监听器......所以这样做并不是!键盘上的返回键变成“完成”按钮。 (我只需要'editText.setSingleLine(false);')。 – Azurespot 2016-05-13 06:59:33
这完全取决于使用的键盘。许多人仍然会显示一个输入键 – 2017-06-15 21:01:02
添加这个属性来EditText
XML工作对我来说:
android:lines="1"
它可以让用户输入换行符但EditText
本身不增加身高。
对于URI你可以使用:
android:inputType="textUri"
android:lines="1"
android:maxLength="128"
否则android:inputType="textPersonName"
以上针对其他的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中。所以我添加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 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;
}
.......
}
});
可以从这样的XML设置:
android:imeOptions="actionDone"
android:inputType="text"
android:maxLines="10"
不要忘记android:inputType="text"
,如果不设置它,这是行不通的。我不知道为什么。 另外不要忘记将maxLines
更改为您的首选值。
这完全取决于使用的键盘。许多人仍然会显示一个输入键 – 2017-06-15 21:01:21
由@Andreas鲁道夫提供的答案包含一个关键的错误,不应该被使用。当您在EditText
中包含多个换行符时,代码会导致IndexOutOfBoundsException
。这是由于使用的循环类型造成的,一旦内容更改(替换,删除,插入),对象将立即调用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;
}
}
}
});
你应该编辑答案,而不是制作一个新答案。 – 2016-12-14 19:47:47
@RobertMartin我一直在想这个,并在Meta网站上寻求帮助,他们建议我应该发布一个新的答案。因为我所做的更改与作者的原始意图相冲突。 – 2016-12-14 20:04:56
不错!但是,如果您首先按Enter键,则在开始处仍会有一个新行(因此'i> = 0'应该可以工作)^^ – Fllo 2017-01-18 22:13:37
只需添加安卓的inputType = “textPersonName” 的EditText上它会从按下进入 – Nepster 2014-05-21 11:06:48