Bagaimana cara membuat tombol 'Selesai' Android EditView dan menyembunyikan keyboard saat diklik?

115

Saat pengguna mengklik EditView, Android membuka keyboard sehingga pengguna dapat menulis di EditView.

Masalahnya, saat pengguna selesai menulis, tidak ada cara untuk menyembunyikan keyboard. Pengguna harus menekan tombol kembali untuk menyembunyikan keyboard.

Apakah ada cara untuk menampilkan Donetombol di keyboard yang akan menyembunyikan keyboard?

d-man
sumber

Jawaban:

139

Gunakan TextView.setImeOptions dan teruskan actionDone. SukatextView.setImeOptions(EditorInfo.IME_ACTION_DONE);

dmazzoni.dll
sumber
8
textView.setImeOptions(EditorInfo.IME_ACTION_DONE);
sulai
14
Saya harus menambahkan textView.singleLine(true)agar ini bekerja secara terprogram.
Jacksonkr
tapi ini sudah usang sejak android 2.3
Sumit Kumar Saha
148

Pertama, Anda perlu mengatur android:imeOptionsatribut sama dengan actionDoneuntuk EditText target Anda seperti yang terlihat di bawah ini. Itu akan mengubah tombol 'KEMBALIKAN' di keyboard lunak EditText menjadi tombol 'SELESAI'.

<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
sumber
@Michael menghapus tautan itu. Terima kasih
Paresh Mayani
19
Saya harus menambahkan android:singleLine="true"agar ini berfungsi melalui xml
Jacksonkr
4
android: singleLine tidak digunakan lagi. Gunakan android: maxLines = "1".
FariborZ
Ya @FariborZ singleLine tidak digunakan lagi sekarang.
Paresh Mayani
1
Catatan penting: singleLine tidak sama dengan maxLines. Kesalahpahaman ini menyebabkan banyak masalah bagi semua orang, kita perlu mencatatnya di mana-mana. stackoverflow.com/questions/30879471/…
milosmns
86

Sertakan keduanya imeOptions dan 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
sumber
35
android:imeActionLabel="Done" 
android:singleLine="true"

Dalam file XML berfungsi dengan baik. Tetapi ini juga akan menyebabkan editTextuntuk tetap mengetik dalam satu baris yang mungkin tidak Anda inginkan. Jadi menambahkan mengikuti ke kode Anda akan memastikan bahwa Anda tidak akan berakhir mengetik semuanya dalam satu baris.

mainText.setHorizontallyScrolling(false);
mainText.setMaxLines("Maximum integer value that you want to provide");
Santosh Pillai
sumber
1
Terima kasih, Demo pada 12, waktunya 11:58 dan Anda memperbaiki masalah saya pada 11:59: p
shahzain ali
android: singleLine = "true" sudah tidak digunakan lagi. Jadi gunakan, android: lines = "1"
Gowtham. R
20

Untuk menyelesaikan Tombol

editText.setImeOptions(EditorInfo.IME_ACTION_DONE);

dan

android:inputType="text" dalam xml

Untuk penanganan selesai diklik dari keyboard

    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
sumber
14

Gunakan ini:

android:singleLine="true"
Frank Nguyen
sumber
Ya ... jika tidak, bagaimana cara membedakan ke baris berikutnya dengan menutup keyboard?
jstewart379
Inilah yang akhirnya berhasil untuk saya. Saya memutuskan untuk melakukan kesalahan dengan memilikinya actionDonejuga, kalau-kalau beberapa perangkat bereaksi berbeda.
Jacksonkr
10

Gunakan dua baris ini untuk Anda EditText

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

atau Anda dapat mencapainya secara terprogram dengan baris ini.

editText.setImeOptions(EditorInfo.IME_ACTION_DONE);
NarenderNishad
sumber
7

Jika properti tidak berubah untuk widget mungkin lebih baik digunakan seperti android:imeOptions="actionDone"di xmlfile layout .

Tom
sumber
6

Menggunakan:

android:imeActionLabel="Done"
android:singleLine="true" 
Kiran Mahale
sumber
5

Untuk kode:

editText.setImeOptions(EditorInfo.IME_ACTION_DONE);
Steven.Nguyen
sumber
5

ActionDone digunakan saat mengklik tombol berikutnya di keyboard saat keyboard bersembunyi. Gunakan di Edit Teks atau AppcompatEdit

XML

1.1 Jika Anda menggunakan 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 Jika Anda menggunakan 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
sumber
5

Saya harus menunjukkan itu karena banyak orang dapat berjuang untuk itu tanpa mengetahui masalahnya.

Jika Anda ingin kb bersembunyi saat mengklik Done, dan Anda mengatur android:imeOptions="actionDone"& android:maxLines="1" tanpa mengatur EditText Anda TIDAKinputType akan bekerja sebagai default untuk EditText tidak seperti yang dipikirkan banyak orang.inputType"text"

jadi, pengaturan hanya inputTypeakan memberikan hasil yang Anda inginkan apapun apa yang Anda pengaturannya seperti "text", "number", ... dll.

Muhammed Refaat
sumber
2

Sebenarnya Anda dapat mengatur teks khusus ke tombol biru kecil itu. Di file xml gunakan saja

android:imeActionLabel="whatever"

di EditText Anda.

Atau dalam penggunaan file java

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

Saya memilih IME_ACTION_DONE secara sewenang-wenang sebagai contoh dari apa yang harus dimasukkan di parameter kedua untuk fungsi ini. Daftar lengkap tindakan ini dapat ditemukan di sini .

Perlu dicatat bahwa ini tidak akan menyebabkan teks muncul di semua keyboard di semua perangkat. Beberapa keyboard tidak mendukung teks pada tombol itu (mis. Swiftkey). Dan beberapa perangkat juga tidak mendukungnya. Aturan yang baik adalah, jika Anda sudah melihat teks di tombol, ini akan mengubahnya menjadi apa pun yang Anda inginkan.

Zar E Ahmer
sumber
2

Solusi Kotlin

Cara langsung untuk menangani keyboard sembunyikan + tindakan selesai di Kotlin adalah:

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

Ekstensi Kotlin

Gunakan ini untuk memanggil edittext.onDone {/*action*/}kode utama Anda. Menjaga agar lebih mudah dibaca dan dipelihara

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

Ekstensi Keyboard Tambahan

Jika Anda ingin lebih banyak cara untuk menyederhanakan bekerja dengan keyboard (tunjukkan, tutup, fokus): Baca posting ini

Jangan lupa untuk menambahkan opsi ini ke edittext Xml Anda, jika tidak dalam kode

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

Butuh inputType="textMultiLine"dukungan? Baca posting ini dan jangan menambahkan imeOptionsatau inputTypedalam Xml

Gibolt
sumber
0

gunakan ini dalam pandanganmu

<EditText 
    ....
    ....
    android:imeOptions="actionDone" 
    android:id="@+id/edtName"
    />
Marium Jawed
sumber
0

Jika Anda menggunakan

android:imeOptions="actionDone" 

maka Anda harus menggunakan

android:inputType="text"

maka hanya Anda yang dapat melihat tombol Tindakan Selesai di Keyboard.

Aditya Patil
sumber
0

Jika Anda tidak menginginkan tombol sama sekali (mis. Anda mengembangkan GUI untuk orang buta di mana ketukan tidak dapat diposisikan dan Anda mengandalkan ketukan tunggal / ganda / panjang):

text.setItemOptions(EditorInfo.IME_ACTION_NONE)

Atau di Kotlin:

text.imeOptions = EditorInfo.IME_ACTION_NONE
albaspazio.dll
sumber