当Screenoverlay处于活动状态时,不会出现软键盘

时间:2017-04-04 09:18:48

标签: android android-layout android-softkeyboard

我使用透明屏幕覆盖来检测用户长按电话的电源键(或者更确切地说,当出现关机选项对话框时),这样可以正常工作。

不幸的是,当此屏幕覆盖处于活动状态时,软键盘会停止显示,这对我来说是个问题。我该如何防止这种情况?

我使用的代码很大程度上基于:Detect power button long press

public void warnOnShutdown() {
    if (Settings.canDrawOverlays(this)) {
        LinearLayout linearLayout = new LinearLayout(getApplicationContext()) {
            public void onCloseSystemDialogs(String reason) {
                if ("globalactions".equals(reason)) {
                    AntitheftStateManager.setShuttingDown(AntitheftService.this, true);
                }
            }

            @Override
            public boolean dispatchKeyEvent(KeyEvent event) {
                return super.dispatchKeyEvent(event);
            }
        };

        linearLayout.setFocusable(true);

        View view = LayoutInflater.from(this).inflate(R.layout.system_overlay, linearLayout);
        WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);

        //params
        WindowManager.LayoutParams params = new WindowManager.LayoutParams(
                100,
                100,
                WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
                WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
                        | WindowManager.LayoutParams.FLAG_FULLSCREEN
                        | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
                        | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,
                PixelFormat.TRANSLUCENT);
        params.gravity = Gravity.LEFT | Gravity.CENTER_VERTICAL;
        windowManager.addView(view, params);
    }
}

布局:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="1dp"
    android:layout_height="1dp"
    android:orientation="vertical">

</LinearLayout>

修改

我应该提一下,LinearLayout从服务附加到窗口管理器,这意味着键盘不仅仅被我的应用程序阻止,只要服务正在运行,它就会被整个手机阻止

1 个答案:

答案 0 :(得分:0)

当有人以代码获取代码时会发生这种情况。事实证明,将类型从TYPE_SYSTEM_ALERT更改为TYPE_SYSTEM_OVERLAY解决了我的问题。

WindowManager.LayoutParams params = new WindowManager.LayoutParams(
            100,
            100,
            WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
            WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
                    | WindowManager.LayoutParams.FLAG_FULLSCREEN
                    | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
                    | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,
            PixelFormat.TRANSLUCENT);