当键盘打开时,在Android中触发了哪个事件,我们按下后退按钮

时间:2017-02-21 11:23:55

标签: android onbackpressed

我测试的内容:

在Android中,当键盘未打开时我们按下后退按钮。 onBackPressed()事件被解雇

问题

情景-A: 在Android中,当键盘打开时我们按下后退按钮。键盘关闭了。 onBackPressed()未被解雇

注意 第一次onBackPressed()未在此处调用 ...仅限键盘不可见onBackPressed()被称为

如何以编程方式模拟 SCENARIO-A

2 个答案:

答案 0 :(得分:0)

  BackKeyPress上的

检查软键盘是否由下方打开   片段,如果打开然后关闭它并阻止onBackPressed(),如果没有调用   onBackPressed()

final View activityRootView = findViewById(R.id.activityRoot);
    activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        Rect r = new Rect();
        //r will be populated with the coordinates of your view that area still visible.
        activityRootView.getWindowVisibleDisplayFrame(r);

        int heightDiff = activityRootView.getRootView().getHeight() - (r.bottom - r.top);
        if (heightDiff > 100) { // if more than 100 pixels, its probably a keyboard...
            ... close soft keyboard from here
        }
     }
    }); 

答案 1 :(得分:0)

当键盘显示并关闭时,

onBackPressed()将不会被调用。不知道确切的原因,但这是事实。

但是,如果您需要在显示键盘时捕获后退事件,则可以侦听根/父布局可见性的更改。

重申@ReubenScratton谁给出了优秀的answer来克服这个问题,我们有这个代码:

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 > dpToPx(this, 200)) { // if more than 200 dp, it's probably a keyboard...
            // ... do something here
        }
    }
});

dpToPx功能:

public static float dpToPx(Context context, float valueInDp) {
    DisplayMetrics metrics = context.getResources().getDisplayMetrics();
    return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, valueInDp, metrics);
}