0

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

4

3 回答 3

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();
    }
}

例如,如果您使用的是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为您的实际活动的名称。这将允许您自己关闭键盘,而不是依靠系统为您完成。对于结果来说,这是一个相对大量的工作,但它是可靠的。

于 2013-03-21T04:52:57.913 回答
0

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

于 2013-03-21T04:32:27.970 回答
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(); 返回

于 2013-03-21T04:33:44.620 回答