如何从服务中显示软键盘?

时间:2011-08-03 10:47:46

标签: android android-layout android-softkeyboard

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

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

当然我已经从服务的onFocusChange()和onClick()尝试了这个:

InputMethodManager imm = (InputMethodManager)this.getSystemService(Service.INPUT_METHOD_SERVICE);
imm.showSoftInput(editText, InputMethodManager.SHOW_FORCED);

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

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

如果当前活动有EditText,是什么阻止显示服务的软键盘?这可能是Android的限制吗?

3 个答案:

答案 0 :(得分:1)

我面临类似的问题。但就我而言,问题是由于在为视图创建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);
        } 

答案 1 :(得分:0)

我也遇到过类似的问题。我已经解决了。也许为时已晚,但可能对某人有所帮助。 错误的可能原因: 在LayoutParams期间设置FLAG_NOT_FOCUSABLE

  

窗口标志:此窗口永远不会获得按键输入焦点,因此用户   无法向其发送按键或其他按钮事件。那些会代替   到它后面的任何可聚焦窗口。

只需将 FLAG_NOT_FOCUSABLE 替换为 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);

答案 2 :(得分:-1)

如果您想在edittext的触摸屏上显示Soft Keyboard,为什么不考虑将onTouchListener与该edittext一起使用。我相信edittext.requestfocus()也会这样做。如果没有,听众肯定会工作。

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