2011-05-20 86 views
59

如何在Android上创建EditText,以便用户不会输入多行文本,但显示仍然是多行的(即存在文字包装,而不是文字向右)?防止在EditText上输入键,但仍然显示文本为多行

它与内置SMS应用程序类似,我们无法输入换行符,但文本显示为多行。

+9

只需添加安卓的inputType = “textPersonName” 的EditText上它会从按下进入 – Nepster 2014-05-21 11:06:48

回答

43

我会继承窗口小部件并覆盖关键事件,以阻止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); 
    } 
} 
+4

如果这一行停止它:'返回super.onKeyDown(的keyCode,事件); '在onKeyDown或我想象? :P – necixy 2011-05-20 11:04:30

+0

错字,感谢您的接收 – 2011-05-20 11:11:17

+0

我们都为同一个社区工作。 不客气。 :) – necixy 2011-05-20 11:16:54

5

试试这个:

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

不可以。这会将编辑限制为单行。 OP需要多条线路;他只是不希望用户能够输入换行符。 – 2011-05-20 10:59:21

+0

看到我编辑的答案 – 2011-05-20 11:06:31

+0

好的......我提议的同样的东西 – 2011-05-20 11:11:46

37

这是一个方法,你不要必须重写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(); 
    } 
}); 
+3

+1这比我接受的答案更有用,原因很简单,我可以使用它作为TextWatcher的默认实现,它可以通过子类扩展(那么只需要调用super.afterTextChanged(...)来保留检查换行符。Works! – AgentKnopf 2012-07-11 10:42:23

+1

For循环条件应该是'i> 0'而不是'i> = 0'。 ','s.subSequence(i-1,i)'得到一个'IndexOutOfBoundsException' – TalkLittle 2014-11-04 22:01:29

+1

我认为这会抛出一个IndexOutOfBoundsException,用于复制和粘贴多行新的行字符。 – Chriskot 2015-03-24 00:17:34

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); 
+0

真棒谢谢。在XML中设置任何东西都会禁用我的ET单击监听器......所以这样做并不是!键盘上的返回键变成“完成”按钮。 (我只需要'editText.setSingleLine(false);')。 – Azurespot 2016-05-13 06:59:33

+0

这完全取决于使用的键盘。许多人仍然会显示一个输入键 – 2017-06-15 21:01:02

0

添加这个属性来EditText XML工作对我来说:

android:lines="1" 

它可以让用户输入换行符但EditText本身不增加身高。

23

属性,XML

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

谢谢,最简单!虽然我注意到它阻止了ET上的点击监听器正在工作......所以使用'editText.setSingleLine(false);'如果是这样。 – Azurespot 2016-05-13 07:00:59

+3

android:inputType =“textPersonName”不起作用 – axd 2016-06-16 15:41:46

+0

这完全取决于使用的键盘。许多人仍然会显示一个输入键 – 2017-06-15 21:00:08

0

对于URI你可以使用:

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

否则android:inputType="textPersonName"以上针对其他的EditText此用户名的作品中提到,等

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

这一个适合我:

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

它显示笑脸,而不是回车键。

+2

最佳答案,作品无需更改太多的代码! – Jaydeep 2015-01-31 23:26:21

+2

从经验来看,这不适用于每个键盘。我们周围的HTC手机仍然显示输入密钥。 – Treeline 2015-03-18 14:38:34

+0

这完全取决于使用的键盘。许多人仍然会显示输入键 – 2017-06-15 20:59:54

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

     } 
    }); 
3

可以从这样的XML设置:

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

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

+0

这完全取决于使用的键盘。许多人仍然会显示一个输入键 – 2017-06-15 21:01:21

3

只需添加

 android:singleLine="true" 

您的EditText

+1

这是弃用! – Blasco73 2017-05-17 17:15:27

3

由@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; 
      } 
     } 
    } 
}); 
+0

你应该编辑答案,而不是制作一个新答案。 – 2016-12-14 19:47:47

+0

@RobertMartin我一直在想这个,并在Meta网站上寻求帮助,他们建议我应该发布一个新的答案。因为我所做的更改与作者的原始意图相冲突。 – 2016-12-14 20:04:56

+1

不错!但是,如果您首先按Enter键,则在开始处仍会有一个新行(因此'i> = 0'应该可以工作)^^ – Fllo 2017-01-18 22:13:37

相关问题