如何处理ImeOptions完成的button点击?

我有一个EditText ,我设置以下属性,以便在用户单击EditText时可以在键盘上显示完成button。

 editText.setImeOptions(EditorInfo.IME_ACTION_DONE); 

当用户单击屏幕键盘上的完成button(完成键入)时,我想要更改RadioButton状态。

如何从屏幕键盘击中完成button?

在这里输入图像描述

我结束了Roberts和chirags的结合:

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

更新:上面的代码有时会激活callback两次。 相反,我select了从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; } 

试试这个,它应该适合你所需要的:


 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开发者网站上的示例代码(如下所示),但没有奏效。 所以我检查了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的更多详细信息,并让它监听完成button。

首先将OnKeyListener添加到类的implements部分。 然后添加在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); 
  <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 false; } }); 

虽然大多数人直接回答了这个问题,但我想更详细地阐述它背后的概念。 首先,我创build了一个默认的login活动,引起了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预期的文本types,如电子邮件地址,密码或电话号码。 可能的值的完整列表可以在这里find。

然而,这是属性imeOptions="actionUnspecified" ,我不明白它的目的。 Android允许您使用InputMethodManagerselect文本时,与从屏幕底部popup的键盘进行交互。 在键盘的下angular,有一个button,通常是“Next”或“Done”,取决于当前的文本字段。 Android允许你使用android:imeOptions来定制这个。 您可以指定一个“发送”button或“下一步”button。 完整列表可以在这里find。

这样,您就可以通过为EditText元素定义一个TextView.OnEditorActionListener来监听动作button的按下。 正如你的例子:

 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"属性。 当您想要按下回车键时尝试login用户时,这很有用。 在您的活动中,您可以检测到该标签,然后尝试login:

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