Як зробити кнопку Android EditView "Готово" та приховати клавіатуру при натисканні?


115

Коли користувач натискає на EditView, Android відкриває клавіатуру, щоб користувач міг писати в EditView.

Проблема полягає в тому, що, коли користувач закінчив писати, немає можливості приховати клавіатуру. Користувач повинен натиснути кнопку "назад", щоб приховати клавіатуру.

Чи є спосіб відобразити Doneна клавіатурі кнопку, яка приховає клавіатуру?


Відповіді:


139

Використовуйте TextView.setImeOptions і передайте це actionDone. подібно доtextView.setImeOptions(EditorInfo.IME_ACTION_DONE);


8
textView.setImeOptions(EditorInfo.IME_ACTION_DONE);
сулай

14
Мені довелося додати, textView.singleLine(true)щоб змусити це працювати програмно.
Джексонкр

але це застаріло, оскільки андроїд 2.3
Суміт Кумар Саха

148

Спочатку потрібно встановити android:imeOptionsатрибут, рівний actionDoneдля вашого цільового EditText, як показано нижче. Це дозволить змінити кнопку "ПОВЕРНУТИСЯ" на м'якій клавіатурі вашого редагування тексту на кнопку "ЗРОБАНО".

<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 видалив це посилання. Спасибі
Paresh Mayani

19
Мені довелося додати, android:singleLine="true"щоб це працювало через xml
Jacksonkr

4
android: застарілий singleLine Використовуйте android: maxLines = "1".
FariborZ

Так @FariborZ singleLine зараз застарілий.
Paresh Mayani

1
Важлива примітка: singleLine - це не те саме, що maxLines. Це неправильне уявлення спричиняє багато проблем для всіх, нам потрібно зазначити, що всюди. stackoverflow.com/questions/30879471 / ...
milosmns

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 = "вірно" застаріло. Тому використовуйте android: lines = "1"
Gowtham. R

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там є, лише на випадок, якщо деякі пристрої реагують інакше.
Джексонкр

10

Використовуйте ці два рядки для свого EditText

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

або ви можете досягти цього програмно за цим рядком.

editText.setImeOptions(EditorInfo.IME_ACTION_DONE);

7

Якщо властивість не змінюється для віджета, можливо, краще використовувати його, як android:imeOptions="actionDone"у xmlфайлі макета .




5

ActionDone використовується при натисканні наступної кнопки на клавіатурі, коли клавіатура часу прихована. Використовуйте в редагуванні тексту або 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"/>

JAVA

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 як приклад того, що повинно входити у другий параметр для цієї функції. Повний перелік цих дій можна знайти тут .

Слід зазначити, що це не призведе до появи тексту на всіх клавіатурах на всіх пристроях. Деякі клавіатури не підтримують текст цієї кнопки (наприклад, швидка клавіша). І деякі пристрої також не підтримують його. Хороше правило - якщо ви бачите текст уже на кнопці, це змінить його на все, що ви хочете.


2

Рішення Котліна

Прямий спосіб обробки клавіатури приховати + виконати дії в Котліні:

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

Додаткові розширення клавіатури

Якщо ви хочете більше способів спростити роботу з клавіатурою (показати, закрити, фокусувати): Прочитайте цю публікацію

Не забудьте додати ці параметри до 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.