Tutup keyboard virtual pada tombol tekan

133

Saya memiliki Activitydengan EditText, tombol dan ListView. Tujuannya adalah untuk mengetik layar pencarian di EditText, tekan tombol dan minta hasil pencarian mengisi daftar ini.

Ini semua bekerja dengan sempurna, tetapi keyboard virtual berperilaku aneh.

Jika saya mengklik EditText, saya mendapatkan keyboard virtual. Jika saya mengklik tombol "Selesai" pada keyboard virtual, itu hilang. Namun, jika saya mengklik tombol pencarian saya sebelum mengklik "Selesai" pada keyboard virtual, keyboard virtual tetap ada dan saya tidak bisa menghilangkannya. Mengklik tombol "Selesai" tidak menutup keyboard. Ini mengubah tombol "Selesai" dari "Selesai" menjadi panah dan tetap terlihat.

Terima kasih atas bantuan Anda

Andrew
sumber

Jawaban:

304
InputMethodManager inputManager = (InputMethodManager)
                                  getSystemService(Context.INPUT_METHOD_SERVICE); 

inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(),
                                     InputMethodManager.HIDE_NOT_ALWAYS);

Saya menempatkan ini tepat setelah onClick(View v)acara.

Anda perlu mengimpor android.view.inputmethod.InputMethodManager;

Keyboard bersembunyi saat Anda mengklik tombol.

Paul Maserrat
sumber
55
Catatan: (jika Anda ingin menggunakan metode ini dalam kasus di mana mungkin tidak ada fokus (misalnya onPause (), dll): inputManager.hideSoftInputFromWindow((null == getCurrentFocus()) ? null : getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
Peter Ajtai
5
Anda juga harus mengimpor Konteks.
Si8
4
PERHATIAN: Melempar NPE jika keyboard sudah tersembunyi. Ikuti komentar Peter untuk menghindari ini.
Don Larynx
mengapa keyboard muncul setelah klik pada tombol yang tidak relevan? dapatkah seseorang memberikan penjelasan atau tautan?
kommradHomer
1
Bekerja seperti pesona!
ARiF
59
mMyTextView.setOnEditorActionListener(new TextView.OnEditorActionListener() {
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        if (actionId == EditorInfo.IME_ACTION_SEARCH) {
            // hide virtual keyboard
            InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(m_txtSearchText.getWindowToken(), 
                                      InputMethodManager.RESULT_UNCHANGED_SHOWN);
            return true;
        }
        return false;
    }
});
Andrew
sumber
Ini bekerja untuk saya. Terima kasih!
Aman Goyal
29

Gunakan Kode Di Bawah Ini

your_button_id.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        try  {
            InputMethodManager imm = (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
        } catch (Exception e) {

        }
    }
});
Prashant Maheshwari Andro
sumber
2
Menangkap pengecualian bukannya cek nol sederhana, serius ?!
Dr Glass
Bekerja untuk saya, menyembunyikan keyboard pada klik tombol
ashishdhiman2007
solusi sederhana untuk apa yang saya butuhkan: sembunyikan keyboard setelah mengklik tombol cari.
dawoodman71
13

Anda harus menerapkan OnEditorActionListeneruntuk EditView Anda

public void performClickOnDone(EditView editView, final View button){
    textView.setOnEditorActionListener(new OnEditorActionListener() {

        @Override
        public boolean onEditorAction(EditView v, int actionId, KeyEvent event) {
            hideKeyboard();
            button.requestFocus();
            button.performClick();
            return true;
        }
    });

Dan Anda menyembunyikan keyboard dengan:

public void hideKeybord(View view) {
    inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(),
                                  InputMethodManager.RESULT_UNCHANGED_SHOWN);
}

Anda juga harus menyalakan keyboard yang bersembunyi di tombol Anda menggunakan onClickListener

Sekarang mengklik 'Selesai' pada keyboard dan tombol virtual akan melakukan hal yang sama - sembunyikan keyboard dan lakukan aksi klik.

pixel
sumber
Luar biasa, tapi saya tidak cukup mengikuti. Saya pikir posting memakan beberapa kode (tidak ada setelah "kekosongan publik" dalam sampel Anda). Saya mencoba mengatur setOnEditorActionListner dalam metode onCreate Aktivitas saya, tetapi tidak tahu apa itu setOnEditorActionListener. Saya mendapat notifikasi "Tipe dalam anonim". (Saya melakukan ini dalam metode onCreate Aktivitas saya) i37.tinypic.com/6ozkig.png
Andrew
1
Sepertinya ada beberapa kesalahan dalam kode ini, tapi itu ide yang tepat. Untuk satu hal, antarmuka OnEditorActionListener adalah kelas dalam, jadi Anda perlu mengimpornya secara eksplisit (Eclipse tidak akan melakukannya untuk Anda dalam kasus ini) atau merujuknya sebagai TextView.OnEditorActionListener.
MatrixFrog
Saya mengalami sedikit masalah. Saya sudah menerapkan onEditorActionListener (kelas publik SearchActivity memperluas ListActivity mengimplementasikan OnClickListener, OnEditorActionListener), saya telah melampirkan pendengar ke EditText saya (mSearchText.setOnditorActionListener (ini);), tetapi Eclipse tidak akan mengizinkan saya untukmemilihkantempatdibandingkandenganmelebihdibuatkanpengikutandataIdakdapatmemuatkanbanyakpengikutandataIdakdapatmemuatkanbanyakpengikutandataIdakdapatmemuatkanbarangdibuat di atasbarangdibuat di atasbarangdibuat di atasbarangdibuat di atasbarang. (TextView v, int actionId, acara KeyEvent)). Dikatakan itu harus mengganti metode superclass. Ada ide?
Andrew
Hai, Anda dapat menyinkronkan OnEditorActionListener Anda dengan mengetikkan yourEditView.setOnEditorActionListener (OnEditorActionListener baru Anda) {....
pixel
11

Tambahkan kode berikut di dalam acara klik tombol Anda:

InputMethodManager inputManager = (InputMethodManager) getSystemService(this.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
Ashana.Jackol
sumber
1
Bekerja seperti pesona!
coderpc
10

Karena Anda hanya memiliki satu edit teks maka cukup panggil tindakan yang dilakukan untuk mengedit teks di dalam klik tombol Anda dan sisanya ditangani oleh sistem. Jika Anda memiliki lebih dari satu edittext maka ini tidak akan begitu efisien karena Anda harus mendapatkan edittext fokus terlebih dahulu. Tetapi dalam kasus Anda itu akan bekerja dengan sempurna

myedittext.onEditorAction(EditorInfo.IME_ACTION_DONE)
Laert
sumber
1
Dapatkah Anda memberikan penjelasan mengapa solusi Anda berhasil sehingga orang lain dapat memahami dan belajar darinya? Terima kasih!
Shawn
Tentu Shawn. Saya baru saja mengedit bagian atas, karena saya baru berpose jika tidak jelas beri tahu saya dan saya akan memperluas dengan tombol onclick
Laert
Percayalah, ini salah satu cara paling elegan untuk melakukan ini. Terima kasih @Laert
WitVault
9

Untuk Aktivitas,

InputMethodManager imm = (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);

Untuk Fragmen, gunakan getActivity ()

getActivity (). getSystemService ();

getActivity (). getCurrentFocus ();

InputMethodManager imm = (InputMethodManager)getActivity().getSystemService(INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getActivity().getCurrentFocus().getWindowToken(), 0);
Priya Rajan
sumber
7

Solusi ini sangat cocok untuk saya:

private void showKeyboard(EditText editText) {
    editText.requestFocus();
    editText.setFocusableInTouchMode(true);
    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.showSoftInput(editText, InputMethodManager.RESULT_UNCHANGED_SHOWN);
    editText.setSelection(editText.getText().length());
}

private void closeKeyboard() {
    InputMethodManager inputManager = (InputMethodManager) getApplicationContext().getSystemService(Context.INPUT_METHOD_SERVICE);
    inputManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), InputMethodManager.RESULT_UNCHANGED_SHOWN);
}
Giedrius Šlikas
sumber
3

Coba ini...

  1. Untuk Menampilkan keyboard

    editText.requestFocus();
    InputMethodManager imm = (InputMethodManager) ctx.getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
  2. Untuk Sembunyikan keyboard

    InputMethodManager inputManager = (InputMethodManager) ctx.getSystemService(Context.INPUT_METHOD_SERVICE); 
    inputManager.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);
Affa Musaffa
sumber
Metode "Untuk Sembunyikan keyboard" adalah toogle (sembunyikan jika terlihat, tunjukkan jika disembunyikan) bukan sembunyikan,
Ninja Coding
1
View view = this.getCurrentFocus();
if (view != null) {
InputMethodManager imm =(InputMethodManager)this.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);enter code here}
Farruh Habibullaev
sumber
Hai! Meskipun jawaban ini mungkin mencukupi kebutuhan @Andrew , akan sangat bagus, jika Anda bisa memperluasnya dengan beberapa penjelasan, untuk memastikan bahwa pembaca di masa depan dapat mengambil manfaat sepenuhnya!
derM
1

Contoh Kotlin:

val inputMethodManager = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager

dari Fragment:

inputMethodManager.hideSoftInputFromWindow(activity?.currentFocus?.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)

dari Activity:

inputMethodManager.hideSoftInputFromWindow(currentFocus?.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)
norbDEV
sumber
0

Anda menggunakan kode ini dalam acara klik tombol Anda

// Check if no view has focus:
View view = this.getCurrentFocus();
if (view != null) {  
    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
Pankaj Talaviya
sumber
0

Crash Null Point Fixeption Fix: Saya punya kasus di mana keyboard mungkin tidak terbuka ketika pengguna mengklik tombol. Anda harus menulis pernyataan if untuk memeriksa bahwa getCurrentFocus () bukan nol:

            InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        if(getCurrentFocus() != null) {
            inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
CacheMeOutside
sumber
-2

Jika Anda mengatur android:singleLine="true", secara otomatis tombol menyembunyikan keyboard¡

Terranologi
sumber