【问题标题】:How to close Activity with software keyboard after BACK press?按下 BACK 后如何使用软键盘关闭 Activity?
【发布时间】:2011-02-07 12:51:18
【问题描述】:

我有一个活动,我希望始终打开软件键盘。当键盘打开时,如何在 BACK 按下后关闭 Activity?现在我必须点击两次 BACK,首先关闭键盘,然后完成 Activity。

【问题讨论】:

标签: android


【解决方案1】:

如前所述,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;
    }
});

【讨论】:

    【解决方案2】:

    使用 onKeyPreIme(int keyCode, KeyEvent event) 方法并检查 KeyEvent.KEYCODE_BACK 事件。非常简单,无需任何花哨的编码。

    【讨论】:

      【解决方案3】:

      我认为您不需要监听器 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,正如先前答案中首次建议的那样。

      【讨论】:

        【解决方案4】:

        你可以使用下面的

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

        【讨论】:

        • 不幸的是,这不起作用。键盘打开时不会调用 onKeyUp()。
        【解决方案5】:

        为活动中的 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;
                }
            });
        

        【讨论】:

          【解决方案6】:
          @Override
          public boolean onKeyDown(int keyCode, KeyEvent event) 
              {
              if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
                     finish();
                     return true;
              }
              return super.onKeyDown(keyCode, event);
          }
          

          但是告诉你一件事,你必须付出另一项努力来检测键盘是否打开,而不是使用可用于决定是返回还是完成活动的标志。

          【讨论】:

          • 谢谢,但是打开键盘时不会调用 onKeyDown。
          猜你喜欢
          • 1970-01-01
          • 2015-02-27
          • 2015-08-07
          • 1970-01-01
          • 1970-01-01
          • 2013-01-09
          • 2020-09-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多