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ę?

d-man
źródło

Odpowiedzi:

139

Użyj TextView.setImeOptions i przekaż actionDone. lubićtextView.setImeOptions(EditorInfo.IME_ACTION_DONE);

dmazzoni
źródło
8
textView.setImeOptions(EditorInfo.IME_ACTION_DONE);
Sulai
14
Musiałem dodać, textView.singleLine(true)aby to działało programowo.
Jacksonkr,
ale jest to przestarzałe od czasu Androida 2.3
Sumit Kumar Saha
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"
    />
Paresh Mayani
źródło
@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"
   />
Oded Breiner
źródło
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");
Santosh Pillai
źródło
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;
        }
    });

`

Shangeeth Sivan
źródło
14

Użyj tego:

android:singleLine="true"
Frank Nguyen
źródło
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);
NarenderNishad
źródło
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 .

Tomek
źródło
6

Posługiwać się:

android:imeActionLabel="Done"
android:singleLine="true" 
Kiran Mahale
źródło
5

Kod:

editText.setImeOptions(EditorInfo.IME_ACTION_DONE);
Steven.Nguyen
źródło
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);
Raj
źródło
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.

Muhammed Refaat
źródło
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.

Zar E Ahmer
źródło
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

Gibolt
źródło
0

użyj tego w swoim przekonaniu

<EditText 
    ....
    ....
    android:imeOptions="actionDone" 
    android:id="@+id/edtName"
    />
Marium Jawed
źródło
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.

Aditya Patil
źródło
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
albaspazio
źródło