如何处理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允许您使用InputMethodManager
select文本时,与从屏幕底部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; } });