EditText不会包装其文本

Raf*_*ael 7 android view android-edittext

我知道Stackoverflow中有很多相关的问题,但是我尝试用其中任何一个编写的所有内容,到目前为止,我无法使用它.

我的问题很简单.我有一个Android应用程序,我有一个用户将输入文本的框.但是,我不希望这个文本是多行的(它不应该有"\n"),但如果行的大小大于视口,我希望它包装.所以基本上,我想要的是与Gmail主题字段上的textBox相同的行为.

这是我的全部观点:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="fill_parent"
          android:layout_height="match_parent"
          android:orientation="vertical">

<TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/question"
        android:textAppearance="@style/titleFont"/>

<EditText
    android:id="@+id/edit_question_value"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="0.3"
    android:gravity="top"
    android:inputType="textImeMultiLine|textEmailSubject"
    android:maxLength="70"
        >

</EditText>

<TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/answer"
        android:textAppearance="@style/titleFont"/>

<EditText
        android:id="@+id/edit_question_answer"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:gravity="top"
        android:layout_weight="0.7"
        android:inputType="textMultiLine"/>

<LinearLayout
        android:id="@+id/linearLayout1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal">

    <Button
            android:id="@+id/save_question"
            android:layout_width="120dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:layout_weight="0.5"
            android:text="@string/save"/>

    <Button
            android:id="@+id/cancel_edit_question"
            android:layout_width="120dp"
            android:layout_height="wrap_content"
            android:layout_weight="0.5"
            android:text="@string/cancel"/>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

我想要具有此行为的文本是id等于@ + id/edit_question_value的文本.到目前为止,我已经能够使它成为真正的多线(因此用户可以输入,如果他想要)或单行,文本将不会换行.也许文本周围的一些元素有一些干扰,这就是为什么我包括整个视图.

有谁知道发生了什么?

Jua*_*tés 8

这件事以前困扰了很多人,在我需要的时候找不到答案.在纯XML中,即.如果我们可以使用编程而不仅仅是标记,那么如果可以的话,我们可以通过一点点破解来实现.基本上,我们声明一个multiLine editText,然后捕获返回键以避免换行.

首先是xml中的声明:

<EditText
    android:id="@+id/noReturnEditText"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:imeOptions="actionDone"
    android:inputType="textMultiLine|textCapSentences"
    android:text="lorem ipsum \n dolor site amet helping stackoverflow" />
Run Code Online (Sandbox Code Playgroud)

是的,我知道你在想什么"但是,嘿,胡安这是一个多线人EditText,我想要一个像gmail的主题区域一样的班轮".我知道,我知道,但我们要照顾它,现在,通过删除不想要的多部分的行为,同时保持我们的文本换行想要的.

现在剩下的代码:

EditText noReturnEditText = (EditText) findViewById(R.id.noReturnEditText);
         noReturnEditText.setOnKeyListener(new OnKeyListener(){
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                if (keyCode == KeyEvent.KEYCODE_ENTER) return true;
                return false;
            }
        });
Run Code Online (Sandbox Code Playgroud)

您可以很容易地阅读代码,但是如果有人需要解释,我们设置OnKeyListenerEditText我们希望"oneline-multilinelike",如果用户按下返回键(KEYCODE_ENTER),我们告诉事件不要传播通过返回true,在这种情况下,我们已经处理了事件.

结果:

在此输入图像描述

注意事项

按返回键不是输入新行的唯一方法.用户可以复制/粘贴一些文本,最后在单行EditText上使用多行条目.不要担心!我们可以在存储它之前剥离它,或者将它用于类似的东西

myData = rawText.replace(System.getProperty("line.separator"), " ");

如果我有很多EditText观点怎么办?

嗯,你基本上有两种选择.一个接一个地做,拉出你的眼睛做这样的事情,它列出每个视图的视图和循环.

//Declare the reusable listener
  OnKeyListener myListener = new OnKeyListener(){
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            if (keyCode == KeyEvent.KEYCODE_ENTER) return true;
            return false;
        }
    }  
//Loop through the views
    int viewIds[] = {R.id.edittext1,R.id.edittext2,R.id.edittext3,R.id.edittext4};
    for(int id : viewIds) ((EditText)findViewById).setOnKeyListener(myListener);
Run Code Online (Sandbox Code Playgroud)