EditText не будет обертывать текст

Я знаю, что есть много связанных вопросов в Stackoverflow, но я пытался сделать все, что написано в любом из них, и до сих пор я не мог заставить это работать.

моя проблема проста. У меня есть приложение для android, и у меня есть поле, где пользователь будет вводить текст. Однако я не хочу, чтобы этот текст был многострочным (в нем не должно быть "\n"), но я хочу, чтобы он обернулся, если размер строки больше, чем видовое окно. В общем, я хочу того же поведения. что текстовое поле в поле темы Gmail имеет.

Это весь мой вид:

<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>

текст я хочу иметь такое поведение является одной с id равным @+ИД/edit_question_value. До сих пор я мог либо сделать его действительно многострочным (чтобы пользователь мог ввести enter, если он хочет), либо однострочным, и текст не будет обернут. Возможно, некоторые из элементов вокруг текста имеют некоторые помехи, и именно поэтому я включил все вид.

кто-нибудь знает, что происходит?

1 ответов


это то, что беспокоило многих людей раньше, и я мог найти ответ, когда мне это было нужно. В чистом XML, то есть. Если мы можем использовать программирование, а не только разметку, мы можем сделать это с немного hack если вы можете. В основном мы объявляем многострочный 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" />

Да, я знаю, что вы думаете "но эй, Хуан это multiliner EditText и я хочу один лайнер, как в предметной области gmail". Я знаю, я знаю, но мы собираемся позаботиться об этом прямо сейчас, удалив поведение многострочной части, которую мы не хотим, сохраняя при этом текстовую обертку, которую мы do хочу.

теперь остальная часть код:

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

вы, вероятно, можете прочитать код довольно легко, но в случае, если кому-то нужно объяснение, мы устанавливаем OnKeyListener до EditText мы хотим быть "oneline-multilinelike", и если пользователь нажимает клавишу возврата (KEYCODE_ENTER), мы говорим событию не распространяться, возвращая true что в данном контексте означает, что мы обработали событие.

результат:

enter image description here

соображения

нажатие клавиши возврата-не единственный способ ввода новой строки. Пользователь может скопировать / вставить текст и в конечном итоге многострочная запись в однострочном 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);