拦截软键盘的返回键 Intercept back button from soft keyboard

来源:互联网 发布:xp禁止安装软件 编辑:程序博客网 时间:2024/06/07 13:49

弹出软键盘时,点击back键,只执行了关闭软键盘,普通的onKeyDown() onBackPressed() 不能拦截back事件,需要实现onKeyPreIme()方法。

比如,重写这个EditText

public class CustomEditText extends EditText {    Context context;    public CustomEditText(Context context, AttributeSet attrs) {        super(context, attrs);        this.context = context;    }    @Override    public boolean onKeyPreIme(int keyCode, KeyEvent event) {        if (keyCode == KeyEvent.KEYCODE_BACK) {            // User has pressed Back key. So hide the keyboard            InputMethodManager mgr = (InputMethodManager)                         context.getSystemService(Context.INPUT_METHOD_SERVICE);            mgr.hideSoftInputFromWindow(this.getWindowToken(), 0);            // TODO: Hide your view as you do it in your activity        }        return false;}
这样就能拦截了

或者重写主布局,例如主布局是RelativeLayout

/** * The root element in the search bar layout. This is a custom view just to  * override the handling of the back button. *  */public class SearchLayout extends RelativeLayout {    private static final String TAG = "SearchLayout";    private static Activity mSearchActivity;;    public SearchLayout(Context context, AttributeSet attrs) {        super(context, attrs);    }    public SearchLayout(Context context) {        super(context);    }    public static void setSearchActivity(Activity searchActivity) {        mSearchActivity = searchActivity;    }    /**     * Overrides the handling of the back key to move back to the      * previous sources or dismiss the search dialog, instead of      * dismissing the input method.     */    @Override    public boolean dispatchKeyEventPreIme(KeyEvent event) {        Log.d(TAG, "dispatchKeyEventPreIme(" + event + ")");        if (mSearchActivity != null &&                     event.getKeyCode() == KeyEvent.KEYCODE_BACK) {            KeyEvent.DispatcherState state = getKeyDispatcherState();            if (state != null) {                if (event.getAction() == KeyEvent.ACTION_DOWN                        && event.getRepeatCount() == 0) {                    state.startTracking(event, this);                    return true;                } else if (event.getAction() == KeyEvent.ACTION_UP                        && !event.isCanceled() && state.isTracking(event)) {                    mSearchActivity.onBackPressed();                    return true;                }            }        }        return super.dispatchKeyEventPreIme(event);    }}

0 0