Многострочный EditText с кнопкой «Готово» - PullRequest
93 голосов
/ 07 июня 2010

Можно ли иметь виджет EditText с установленными android:inputType="textMultiLine" и android:imeOptions="actionDone" одновременно?

Мне бы хотелось, чтобы окно редактирования в несколько строк содержало кнопку «Готово» на клавиатуре, а не «Ввод» (возврат каретки), но, похоже, она не работает ..

Заранее спасибо

Ответы [ 15 ]

153 голосов
/ 07 декабря 2016

Использовать

editText.setImeOptions(EditorInfo.IME_ACTION_DONE);
editText.setRawInputType(InputType.TYPE_CLASS_TEXT);

и в XML:

android:inputType="textMultiLine"
49 голосов
/ 11 июня 2013

Из документации Android: ' "textMultiLine" Обычная текстовая клавиатура, которая позволяет пользователям вводить длинные строки текста, включающие разрывы строк (возврат каретки) . ' Поэтому атрибут textMultiLineне подходит, если вы хотите иметь кнопку «Готово» на клавиатуре.

Простой способ получить многострочное (в данном случае 3 строки) поле ввода с кнопкой «Готово» - это использовать EditText с

android:lines="3" 
android:scrollHorizontally="false" 

Однако по какой-то причине это работает только для меня, если я сделаю эти настройки в коде вместо файла макета (в onCreate) с помощью

TextView tv = (TextView)findViewById(R.id.editText);
if (tv != null) {
    tv.setHorizontallyScrolling(false);
    tv.setLines(3);
}

Надеюсь, это поможеткто-то, как потребовалось довольно много времени, чтобы выяснить.Если вы найдете способ заставить его работать из манифеста, пожалуйста, сообщите нам.

24 голосов
/ 19 октября 2015

Рабочий пример! Создайте нижеуказанный пользовательский класс EditText, который поддерживает эту функцию, и используйте этот класс в XML-файле. Рабочий код:

package com.example;

import android.content.Context;
import android.util.AttributeSet;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputConnection;
import android.widget.EditText;

public class ActionEditText extends EditText
{
   public ActionEditText(Context context)
   {
       super(context);
   }

   public ActionEditText(Context context, AttributeSet attrs)
   {
       super(context, attrs);
   }

   public ActionEditText(Context context, AttributeSet attrs, int defStyle)
   {
       super(context, attrs, defStyle);
   }

   @Override
   public InputConnection onCreateInputConnection(EditorInfo outAttrs)
   {
       InputConnection conn = super.onCreateInputConnection(outAttrs);
       outAttrs.imeOptions &= ~EditorInfo.IME_FLAG_NO_ENTER_ACTION;
       return conn;
   }
}

<com.example.ActionEditText
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:imeOptions="actionDone"
       android:inputType="textAutoCorrect|textCapSentences|textMultiLine" />
7 голосов
/ 21 июля 2011

Я думаю, что это способ сделать тебя. Наличие android:inputType="textMultiLine", android:imeOptions="actionDone" делает ввод ключевых функций неоднозначным. Просто помните, что вы можете использовать android:lines="10" и, возможно, удалить android:inputType="textMultiLine", но в зависимости от того, чего вы хотите достичь, иногда вам просто нужен android:inputType="textMultiLine", и его замена не предусмотрена.

EditText ed=new EditText(this);
ed.setOnKeyListener(new OnKeyListener() {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            if(keyCode == KeyEvent.KEYCODE_ENTER){
                //do your stuff here
            }
            return false;
        }
});
5 голосов
/ 16 апреля 2017

Мне кажется, это прекрасно работает

int lineNum = 2;
mEditText.setHorizontallyScrolling(false);
mEditText.setLines(3);
3 голосов
/ 01 апреля 2015

Простой способ обойти эту ситуацию:

  • сохранить эти атрибуты в EditText:

    android:inputType="textMultiLine" 
    android:scrollHorizontally="false"
    
  • затем добавьте этот код, чтобы скрыть клавиатуру только при нажатии клавиши ENTER:

    editText.setOnEditorActionListener(new OnEditorActionListener() 
    {
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        if (event.getKeyCode() == KeyEvent.KEYCODE_ENTER) 
        {
            editText.setSelection(0);
            InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);      
            return true;
         } 
         else 
         {
            return false;
         }
         }
    });
    
3 голосов
/ 08 июня 2011

Краткий ответ: Нет, я полагаю, что это невозможно до уровня API 11 (3.0).

Та же проблема возникла здесь (обсуждается в комментариях к принятому ответу):

Кнопка действия на клавиатуре Android Soft

Из окончательного комментария:

Глядя на несколько приложений на моем телефоне, кажется, что многострочный блок последнийс видимой кнопкой «Готово» или «Отправить» под ней (например, приложение электронной почты).

2 голосов
/ 04 декабря 2018

Чтобы сделать это в Kotlin (а ​​также дополнительно применить другие конфигурации, такие как textCapSentences, вы можете использовать эту функцию расширения:

// To use this, do NOT set inputType on the EditText in the layout
fun EditText.setMultiLineCapSentencesAndDoneAction() {
    imeOptions = EditorInfo.IME_ACTION_DONE
    setRawInputType(InputType.TYPE_TEXT_FLAG_CAP_SENTENCES or InputType.TYPE_TEXT_FLAG_MULTI_LINE)
}

Использование:

myEditText.setMultiLineCapSentencesAndDoneAction()
2 голосов
/ 24 июня 2013

если вы используете опцию ввода textImeMultiline с флагами imeoptions и actionnext, вы получаете следующую кнопку вместо возврата cariage

2 голосов
/ 29 апреля 2011

Если речь идет не о внешнем виде экранной клавиатуры, вы можете просто поставить слушатель ввода на клавиатуре и запустить состояние «done», если пользователь вводит новую строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...