Gunakan tombol "ENTER" pada softkeyboard alih-alih mengklik tombol

94

Halo, saya telah mencari EditTextdan mencari Button. Saat saya mengetik teks yang dicari, saya ingin menggunakan tombol ENTER pada softkeyboard alih-alih pencarian Buttonuntuk mengaktifkan fungsi pencarian.

Terima kasih atas bantuannya.

Peter O.
sumber

Jawaban:

155

Anda melakukannya dengan menyetel OnKeyListenerpada Anda EditText.

Ini adalah contoh dari kode saya sendiri. Saya memiliki sebuah EditTextnama addCourseText, yang akan memanggil fungsi tersebut addCourseFromTextBoxketika tombol enter atau d-pad diklik.

addCourseText = (EditText) findViewById(R.id.clEtAddCourse);
addCourseText.setOnKeyListener(new OnKeyListener()
{
    public boolean onKey(View v, int keyCode, KeyEvent event)
    {
        if (event.getAction() == KeyEvent.ACTION_DOWN)
        {
            switch (keyCode)
            {
                case KeyEvent.KEYCODE_DPAD_CENTER:
                case KeyEvent.KEYCODE_ENTER:
                    addCourseFromTextBox();
                    return true;
                default:
                    break;
            }
        }
        return false;
    }
});
Julian
sumber
4
Sebenarnya, tidak ada jaminan untuk tombol lunak. Misalnya, ini tidak berfungsi untuk "ENTER" di Nexus 7 (Android 4.2) dan untuk "BACK" berfungsi.
Ghedeon
4
@Ghedeon Anda dapat menyetel android:inputType="text"xml untuk teks edit agar menampilkan tombol enter versus keyboard default yang memiliki tanda carriage return.
Nick
2
Metode ini tidak dijamin berfungsi pada Jellybean, lihat developer.android.com/reference/android/view/KeyEvent.html
Constantin
@Ghedeon jadi bagaimana Anda membuatnya berfungsi untuk "ENTER" di Nexus 7?
HairOfTheDog
3
Solusi ini benar-benar rusak di banyak perangkat, termasuk Nexus 7. Jangan gunakan itu!
pengguna3562927
44
<EditText
    android:id="@+id/search"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:hint="@string/search_hint"
    android:inputType="text"
    android:imeOptions="actionSend" />

Anda kemudian bisa mendengarkan penekanan pada tombol aksi dengan mendefinisikan TextView.OnEditorActionListener untuk elemen EditText. Di pemroses Anda, tanggapi ID tindakan IME yang sesuai yang ditentukan di kelas EditorInfo, seperti IME_ACTION_SEND. Sebagai contoh:

EditText editText = (EditText) findViewById(R.id.search);
editText.setOnEditorActionListener(new OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        boolean handled = false;
        if (actionId == EditorInfo.IME_ACTION_SEND) {
            sendMessage();
            handled = true;
        }
        return handled;
    }
});

Sumber: https://developer.android.com/training/keyboard-input/style.html

Andrii Kovalchuk
sumber
26

mungkin Anda bisa menambahkan atribut ke EditText Anda seperti ini:

android:imeOptions="actionSearch"
itemon
sumber
1
Ini adalah solusi yang lebih sederhana jika Anda membuat teks edit pencarian.
stevyhacker
perlu diatur android:inputType="text"juga
li2
6

tambahkan atribut ke EditText seperti android: imeOptions = "actionSearch"

ini adalah cara terbaik untuk menjalankan fungsinya

dan imeOptions juga memiliki beberapa nilai lain seperti "go" 、 "next" 、 "done" dll.

ruyi.zhu
sumber
2

Kita juga bisa menggunakan lambda Kotlin

editText.setOnKeyListener { _, keyCode, keyEvent ->
        if (keyEvent.action == KeyEvent.ACTION_DOWN && keyCode == KeyEvent.KEYCODE_ENTER) {
            Log.d("Android view component", "Enter button was pressed")
            return@setOnKeyListener true
        }
        return@setOnKeyListener false
    }
Artem Botnev
sumber
0

Untuk menghindari fokus berpindah ke bidang berikutnya yang dapat diedit (jika ada), Anda mungkin ingin mengabaikan peristiwa key-down, tetapi menangani peristiwa key-up. Saya juga lebih suka memfilter terlebih dahulu pada keyCode, dengan asumsi bahwa itu akan sedikit lebih efisien. Ngomong-ngomong, ingatlah bahwa mengembalikan true berarti Anda telah menangani acara tersebut, jadi tidak ada pendengar lain yang akan melakukannya. Bagaimanapun, ini versi saya.

ETFind.setOnKeyListener(new OnKeyListener()
{
    public boolean onKey(View v, int keyCode, KeyEvent event)
    {
        if (keyCode ==  KeyEvent.KEYCODE_DPAD_CENTER
        || keyCode ==  KeyEvent.KEYCODE_ENTER) {

            if (event.getAction() == KeyEvent.ACTION_DOWN) {
                // do nothing yet
            } else if (event.getAction() == KeyEvent.ACTION_UP) {
                        findForward();      
            } // is there any other option here?...

            // Regardless of what we did above,
            // we do not want to propagate the Enter key up
            // since it was our task to handle it.
            return true;

        } else {
            // it is not an Enter key - let others handle the event
            return false;
        }
    }

});
Wojtek Jarosz
sumber
0

ini adalah contoh salah satu aplikasi saya yang saya tangani

 //searching for the Edit Text in the view    
    final EditText myEditText =(EditText)view.findViewById(R.id.myEditText);
        myEditText.setOnKeyListener(new View.OnKeyListener() {
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                 if (event.getAction() == KeyEvent.ACTION_DOWN)
                      if ((keyCode == KeyEvent.KEYCODE_DPAD_CENTER) ||
                             (keyCode == KeyEvent.KEYCODE_ENTER)) {
                                //do something
                                //true because you handle the event
                                return true;
                               }
                       return false;
                       }
        });
Alejandro Serret
sumber
0

Cara terbaru untuk mencapai ini adalah:

Tambahkan ini ke EditText Anda dalam XML:

android:imeOptions="actionSearch"

Kemudian di Aktivitas / Fragmen Anda:

EditText.setOnEditorActionListener { _, actionId, _ ->
    if (actionId == EditorInfo.IME_ACTION_SEARCH) {
        // Do what you want here
        return@setOnEditorActionListener true
    }
    return@setOnEditorActionListener false
}
Hasan TBT
sumber