如何在BACK按下后用软键盘关闭活动?

时间:2011-02-07 12:51:19

标签: android

我有一个Activity,我希望软件键盘可以打开。如何在BACK键盘打开后关闭活动?现在我必须单击BACK两次,首先关闭键盘,然后完成Activity。

6 个答案:

答案 0 :(得分:6)

如上所述,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"
        />

接下来,在setContentView:

之后,在OnCreate中更新您的活动
((EditTextWithBackButton) findViewById(R.id.textField)).setOnBackButtonListener(new EditTextWithBackButton.IOnBackButtonListener()
{
    @Override
    public boolean OnEditTextBackButton()
    {
        finish();
        return true;
    }
});

答案 1 :(得分:3)

使用 onKeyPreIme(int keyCode,KeyEvent event)方法并检查 KeyEvent.KEYCODE_BACK 事件。没有做任何花哨的编码就很简单。

答案 2 :(得分:1)

我不相信你需要听众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而不是错误,因为在之前的答案中首次提出这一点。

答案 3 :(得分:0)

您可以使用以下

  @Override
public boolean onKeyUp(int keyCode, KeyEvent event) 
    {
    if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
           finish();
           return true;
    }
    return super.onKeyUp(keyCode, event);
}

答案 4 :(得分:0)

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) 
    {
    if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
           finish();
           return true;
    }
    return super.onKeyDown(keyCode, event);
}

但是告诉你一件事你必须付出额外的努力来检测键盘是否打开,而不是使用可以用来决定是回去还是完成活动的旗帜

答案 5 :(得分:0)

为您提供软键盘的活动中的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;
        }
    });