如果在Android中打开键盘,则在按下后退按钮时防止完成活动

时间:2013-03-21 04:23:41

标签: android keyboard back-button

我的活动中有一个edittext。当用户触摸该edittext时,键盘处于打开状态。但是在所有HTC设备中,打开键盘后,当用户按下后退键,而不是只隐藏键盘时,我当前的活动已经完成并显示以前的活动。如何解决这个问题?在所有其他三星手机,这工作正常。但不是在HTC设备中。

3 个答案:

答案 0 :(得分:0)

你可能按两次后退按钮,因为我做了同样的事情,但没有遇到类似的问题。我已经在三星和HTC设备上测试了我的代码。

答案 1 :(得分:0)

这可能对你有用。您可以检查键盘是否在onBackPressed事件上打开,如:

public void onBackPressed() {
        final View activityRootView = findViewById(R.id.activityRoot);
        activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                int heightDiff = activityRootView.getRootView().getHeight() - activityRootView.getHeight();
                if (heightDiff > 100) { // if more than 100 pixels, its probably a keyboard...
                   InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
                    imm.hideSoftInputFromWindow(myEditText.getWindowToken(), 0);
                }
             } else {
                 super.onBackPressed();
             }
        });
}

然后你可以先在上面的代码中解除键盘然后最后再次按下后面你可以使用super.onBackPressed();

答案 2 :(得分:0)

坦率地说,我很想说不管它,让平台按照用户期望的方式处理它。但是,我最近遇到了类似的问题,虽然它并不理想,它确实允许你在到达键盘之前截取后退按钮,然后根据需要处理它。

首先,无论您的布局使用哪个根ViewGroup,都应采用与此类似的方式覆盖它:

IMEInterceptLayout extends LinearLayout {
    private OnBackPressedPreIMEListener listener;

    public IMEInterceptLayout(Context c) { super(c); }
    public IMEInterceptLayout(Context c, AttributeSet attrs) { super(c, attrs); }
    public IMEInterceptLayout(Context c, AttributeSet attrs, int style) { super(c, attrs, style); }

    @Override
    public boolean dispatchKeyEventPreIme(KeyEvent event) {
        switch(event.getKeyCode()) {
            case KeyEvent.KEYCODE_BACK:
                fireOnBackPressedPreIME();
                return true;
            default:
                return super.dispatchKeyEventPreIme(event);
        }
    }

    public void setOnBackPressedPreIMEListener(OnBackPressedPreIMEListener listener) {
        this.listener = listener;
    }

    private void fireOnBackPressedPreIME() {
        if(listener != null) listener.onBackPressedPreIME();
    }

    public interface OnBackPressedPreIMEListener {
        public void onBackPressedPreIME();
    }
}

e.g。如果您正在使用RelativeLayout,请扩展它而不是LinearLayout。在您的布局中使用此自定义视图,而不是在线Android版本:

<LinearLayout
    android:id="@+id/my_root_layout"

变为

<com.my.packagename.IMEInterceptLayout
    android:id="@+id/my_root_layout"

然后,在将内容视图设置为此布局后,在onCreate()中,获取对此ViewGroup的引用:

IMEInterceptLayout layout = (IMEInterceptLayout)findViewById(R.id.my_root_layout);
layout.setOnBackPressedPreIMEListener(new OnBackPressedPreIMEListener() {
    @Override
    public void onBackPressedPreIME() {
        InputMethodManager imm = (InputMethodManager)MyActivity.this.getSystemService(Context.INPUT_METHOD_SERVICE);
        View focusedView = MyActivity.this.getCurrentFocus();
        if(focusedView != null) 
            imm.hideSoftInputFromWindow(focusedView.getWindowToken(), 0);
    }
}

显然将MyActivity替换为您的实际活动名称。这将允许您自己解除键盘,而不是依靠系统为您执行此操作。结果是相对大量的工作,但它是可靠的。