开发的一个系统悬浮框 做一个全局的设置界面。使用了GT库 框架的 GT_FloatingWindow 子功能(mirrors / 1079374315 / GT · GitCode)。开始的时候开开心心的 很实用。后面遇到一些问题让人头疼,FloatingWindow这个子框架 不能之间使用fragment ,无法使用dialog 等等让很多本来简答的工作,变得复杂起来。
例外一个问题 ,大家如果使用这个框架的话,应该也会遇到,就是 这个window上 的EditText 无法获取到输入内容,软键盘也不能正常弹出。
我的解决方法:
继承的 initView(View view)方法中加上
ll.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
应该就可以了。
@Override protected void initView(View view) { super.initView(view); WindowManager.LayoutParams ll = getLayoutParams(); ll.gravity = Gravity.CENTER; ll.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL; setDrag(true);//设置可拖动 }
问题就在于 悬浮框需要 不去拦截框外的事件。所以设置WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
,悬浮框外的点击才有效,会把事件分发给悬浮窗底层的其他应用Activity,但这样的话悬浮框
EditText无法弹出键盘,也无法获取到外接键盘输入的内容
。
悬浮框内View的onToucheEvent函数好像也不能能触发,在找资料的过程中,看到说添加WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,倒是可以触发,但是无法拦截事件
(具体未测试)。
而设置为 WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
,屏幕上弹窗之外的地方能够点击、弹窗上的EditText也可以输入、键盘能够弹出来。