【发布时间】:2011-02-07 12:51:18
【问题描述】:
我有一个活动,我希望始终打开软件键盘。当键盘打开时,如何在 BACK 按下后关闭 Activity?现在我必须点击两次 BACK,首先关闭键盘,然后完成 Activity。
【问题讨论】:
标签: android
我有一个活动,我希望始终打开软件键盘。当键盘打开时,如何在 BACK 按下后关闭 Activity?现在我必须点击两次 BACK,首先关闭键盘,然后完成 Activity。
【问题讨论】:
标签: android
如前所述,onKeyPreIme 可用于捕获后退按钮,但这需要在文本视图上覆盖,而不是在活动中。
这是一个完整的解决方案:
首先是一个从EditText派生的新类,覆盖onKeyPreIme并调用回调接口:
// EditTextWithBackButton class
public class EditTextWithBackButton extends EditText
{
public interface IOnBackButtonListener
{
boolean OnEditTextBackButton();
}
public EditTextWithBackButton(Context context)
{
super(context);
}
public EditTextWithBackButton(Context context, AttributeSet attrs)
{
super(context, attrs);
}
public void setOnBackButtonListener(IOnBackButtonListener l)
{
_listener = l;
}
IOnBackButtonListener _listener;
@Override
public boolean onKeyPreIme(int keyCode, KeyEvent event)
{
if (event.getAction()==KeyEvent.ACTION_UP && keyCode==KeyEvent.KEYCODE_BACK)
{
if (_listener!=null && _listener.OnEditTextBackButton())
return false;
}
return super.onKeyPreIme(keyCode, event); //To change body of overridden methods use File | Settings | File Templates.
}
}
接下来,更新你的布局:
<com.yournamespace.whatever.EditTextWithBackButton
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/textField"
/>
接下来,在 OnCreate 中的 setContentView 之后更新您的活动:
((EditTextWithBackButton) findViewById(R.id.textField)).setOnBackButtonListener(new EditTextWithBackButton.IOnBackButtonListener()
{
@Override
public boolean OnEditTextBackButton()
{
finish();
return true;
}
});
【讨论】:
使用 onKeyPreIme(int keyCode, KeyEvent event) 方法并检查 KeyEvent.KEYCODE_BACK 事件。非常简单,无需任何花哨的编码。
【讨论】:
我认为您不需要监听器 setOnBackButtonListener,因为它是第一次建议的。
我已经通过使用 getContext() 让它工作了:
public class EditedText extends EditText {
@Override
public boolean onKeyPreIme (int keyCode, KeyEvent event){
if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK){
Activity activity = (Activity) getContext();
activity.finish();
return true;
}
return super.onKeyPreIme(keyCode, event);
}
}
请注意,由于事件已“处理”,因此我将返回 true 而不是 false,正如先前答案中首次建议的那样。
【讨论】:
你可以使用下面的
@Override
public boolean onKeyUp(int keyCode, KeyEvent event)
{
if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
finish();
return true;
}
return super.onKeyUp(keyCode, event);
}
【讨论】:
为活动中的 EditText 设置一个 OnEditorActionListener,为您提供如下软键盘,
editText.setOnEditorActionListener(new OnEditorActionListener() {
public boolean onEditorAction(TextView v, int actionId,
KeyEvent event) {
if (event != null
&& (event.getKeyCode() == KeyEvent.KEYCODE_BACK)) {
finish();
}
return false;
}
});
【讨论】:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
finish();
return true;
}
return super.onKeyDown(keyCode, event);
}
但是告诉你一件事,你必须付出另一项努力来检测键盘是否打开,而不是使用可用于决定是返回还是完成活动的标志。
【讨论】: