Android 如何显示服务中的软键盘?

Android 如何显示服务中的软键盘?,android,android-layout,android-softkeyboard,Android,Android Layout,Android Softkeyboard,简短问题:是否可以(以及如何)从服务中显示软键盘 长问题:我写了一个服务,它创建了一个“顶栏”,显示在所有活动的顶部,包含一个编辑文本。我想在单击EditText时显示软键盘,但这不会发生 当然,我已经在服务的onFocusChange()和onClick()中尝试过这一点: 我提出的解决方法是通过扩展activity类和添加AIDL接口,请求当前活动显示键盘。缺点是每个关键事件必须发送回服务(通过另一个AIDL接口)并手动转换为Unicode 此外,如果当前活动包含EditText,则软键盘仅

简短问题:是否可以(以及如何)从服务中显示软键盘

长问题:我写了一个服务,它创建了一个“顶栏”,显示在所有活动的顶部,包含一个编辑文本。我想在单击EditText时显示软键盘,但这不会发生

当然,我已经在服务的onFocusChange()和onClick()中尝试过这一点:

我提出的解决方法是通过扩展activity类和添加AIDL接口,请求当前活动显示键盘。缺点是每个关键事件必须发送回服务(通过另一个AIDL接口)并手动转换为Unicode

此外,如果当前活动包含EditText,则软键盘仅适用于该活动,并且在选择服务的EditText时不再显示


如果当前活动有EditText,是什么阻止显示服务的软键盘?如果你想在编辑文本的触摸上显示软键盘,为什么不考虑使用AdToucListEnter和EdtEdt文本呢?我相信edittext.requestfocus()也会这样做。若并没有,那个么听者肯定会工作


此外,对于您提到的那种视图,最好使用片段而不是服务来创建视图。

我也面临类似的问题。但在我的例子中,问题是由于在创建WindowManager.LayoutParams以供查看时使用了WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE标志

和键盘可视性

InputMethodManager inputManager = (InputMethodManager) context.
                getSystemService(Context.INPUT_METHOD_SERVICE);
        if (inputManager != null) {
            inputManager.toggleSoftInput(0, InputMethodManager.SHOW_IMPLICIT);
        } 

我也面临过类似的问题。我现在已经解决了。也许为时已晚,但愿它能帮助别人。 可能的错误原因: 在LayoutParams期间设置标志不可聚焦

private WindowManager.LayoutParams params = new WindowManager.LayoutParams(
                    WindowManager.LayoutParams.WRAP_CONTENT,
                    WindowManager.LayoutParams.WRAP_CONTENT,
                    WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
                    0,
                    PixelFormat.TRANSLUCENT);
窗口标志:此窗口永远不会获得键输入焦点,因此用户 无法向其发送密钥或其他按钮事件。这些将被取消 到它后面的任何可聚焦窗口

只需用0

使用以下代码:

InputMethodManager imm = null;

mView.findViewById(R.id.editText).setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                if(hasFocus){
                    if(imm==null){
                        imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                    }

                    imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0 );
                }
            }
        });
创建LayoutParams时为第二个

private WindowManager.LayoutParams params = new WindowManager.LayoutParams(
                    WindowManager.LayoutParams.WRAP_CONTENT,
                    WindowManager.LayoutParams.WRAP_CONTENT,
                    WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
                    0,
                    PixelFormat.TRANSLUCENT);

你解决了这个问题吗?我也面临同样的问题,这对我很有帮助。成功了。谢谢