Jak ustawić przycisk „Gotowe” w widoku edycji w systemie Android i ukryć klawiaturę po kliknięciu?


115

Gdy użytkownik kliknie przycisk EditView, system Android otwiera klawiaturę, aby użytkownik mógł pisać w EditView.

Problem polega na tym, że gdy użytkownik skończy pisać, nie ma możliwości ukrycia klawiatury. Użytkownik musi nacisnąć przycisk Wstecz, aby ukryć klawiaturę.

Czy istnieje sposób, aby wyświetlić Doneprzycisk na klawiaturze, który ukryje klawiaturę?


Odpowiedzi:



148

Najpierw musisz ustawić android:imeOptionsatrybut równy actionDonedla docelowego tekstu edycji, jak pokazano poniżej. Spowoduje to zmianę przycisku „RETURN” na klawiaturze ekranowej EditText na przycisk „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 usunął ten link. Dzięki
Paresh Mayani

19
Musiałem dodać, android:singleLine="true"aby to działało przez xml
Jacksonkr

4
android: singleLine jest przestarzały. Użyj androida: maxLines = "1".
FariborZ

Tak @FariborZ singleLine jest teraz przestarzałe.
Paresh Mayani

1
Ważna uwaga: singleLine to nie to samo co maxLines. To błędne przekonanie powoduje wiele problemów dla wszystkich, musimy to zauważyć wszędzie. stackoverflow.com/questions/30879471/ ...
milosmns

86

Uwzględnij zarówno imeOptions i 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"

W pliku XML działa dobrze. Ale spowoduje to również, że editTextbędzie kontynuował pisanie w jednej linii, czego możesz nie chcieć. Więc dodanie następującego kodu do kodu zapewni, że nie skończysz wpisywać wszystkiego w jednym wierszu.

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

1
Dzięki, Demo było 12, godzina 11:58 i naprawiłeś mój problem w 11:59: p
shahzain ali

android: singleLine = "true" został wycofany. Użyj więc android: lines = "1"
Gowtham. R

20

Za ukończenie Button

editText.setImeOptions(EditorInfo.IME_ACTION_DONE);

i

android:inputType="text" w pliku xml

Do obsługi po kliknięciu z klawiatury

    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

Użyj tego:

android:singleLine="true"

Tak ... w przeciwnym razie, jak odróżnić przejście do następnej linii od zamknięcia klawiatury?
jstewart379

To właśnie skończyło się dla mnie pracą. Postanowiłem się pomylić, mając actionDonetam również, na wypadek gdyby niektóre urządzenia reagowały inaczej.
Jacksonkr,

10

Użyj tych dwóch linii do swojego EditText

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

lub możesz to osiągnąć programowo za pomocą tej linii.

editText.setImeOptions(EditorInfo.IME_ACTION_DONE);

7

Jeśli właściwość widżetu nie zmienia się, lepiej będzie użyć go tak, jak android:imeOptions="actionDone"w xmlpliku układu .




5

ActionDone jest używane po kliknięciu następnego przycisku na klawiaturze, w którym klawiatura jest ukryta.

XML

1.1 Jeśli używasz 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 Jeśli używasz Edittext

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

JAWA

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

5

Muszę to zaznaczyć, ponieważ wiele osób może się z tym zmagać, nie znając problemu.

Jeśli chcesz, aby kb ukrywał się po kliknięciu Done, a ustawisz android:imeOptions="actionDone"& android:maxLines="1" bez ustawiania tekstu edycji inputType, NIE będzie on działać jako domyślny inputTypedla tekstu edycji, nie jest tak, "text"jak myśli wiele osób.

tak, tylko ustawienie inputTypedaje pożądane rezultaty niezależnie od tego, czego ustawienie go lubić "text", "number"... etc.


2

Właściwie możesz ustawić niestandardowy tekst na ten mały niebieski przycisk. W pliku xml po prostu użyj

android:imeActionLabel="whatever"

w Twoim EditText.

Lub w użyciu pliku java

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

Dowolnie wybieram IME_ACTION_DONE jako przykład tego, co powinno znaleźć się w drugim parametrze tej funkcji. Pełną listę tych działań można znaleźć tutaj .

Należy zauważyć, że nie spowoduje to pojawienia się tekstu na wszystkich klawiaturach na wszystkich urządzeniach. Niektóre klawiatury nie obsługują tekstu na tym przycisku (np. Klawisz swift). Niektóre urządzenia też go nie obsługują. Dobra zasada jest taka, że ​​jeśli zobaczysz tekst już na przycisku, zmieni to na cokolwiek chcesz.


2

Rozwiązanie Kotlin

Bezpośrednim sposobem obsługi ukrywania klawiatury + wykonanej akcji w Kotlin jest:

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

Rozszerzenie Kotlin

Użyj tego, aby wywołać edittext.onDone {/*action*/}swój główny kod. Sprawia, że ​​jest bardziej czytelny i łatwy w utrzymaniu

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

Dodatkowe rozszerzenia klawiatury

Jeśli chcesz uzyskać więcej sposobów na uproszczenie pracy z klawiaturą (pokaż, zamknij, zaznacz): Przeczytaj ten wpis

Nie zapomnij dodać tych opcji do swojego edittext Xml, jeśli nie w kodzie

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

Potrzebujesz inputType="textMultiLine"wsparcia? Przeczytaj ten post i nie dodawaj imeOptionsani inputTypew Xml


0

użyj tego w swoim przekonaniu

<EditText 
    ....
    ....
    android:imeOptions="actionDone" 
    android:id="@+id/edtName"
    />

0

Jeśli używasz

android:imeOptions="actionDone" 

to musisz użyć

android:inputType="text"

tylko wtedy możesz zobaczyć przycisk Wykonano akcję na klawiaturze.


0

Jeśli w ogóle nie chcesz żadnego przycisku (np. Tworzysz GUI dla niewidomych, w którym dotknięcie nie może być pozycyjne i polegasz na dotknięciach pojedynczych / podwójnych / długich):

text.setItemOptions(EditorInfo.IME_ACTION_NONE)

Lub w Kotlinie:

text.imeOptions = EditorInfo.IME_ACTION_NONE
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.