Android小坑Android开发经验谈Android开发

系统级dialog与软键盘的冲突处理

2017-08-09  本文已影响40人  badc59a1a8c4
          Android6.0也上的机子,现在已经很少用到系统级别的对话框了,毕竟需要用户自己去开启权限。但是如果是开发基于6.0以下的系统,车载机,智能家居等Android设备,大多使用4.0~5.0的系统,或者是已经默认给了应用权限了。所以在这块领域上,系统级对话框的使用还是很普遍的。
           系统级的dialog相对普通的dialog的优点:优先级高,独立性强,不需要依附于Activity窗口。缺点也很明显:由于是系统级的应用,当dialog需要使用到editview的时候,就很难控制。
            使用的时候,需要添加权限:<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />,并且在创建的过程中添加TYPE:mDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);其他地方和普通的dialog一样。
            如果不幸遇到这样的需求:![](http:https://img.haomeiwen.com/i2496578/b01a63ac128aace7?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
            你会发现那些原本对于解决软件盘冲突问题很有用的方式方法全部失效了。因为系统级的dialog,并不依附于Activity窗口,也就是说这样的dialog不在应用层面上,而是在系统层面上,连带着软键盘也是在系统层面上了。点击editview必定是弹出的软键盘遮盖着dialog。
             那么这个时候,我们肯定是通过判断软键盘是否弹出,从而更变dialog相对屏幕的位置。而网上的大部分的都是通过页面布局的变化来监听软键盘的。但是现在行不通了。由dialog触发的软键盘也是属于系统级的。Android5.0以后的系统源码里面有一个获取软键盘窗口高度的方法:

/** * @return The current height of the input method window. * @hide */ public int getInputMethodWindowVisibleHeight() { synchronized (mH) { try { return mService.getInputMethodWindowVisibleHeight(); } catch (RemoteException e) { Log.w(TAG, "IME died: " + mCurId, e); return 0; } } }
虽然是一个public方法,但是不能直接拿来用,只能通过反射:

try{ InputMethodManager imm = (InputMethodManager) context.getApplicationContext().getSystemService(Context.INPUT_METHOD_SERVICE); Class clazz = imm.getClass(); Method method = clazz.getMethod("getInputMethodWindowVisibleHeight", null); method.setAccessible(true); int height = (Integer) method.invoke(imm, null); Log.v("LOG", "height == "+height); if(height > 100) { isInputing = true;//软键盘开启 } }catch(Exception e) { e.printStackTrace(); }
这个方法可以准确的判断软键盘的开启情况,但是它这个在调用的时候才会生效。不能像通过activity监听布局变化那样,实时调用,我的办法是在dialog弹出来的时候,使用线程开启定时任务,100判断一次,当dialog关闭以后,关闭线程。但是这只能算是一个无奈的笨办法,毕竟,使用反射,和定时任务都是比较耗能的。
最后,根据软键盘状态,设置dialog的位置:

if(window!=null){ lp = window.getAttributes(); if (inputUilts.inputMethodSate(ContextUtil.getInstance().getApplicationContext())) { Loggshow.w("软键盘---》","弹出来了"); window.setGravity(Gravity.CENTER | Gravity.TOP); } else { window.setGravity(Gravity.CENTER); Loggshow.w("软键盘---》","没有弹出来了"); } }

上一篇下一篇

猜你喜欢

热点阅读