web-dev-qa-db-ja.com

アンドロイド:キーボードにボタンを入力させて「検索」と言ってクリックを処理する方法?

これがわかりません。一部のアプリにはEditText(テキストボックス)があり、タッチするとオンスクリーンキーボードが表示され、キーボードにはEnterキーの代わりに[Search]ボタンが表示されます。

これを実装したい。そのSearchボタンを実装してSearchボタンが押されたことを検出する方法

編集:検索ボタンの実装方法を見つけました。 XMLではAndroid:imeOptions="actionSearch"、JavaではEditTextSample.setImeOptions(EditorInfo.IME_ACTION_SEARCH);です。しかし、その検索ボタンを押したユーザーをどのように処理すればよいでしょうか。 Android:imeActionIdと関係がありますか?

344
Ricket

レイアウトで、入力方法のオプションを検索に設定します。

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

Javaでエディタアクションリスナを追加します。

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;
    }
});
835
Robby Pond

ユーザーが検索をクリックしたときにキーボードを隠すRobby Pondの回答に追加

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

xmlファイルに、imeOptions="actionSearch"および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" />
4

コトリンで

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

部分的なXMLコード

 <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>
3
Shaon

この答えはTextInputEditTextのためのものです:

レイアウトXMLファイルで、入力方式オプションを必要なタイプに設定します。例えばdoneです。

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

同様に、imeOptionsをactionSubmit、actionSearchなどに設定することもできます。

Javaでエディタアクションリスナを追加します。

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

Kotlinを使っているのなら:

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

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

Javaによって:

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