Android EditText被软键盘遮盖的处理方法
这两天androidapp新增了透明栏效果,结果发现键盘弹起后会遮盖屏幕底部的EditText,没有像想象中的调整窗口大小,并滚动ScrollView,将EditText显示在键盘上方。之前也遇到过类似问题,所以解决后就干脆写把所有关于EditText和键盘之间问题和解决思路都记录一下,以便以后查阅。
一、在5.0以前,如果EditText设置了gravity=“center|right”其中之一且同时设置了singleLine=“true”,就会导致屏幕底部的EditText连续点击弹出键盘时,从第二次开会一直遮挡住EditText。
5.0+则不会有该问题,解决办法也简单,在EditText外层包裹ScrollView,并设置键盘模式为adjustResize模式即可(两者缺一不可)。
二、按上面描述的解决办法,一直没什么问题,直到最近加了透明栏效果,键盘模式仿佛直接失效,每次点击底部EditText时,键盘都从底部弹起,窗口大小也不会调整,底部EditText也会被遮盖。最后发现是当使用getWindow().getDecorView().setSystemUiVisibility方法设置了SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN或SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION,或者设置了window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)时,会引发EditText被键盘遮盖问题。
因为透明栏效果是从4.4开始支持,也就导致从4.4开始项目就存在这个BUG,当然只考虑5.0+的透明栏效果,可以直接设置状态栏颜色实现透明栏效果,我这里由于项目需要必须要从4.4开始支持,所以必须解决这个问题。
正常情况下,系统UI会占用app一些空间,例如状态栏、键盘、导航栏等,也就是说我们的appUI不会出现在系统UI之下,但从测试结果来看,为了占用状态栏空间或全屏,设置了上面的一些属性后,就会被系统UI覆盖。
解决方法:
监听界面容器的layout变化,当发生变化时,通过检查窗口可见区域高度,判断键盘是否弹起,如果弹起,则修改容器bottompadding,也就是手动实现adjustResize效果,给键盘留出显示空间,这样ScrollView也会自动调整大小,将EditText显示在键盘上方。
publicclassKeyboardPatch { privateActivityactivity; privateViewdecorView; privateViewcontentView; /** *构造函数 *@paramact需要解决bug的activity *@paramcontentView界面容器,activity中一般是R.id.content,也可能是Fragment的容器,根据个人需要传递 **/ publicKeyboardPatch(Activityact,ViewcontentView) { this.activity=act; this.decorView=act.getWindow().getDecorView(); this.contentView=contentView; } /** *监听layout变化 **/ publicvoidenable() { activity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN|WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); if(Build.VERSION.SDK_INT>=19) { decorView.getViewTreeObserver().addOnGlobalLayoutListener(onGlobalLayoutListener); } } /** *取消监听 **/ publicvoiddisable() { activity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN|WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN); if(Build.VERSION.SDK_INT>=19) { decorView.getViewTreeObserver().removeOnGlobalLayoutListener(onGlobalLayoutListener); } } privateViewTreeObserver.OnGlobalLayoutListeneronGlobalLayoutListener=newViewTreeObserver.OnGlobalLayoutListener() { @Override publicvoidonGlobalLayout() { Rectr=newRect(); decorView.getWindowVisibleDisplayFrame(r); intheight=decorView.getContext().getResources().getDisplayMetrics().heightPixels; intdiff=height-r.bottom; if(diff!=0) { if(contentView.getPaddingBottom()!=diff) { contentView.setPadding(0,0,0,diff); } } else { if(contentView.getPaddingBottom()!=0) { contentView.setPadding(0,0,0,0); } } } }; }
以上所述是小编给大家介绍的AndroidEditText被软键盘遮盖的处理方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!