回答:
私はロバーツとキラグスの答えの組み合わせで終わった:
((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;
}
isPreparedForSending()
、なぜ第二の方法が戻りますかtrue
?
これを試してください、それはあなたが必要とするもののために働くはずです:
editText.setOnEditorActionListener(new EditText.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_DONE) {
//do here your stuff f
return true;
}
return false;
}
});
<EditText android:imeOptions="actionDone" android:inputType="text"/>
<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;
}
});
この質問が古いのはわかっていますが、何がうまくいったかを指摘したいと思います。
Android DevelopersのWebサイト(下に表示)のサンプルコードを使用しようとしましたが、機能しませんでした。EditorInfoクラスを確認したところ、IME_ACTION_SEND整数値が次のように指定されていることに気付きました。0x00000004
。
Androidデベロッパーのサンプルコード:
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"/>
そして、サンプルコードは機能しました。
OnKeyListenerを設定し、[完了]ボタンをリッスンする方法の詳細。
まず、クラスの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);
ほとんどの人が質問に直接回答していますが、その背後にある概念について詳しく説明したいと思いました。最初に、デフォルトのログインアクティビティを作成したときに、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に通知するだけです。可能な値の完全なリストはここにあります。
しかし、imeOptions="actionUnspecified"
その目的がわからなかったのはそのためです。Androidでは、を使用してテキストを選択すると、画面の下部からポップアップするキーボードを操作できますInputMethodManager
。キーボードの下隅にボタンがあり、現在のテキストフィールドに応じて、通常「次へ」または「完了」と表示されます。Androidでは、を使用してこれをカスタマイズできますandroid:imeOptions
。「送信」ボタンまたは「次へ」ボタンを指定できます。完全なリストはここにあります。
それによって、あなたがして定義することにより、アクションボタンを押圧するために聞くことができるTextView.OnEditorActionListener
ためEditText
の要素。あなたの例のように:
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;
}
});
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
}
}
ここEnter
では、のEditorInfo.IME_NULL
代わりに返されるため、キーを確認しますIME_ACTION_DONE
。
Android imeOptions = "actionDone"が機能しないもご覧ください。に追加android:singleLine="true"
しますEditText
。
Kotlinでそれを処理する基本的な方法は次のとおりです。
edittext.setOnEditorActionListener { _, actionId, _ ->
if (actionId == EditorInfo.IME_ACTION_DONE) {
callback.invoke()
true
}
false
}
これを使用edittext.onDone{/*action*/}
して、メインコードを呼び出すだけです。コードをはるかに読みやすく、保守しやすくします
fun EditText.onDone(callback: () -> Unit) {
setOnEditorActionListener { _, actionId, _ ->
if (actionId == EditorInfo.IME_ACTION_DONE) {
callback.invoke()
true
}
false
}
}
<EditText ...
android:imeOptions="actionDone"
android:inputType="text"/>
inputType="textMultiLine"
サポートが必要な場合は、この投稿を読んでください
setOnEditorActionListener
ただし、の戻り値に関する糸くずの警告が表示され続けるようです。多分それはローカル構成設定の問題だけかもしれませんが、私のリンターは本当に(-blockではなく)リスナーのreturnステートメントとして「true」を受け入れるためにブランチも追加することを本当に望んでいます。else
if
Androidアノテーションを使用する場合 https://github.com/androidannotations/androidannotations
@EditorActionアノテーションを使用できます
@EditorAction(R.id.your_component_id)
void onDoneAction(EditText view, int actionId){
if(actionId == EditorInfo.IME_ACTION_DONE){
//Todo: Do your work or call a method
}
}