用android编写了悬浮窗,项目是用Unity3d做的,项目中的输入法软键盘无法显示了,能接收到按键,但是软键盘看不到。
windowParams的参数如下,主要的问题在flags
windowParams.type = LayoutParams.TYPE_PHONE;
windowParams.format = PixelFormat.RGBA_8888;
windowParams.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL
| LayoutParams.FLAG_NOT_FOCUSABLE;
如果我只设置成windowParams.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL这样的话,输入法是可以启动的,但是手机的返回键得不到反馈了,
如果我只设置成windowParams.flags = LayoutParams.FLAG_NOT_FOCUSABLE这样的话,输入法就无法显示出来。
设置成这样windowParams.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL
| LayoutParams.FLAG_NOT_FOCUSABLE; 输入法还是无法显示。
windowParams.flags = LayoutParams.FLAG_ALT_FOCUSABLE_IM
| LayoutParams.FLAG_NOT_FOCUSABLE; 输入法还是无法显示。
这样的flags改如何设置呢?
求助~~
原因是 悬浮窗写在了警告层,导致和输入框一个层级,把悬浮窗绛一下层级就可以了
同样的问题,折腾了很久,找到答案,瞬间觉得蛋疼。。。
我的解决办法如下,不知道适不适合你们
问题出在WindowManager的实例获取方式不对
之前是这样获取的:
mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
改这样就ok了:
mWindowManager = (WindowManager) mContext.getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
一个是通过当前activity的上下文环境去获取窗口服务,一个是通过application去获取窗口服务
原理没完全理解,至少问题解决了,有空再去看看 2个环境变量有什么区别吧
遇到了和题主一样的问题,解决了吗? 我现在在自定义一个输入键盘和忽视返回键之间取舍,估计会弄个简单的输入键盘。
想到了,点击edittext时候去改变windowParams.flags 的值,用 windowManager.updateViewLayout(view, layoutParams);刷新。
监听键盘,键盘收起来的时候再去改一下windowParams.flags ,再用用 windowManager.updateViewLayout(view, layoutParams)刷新就行了。有很有效!
又来了,现在要做的就是在services中监听键盘的收起和弹出,github上找到一个项目 https://github.com/pqpo/InputMethodHolder,在我的小米手机上无效。
我刚刚解决了这个问题:
layoutParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
layoutParams.flags =WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE| WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
这样设置可点击、可返回、可弹出输入法。系统是android 8.1。
不过不知道我的需求和你们一样不一样,我是将整个屏幕用悬浮窗覆盖加上一层护眼的绿色,所以要让悬浮窗下面的界面可以操作。
自己写个按钮,写个关闭悬浮框的办法,曲线救国一下
mWindowManager.removeView(mView);
用removeView方法关闭悬浮框