简短问题:是否可以(以及如何)从服务中显示软键盘?
长问题:我写了一个服务,它创建了一个“顶栏”,显示在所有活动的顶部,包含一个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的限制吗?
答案 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()也会这样做。如果没有,听众肯定会工作。
此外,对于您提到的那种观点,最好使用片段而不是服务来创建视图。