web-dev-qa-db-ja.com

ImeOptionsの完了ボタンクリックを処理するにはどうすればよいですか?

ユーザーがEditTextをクリックしたときにキーボードに完了ボタンを表示できるように、次のプロパティを設定しているEditTextを持っています。

editText.setImeOptions(EditorInfo.IME_ACTION_DONE);

ユーザーが画面キーボードの完了ボタンをクリックすると(入力が終了します)、RadioButton状態を変更したいです。

画面キーボードからヒットしたときに完了ボタンを追跡するにはどうすればよいですか?

enter image description here

164
d-man

私はロバーツとチラグスの回答の組み合わせになりました:

((EditText)findViewById(R.id.search_field)).setOnEditorActionListener(
        new EditText.OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        // Identifier of the action. This will be either the identifier you supplied,
        // or EditorInfo.IME_NULL if being called due to the enter key being pressed.
        if (actionId == EditorInfo.IME_ACTION_SEARCH
                || actionId == EditorInfo.IME_ACTION_DONE
                || event.getAction() == KeyEvent.ACTION_DOWN
                && event.getKeyCode() == KeyEvent.KEYCODE_ENTER) {
            onSearchAction(v);
            return true;
        }
        // Return true if you have consumed the action, else false.
        return false;
    }
});

更新:上記のコードは、コールバックを2回アクティブにする場合があります。代わりに、Googleチャットクライアントから取得した次のコードを選択しました。

public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
    // If triggered by an enter key, this is the event; otherwise, this is null.
    if (event != null) {
        // if shift key is down, then we want to insert the '\n' char in the TextView;
        // otherwise, the default action is to send the message.
        if (!event.isShiftPressed()) {
            if (isPreparedForSending()) {
                confirmSendMessageIfNeeded();
            }
            return true;
        }
        return false;
    }

    if (isPreparedForSending()) {
        confirmSendMessageIfNeeded();
    }
    return true;
}
195
Thomas Ahle

これを試してください、それはあなたが必要とするもののために働くはずです:


editText.setOnEditorActionListener(new EditText.OnEditorActionListener() {
    @Override
    public boolean onEditorAction(EditText v, int actionId, KeyEvent event) {
    if (actionId == EditorInfo.IME_ACTION_DONE) {
       //do here your stuff f
       return true;
    }
    return false;
    } 
});
98
chikka.anddev
   <EditText Android:imeOptions="actionDone" 
    Android:inputType="text"/>

次に、Javaコードは、

    edittext.setOnEditorActionListener(new OnEditorActionListener() { 

    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {

    if  ((actionId == EditorInfo.IME_ACTION_DONE)) {

         Log.i(TAG,"Here you can write the code");

         return true;

        }    
        return false;
    }
    });
26
Vinoj Vetha

私はこの質問が古いことを知っていますが、私にとって何がうまくいったのかを指摘したいと思います。

Android Developers website (下図)のサンプルコードを使用しようとしましたが、うまくいきませんでした。そこで、EditorInfoクラスを確認したところ、整数値IME_ACTION_SENDが0x00000004として指定されていることがわかりました。

Android Developersのサンプルコード:

editTextEmail = (EditText) findViewById(R.id.editTextEmail);
editTextEmail
        .setOnEditorActionListener(new OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView v, int actionId,
                    KeyEvent event) {
                boolean handled = false;
                if (actionId == EditorInfo.IME_ACTION_SEND) {
                    /* handle action here */
                    handled = true;
                }
                return handled;
            }
        });

そこで、整数値をres/values/integers.xmlファイルに追加しました。

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <integer name="send">0x00000004</integer>
</resources>

次に、レイアウトファイルres/layouts/activity_home.xmlを次のように編集しました

<EditText Android:id="@+id/editTextEmail"
  Android:layout_width="match_parent"
  Android:layout_height="wrap_content"
  Android:imeActionId="@integer/send"
  Android:imeActionLabel="@+string/send_label"
  Android:imeOptions="actionSend"
  Android:inputType="textEmailAddress"/>

そして、サンプルコードは機能しました。

25
iRuth

ほとんどの人が質問に直接答えていますが、その背後にある概念について詳しく説明したいと思いました。最初に、デフォルトのログインアクティビティを作成したときに、IMEに注目されました。以下を含むいくつかのコードを生成しました:

<EditText
  Android:id="@+id/password"
  Android:layout_width="match_parent"
  Android:layout_height="wrap_content"
  Android:hint="@string/Prompt_password"
  Android:imeActionId="@+id/login"
  Android:imeActionLabel="@string/action_sign_in_short"
  Android:imeOptions="actionUnspecified"
  Android:inputType="textPassword"
  Android:maxLines="1"
  Android:singleLine="true"/>

既にinputType属性に精通している必要があります。これは、Androidに、メールアドレス、パスワード、電話番号などの予想されるテキストのタイプを通知するだけです。可能な値の完全なリストは here にあります。

ただし、その目的がわからなかったのは属性imeOptions="actionUnspecified"でした。 Androidを使用すると、InputMethodManagerを使用してテキストが選択されたときに画面の下部からポップアップするキーボードを操作できます。キーボードの下隅にはボタンがあり、通常は現在のテキストフィールドに応じて「次へ」または「完了」と表示されます。 Androidでは、Android:imeOptionsを使用してこれをカスタマイズできます。 「送信」ボタンまたは「次へ」ボタンを指定できます。完全なリストは here にあります。

その後、EditText要素にTextView.OnEditorActionListenerを定義することにより、アクションボタンの押下をリッスンできます。あなたの例のように:

editText.setOnEditorActionListener(new EditText.OnEditorActionListener() {
    @Override
    public boolean onEditorAction(EditText v, int actionId, KeyEvent event) {
    if (actionId == EditorInfo.IME_ACTION_DONE) {
       //do here your stuff f
       return true;
    }
    return false;
    } 
});

さて、私の例ではAndroid:imeOptions="actionUnspecified"属性がありました。これは、ユーザーがEnterキーを押したときにログインしようとする場合に便利です。アクティビティで、このタグを検出してからログインを試行できます。

    mPasswordView = (EditText) findViewById(R.id.password);
    mPasswordView.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView textView, int id, KeyEvent keyEvent) {
            if (id == R.id.login || id == EditorInfo.IME_NULL) {
                attemptLogin();
                return true;
            }
            return false;
        }
    });
16
Donato

OnKeyListenerを設定し、Doneボタンをリッスンさせる方法の詳細。

まず、クラスのimplementsセクションにOnKeyListenerを追加します。次に、OnKeyListenerインターフェイスで定義された関数を追加します。

/*
 * Respond to soft keyboard events, look for the DONE press on the password field.
 */
public boolean onKey(View v, int keyCode, KeyEvent event)
{
    if ((event.getAction() == KeyEvent.ACTION_DOWN) &&
        (keyCode == KeyEvent.KEYCODE_ENTER))
    {
        // Done pressed!  Do something here.
    }
    // Returning false allows other listeners to react to the press.
    return false;
}

EditTextオブジェクトが与えられた場合:

EditText textField = (EditText)findViewById(R.id.MyEditText);
textField.setOnKeyListener(this);
15
Robert Hawkey

Kotlinの chikka.anddev および Alex Cohn のおかげで:

text.setOnEditorActionListener { v, actionId, event ->
    if (actionId == EditorInfo.IME_ACTION_DONE ||
        event?.action == KeyEvent.ACTION_DOWN && event.keyCode == KeyEvent.KEYCODE_ENTER) {
        doSomething()
        true
    } else {
        false
    }
}

ここでは、EditorInfo.IME_NULLではなくIME_ACTION_DONEを返すため、Enterキーをチェックします。

0
CoolMind