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

115

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

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

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

D-Man
источник

Ответы:

140

Используйте TextView.setImeOptions и передайте ему actionDone. лайкtextView.setImeOptions(EditorInfo.IME_ACTION_DONE);

dmazzoni
источник
8
textView.setImeOptions(EditorInfo.IME_ACTION_DONE);
sulai 02
14
Мне пришлось добавить, textView.singleLine(true)чтобы это работало программно.
Jacksonkr
но это устарело с Android 2.3
Сумит Кумар Саха
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);
NarenderNishad
источник
7

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

Том
источник
6

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

android:imeActionLabel="Done"
android:singleLine="true" 
Киран Махале
источник
5

Для кода:

editText.setImeOptions(EditorInfo.IME_ACTION_DONE);
Steven.Nguyen
источник
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

Gibolt
источник
0

используйте это на ваш взгляд

<EditText 
    ....
    ....
    android:imeOptions="actionDone" 
    android:id="@+id/edtName"
    />
Мариум Джавед
источник
0

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

android:imeOptions="actionDone" 

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

android:inputType="text"

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

Адитья Патил
источник
0

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

text.setItemOptions(EditorInfo.IME_ACTION_NONE)

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

text.imeOptions = EditorInfo.IME_ACTION_NONE
albaspazio
источник