Android: bagaimana membuat tombol enter keyboard mengatakan "Cari" dan menangani kliknya?

373

Saya tidak tahu ini. Beberapa aplikasi memiliki EditText (kotak teks) yang, ketika Anda menyentuhnya dan memunculkan keyboard di layar, keyboard memiliki tombol "Cari" daripada tombol enter.

Saya ingin mengimplementasikan ini. Bagaimana saya bisa menerapkan tombol Pencarian itu dan mendeteksi tekan tombol Cari?

Sunting : ditemukan cara menerapkan tombol Pencarian; dalam XML, android:imeOptions="actionSearch"atau di Jawa EditTextSample.setImeOptions(EditorInfo.IME_ACTION_SEARCH);,. Tetapi bagaimana saya menangani pengguna dengan menekan tombol Cari itu? Apakah ada hubungannya dengan android:imeActionId?

Ricket
sumber
3
Perhatikan bahwa imeOptions mungkin tidak berfungsi pada beberapa perangkat. Lihat ini dan ini .
Ermolai

Jawaban:

904

Dalam tata letak setel opsi metode input Anda untuk mencari.

<EditText
    android:imeOptions="actionSearch" 
    android:inputType="text" />

Di java tambahkan pendengar tindakan editor.

editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        if (actionId == EditorInfo.IME_ACTION_SEARCH) {
            performSearch();
            return true;
        }
        return false;
    }
});
Robby Pond
sumber
82
Pada os 2.3.6 tidak berfungsi sampai saya meletakkan atribut android: inputType = "text".
thanhbinh84
41
android: inputType = "text" juga diperlukan untuk saya di Android 2.3.5 dan 4.0.4
ccyrille
6
@Carol EditTextadalah sub kelas dari TextView.
howettl
13
android: inputType = "text" juga diperlukan untuk 4.4.0 - 4.4.2 (Android Kitkat).
user818455
12
Yup, android: inputType = "text" masih diperlukan di 5.0 :)
lionelmessi
19

Sembunyikan keyboard saat pengguna mengklik pencarian. Selain jawaban Robby Pond

private void performSearch() {
    editText.clearFocus();
    InputMethodManager in = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    in.hideSoftInputFromWindow(searchEditText.getWindowToken(), 0);
    //...perform search
}
kaMChy
sumber
7

Dalam xmlberkas, menempatkan imeOptions="actionSearch"dan inputType="text", maxLines="1":

<EditText
    android:id="@+id/search_box"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="@string/search"
    android:imeOptions="actionSearch"
    android:inputType="text"
    android:maxLines="1" />
Braj Bhushan Singh
sumber
5

Di Kotlin

evLoginPassword.setOnEditorActionListener { _, actionId, _ ->
    if (actionId == EditorInfo.IME_ACTION_DONE) {
        doTheLoginWork()
    }
    true
}

Kode Xml Parsial

 <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">
       <android.support.design.widget.TextInputLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"

            android:layout_marginBottom="8dp"
            android:layout_marginTop="8dp"
            android:paddingLeft="24dp"
            android:paddingRight="24dp">

            <EditText
                android:id="@+id/evLoginUserEmail"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="@string/email"
                android:inputType="textEmailAddress"
                android:textColor="@color/black_54_percent" />
        </android.support.design.widget.TextInputLayout>

        <android.support.design.widget.TextInputLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="8dp"
            android:layout_marginTop="8dp"
            android:paddingLeft="24dp"
            android:paddingRight="24dp">

            <EditText
                android:id="@+id/evLoginPassword"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="@string/password"
                android:inputType="textPassword"
                android:imeOptions="actionDone"
                android:textColor="@color/black_54_percent" />
        </android.support.design.widget.TextInputLayout>
</LinearLayout>
Shaon
sumber
1

Jawaban ini untuk TextInputEditText:

Dalam tata letak file XML atur opsi metode input Anda ke jenis yang diperlukan. misalnya selesai .

<com.google.android.material.textfield.TextInputLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <com.google.android.material.textfield.TextInputEditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:imeOptions="actionGo"/>

Demikian pula, Anda juga dapat mengatur imeOptions ke actionSubmit, actionSearch, dll

Di java tambahkan pendengar tindakan editor.

textInputLayout.getEditText().setOnEditorActionListener(new 

    TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if (actionId == EditorInfo.IME_ACTION_GO) {
                performYourAction();
                return true;
            }
            return false;
        }
    });

Jika Anda menggunakan kotlin:

textInputLayout.editText.setOnEditorActionListener { _, actionId, _ ->
    if (actionId == EditorInfo.IME_ACTION_GO) {
        performYourAction()
    }
    true
}
iAmSauravSharan
sumber
0

oleh XML:

 <EditText
        android:id="@+id/search_edit"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/search"
        android:imeOptions="actionSearch"
        android:inputType="text" />

Menurut jawa:

 editText.clearFocus();
    InputMethodManager in = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
    in.hideSoftInputFromWindow(searchEditText.getWindowToken(), 0);
Pengecualian Null Pointer
sumber