Как сделать кнопку Android EditView «Готово» и скрыть клавиатуру при нажатии?


115

Когда пользователь нажимает кнопку EditView, Android открывает клавиатуру, чтобы пользователь мог писать в формате EditView.

Проблема в том, что когда пользователь закончит писать, нет возможности скрыть клавиатуру. Пользователь должен нажать кнопку «Назад», чтобы скрыть клавиатуру.

Есть ли способ отобразить Doneна клавиатуре кнопку, которая будет скрывать клавиатуру?


Ответы:



148

Сначала вам нужно установить android:imeOptionsатрибут, равный actionDoneдля вашего целевого EditText, как показано ниже. Это изменит вашу кнопку «RETURN» на виртуальной клавиатуре EditText на кнопку «DONE».

<EditText 
    android:id="@+id/edittext_done"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:hint="Enter some text"
    android:imeOptions="actionDone"
    />

@Michael удалил эту ссылку. Спасибо
Пареш Майани

19
Мне пришлось добавить, android:singleLine="true"чтобы заставить это работать через xml
Jacksonkr

4
android: singleLine устарел. Используйте android: maxLines = "1".
FariborZ

Да, @FariborZ singleLine теперь устарел.
Пареш Майани

1
Важное примечание: singleLine - это не то же самое, что maxLines. Это заблуждение вызывает массу проблем у всех, и это надо отметить везде. stackoverflow.com/questions/30879471/…
milosmns 08

86

Включите оба imeOptions и singleLine :

<EditText 
   android:id="@+id/edittext_done"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:imeOptions="actionDone"
   android:singleLine="true"
   />

35
android:imeActionLabel="Done" 
android:singleLine="true"

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

mainText.setHorizontallyScrolling(false);
mainText.setMaxLines("Maximum integer value that you want to provide");

1
Спасибо, демонстрация была 12, время было 11:58, и вы исправили мою проблему в 11:59: p
shahzain ali

android: singleLine = "true" устарел. Так что используйте android: lines = "1"
Gowtham. р

20

Для кнопки "Готово"

editText.setImeOptions(EditorInfo.IME_ACTION_DONE);

и

android:inputType="text" в xml

Для обработки по готовому щелчку с клавиатуры

    editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event){
            if(actionId == EditorInfo.IME_ACTION_DONE){
                // Your action on done
                return true;
            }
            return false;
        }
    });

`


14

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

android:singleLine="true"

Да ... иначе как отличить переход к следующей строке от закрытия клавиатуры?
jstewart379

Это то, что в итоге сработало для меня. Я решил сделать ошибку и actionDoneтам тоже, на случай, если некоторые устройства будут реагировать иначе.
Jacksonkr

10

Используйте эти две строки для своего EditText

android:imeActionLabel="Done"
android:singleLine="true"

или вы можете добиться этого программно с помощью этой строки.

editText.setImeOptions(EditorInfo.IME_ACTION_DONE);

7

Если свойство не изменяется для виджета, может быть лучше использовать как android:imeOptions="actionDone"в xmlфайле макета .




5

ActionDone используется при нажатии следующей кнопки на клавиатуре, когда клавиатура скрыта. Используйте в Edit Text или AppcompatEdit

XML

1.1 Если вы используете AppCompatEdittext

    <android.support.v7.widget.AppCompatEditText
    android:id="@+id/edittext"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:imeOptions="actionDone"/>

1.2 Если вы используете Edittext

    <EditText
    android:id="@+id/edittext"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:imeOptions="actionDone"/>

ЯВА

EditText edittext= (EditText) findViewById(R.id.edittext);
edittext.setImeOptions(EditorInfo.IME_ACTION_DONE);

5

Я должен отметить это, поскольку многие люди могут бороться с этим, не зная о проблеме.

Если вы хотите, чтобы kb скрывался при нажатии Done, и вы устанавливаете android:imeOptions="actionDone"& android:maxLines="1" без установки EditText, inputTypeон НЕ будет работать, поскольку по умолчанию inputTypeдля EditText это не так, "text"как думают многие.

поэтому, установка только inputTypeдаст вам желаемый результат независимо от того, что вы настраиваете это нравится "text", "number"... и т.д..


2

На самом деле вы можете установить собственный текст для этой маленькой синей кнопки. В файле xml просто используйте

android:imeActionLabel="whatever"

в вашем EditText.

Или в файле java используйте

etEditText.setImeActionLabel("whatever", EditorInfo.IME_ACTION_DONE);

Я произвольно выбираю IME_ACTION_DONE в качестве примера того, что должно быть во втором параметре этой функции. Полный список этих действий можно найти здесь .

Следует отметить, что это не приведет к тому, что текст будет отображаться на всех клавиатурах на всех устройствах. Некоторые клавиатуры не поддерживают текст на этой кнопке (например, swiftkey). И некоторые устройства его тоже не поддерживают. Хорошее правило: если вы уже видите текст на кнопке, это изменит его на все, что вам нужно.


2

Котлин Решение

Прямой способ обработки скрытой клавиатуры + действия в Kotlin:

// Set action
edittext.setOnEditorActionListener { _, actionId, _ ->
    if (actionId == EditorInfo.IME_ACTION_DONE) {
        // Hide Keyboard
        val inputMethodManager = context.getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager
        inputMethodManager.hideSoftInputFromWindow(windowToken, 0)
        true
    }
    false
}

Расширение Kotlin

Используйте это для вызова edittext.onDone {/*action*/}вашего основного кода. Делает его более читаемым и удобным в обслуживании

edittext.onDone { edittext.hideKeyboard() }

fun View.hideKeyboard() {
    val inputMethodManager = context.getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager
    inputMethodManager.hideSoftInputFromWindow(windowToken, 0)
}

fun EditText.onDone(callback: () -> Unit) {
    // These lines optional if you don't want to set in Xml
    imeOptions = EditorInfo.IME_ACTION_DONE
    maxLines = 1
    setOnEditorActionListener { _, actionId, _ ->
        if (actionId == EditorInfo.IME_ACTION_DONE) {
            callback.invoke()
            true
        }
        false
    }
}

Дополнительные расширения клавиатуры

Если вам нужно больше способов упростить работу с клавиатурой (показать, закрыть, сфокусировать): прочтите этот пост

Не забудьте добавить эти параметры в ваш edittext Xml, если не в коде.

<EditText ...
    android:imeOptions="actionDone"
    android:inputType="text"/>

Нужна inputType="textMultiLine"поддержка? Прочтите этот пост и не добавляйте imeOptionsили inputTypeв Xml



0

Если вы используете

android:imeOptions="actionDone" 

тогда вы должны использовать

android:inputType="text"

тогда только вы можете увидеть кнопку «Действие выполнено» на клавиатуре.


0

Если вам вообще не нужна какая-либо кнопка (например, вы разрабатываете графический интерфейс для слепых, где нажатие не может быть позиционным, и вы полагаетесь на одиночные / двойные / длинные нажатия):

text.setItemOptions(EditorInfo.IME_ACTION_NONE)

Или в Котлине:

text.imeOptions = EditorInfo.IME_ACTION_NONE
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.