最近项目中用到了webview,然后里面有输入框,当我们点击输入框的时候,软键盘挡住了布局,这就尴尬了,并且产品说,只有在软键盘弹出的时候底部的虚拟导航栏为黑色,软键盘隐藏的时候虚拟导航栏应该也隐藏。网上搜了很多资料和博客,最终把几篇有价值的贴上,并且附上源码。

public class AndroidBug5497Workaround {// For more information, see// https://code.google.com/p/android/issues/detail?id=5497// To use this class, simply invoke assistActivity() on an Activity that already// has its content view set.public static void assistActivity(Activity activity) {new AndroidBug5497Workaround(activity);}private View                     mChildOfContent;private int                         usableHeightPrevious;private FrameLayout.LayoutParams   frameLayoutParams;private AndroidBug5497Workaround(final Activity activity) {FrameLayout content = activity.findViewById(android.R.id.content);mChildOfContent = content.getChildAt(0);mChildOfContent.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {public void onGlobalLayout() {possiblyResizeChildOfContent(activity);}});frameLayoutParams = (FrameLayout.LayoutParams) mChildOfContent.getLayoutParams();}private void possiblyResizeChildOfContent(Activity activity) {int usableHeightNow = computeUsableHeight();if (usableHeightNow != usableHeightPrevious) {int usableHeightSansKeyboard = mChildOfContent.getRootView().getHeight();int heightDifference = usableHeightSansKeyboard - usableHeightNow;if (heightDifference > (usableHeightSansKeyboard / 4)) {// keyboard probably just became visibleframeLayoutParams.height = usableHeightSansKeyboard - heightDifference;PhoneUtils.setBottomNavigationColor(activity);} else {// keyboard probably just became hiddenframeLayoutParams.height = usableHeightSansKeyboard;PhoneUtils.hideVirtualNavigation(activity);}mChildOfContent.requestLayout();usableHeightPrevious = usableHeightNow;}}private int computeUsableHeight() {Rect r = new Rect();mChildOfContent.getWindowVisibleDisplayFrame(r);return (r.bottom - r.top);// 全屏模式下: return r.bottom}}
public class PhoneUtils {/**** 显示底部虚拟按键的颜色* * @param activity*/public static void setBottomNavigationColor(Activity activity) {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {Window window = activity.getWindow();window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);window.setNavigationBarColor(Color.BLACK);}}/**** 隐藏虚拟按键* * @param activity*/public static void hideVirtualNavigation(Activity activity) {if (hasNavBar(activity.getApplicationContext())) {hideBottomUIMenu(activity);}}/*** 隐藏虚拟按键,并且全屏*/private static void hideBottomUIMenu(Activity activity) {// 隐藏虚拟按键,并且全屏if (Build.VERSION.SDK_INT > 11 && Build.VERSION.SDK_INT < 19) { // lower apiView v = activity.getWindow().getDecorView();v.setSystemUiVisibility(View.GONE);} else if (Build.VERSION.SDK_INT >= 19) {// for new api versions.View decorView = activity.getWindow().getDecorView();int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_IMMERSIVE;decorView.setSystemUiVisibility(uiOptions);activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);}}/*** 检查是否存在虚拟按键栏** @param context* @return*/private static boolean hasNavBar(Context context) {Resources res = context.getResources();int resourceId = res.getIdentifier("config_showNavigationBar", "bool", "android");if (resourceId != 0) {boolean hasNav = res.getBoolean(resourceId);// check override flagString sNavBarOverride = getNavBarOverride();if ("1".equals(sNavBarOverride)) {hasNav = false;} else if ("0".equals(sNavBarOverride)) {hasNav = true;}return hasNav;} else { // fallbackreturn !ViewConfiguration.get(context).hasPermanentMenuKey();}}/*** 判断虚拟按键栏是否重写** @return*/private static String getNavBarOverride() {String sNavBarOverride = null;if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {try {Class c = Class.forName("android.os.SystemProperties");Method m = c.getDeclaredMethod("get", String.class);m.setAccessible(true);sNavBarOverride = (String) m.invoke(null, "qemu.hw.mainkeys");} catch (Throwable e) {}}return sNavBarOverride;}
}

thanks
webview 软键盘挡住问题
虚拟按键修改颜色
隐藏虚拟按键

android webview监听软键盘弹出和隐藏来修改虚拟导航栏颜色相关推荐

  1. android 键盘隐藏监听,安卓监听软键盘弹出与隐藏的两种方法

    需求: 现在有一个需求是点击一行文本框,弹出一个之前隐藏的输入框,输入完成后按返回键或者其他的东西隐藏键盘和输入框,将输入框的内容填充到文本框中. 实现: 拿到这个需求的第一反应就是写一个监听来监听键 ...

  2. Android判断软键盘弹出并隐藏的简单完美解决方案

    Android判断软键盘弹出并隐藏的简单完美解决方案 参考文章: (1)Android判断软键盘弹出并隐藏的简单完美解决方案 (2)https://www.cnblogs.com/thare1307/ ...

  3. Android App监听软键盘按键的三种方式与改变软键盘右下角确定键样式

    Android App监听软键盘按键的三种方式与改变软键盘右下角确定键样式 actionNone : 回车键,按下后光标到下一行 actionGo : Go, actionSearch : 放大镜 a ...

  4. 仿微信软键盘弹出与隐藏

    仿微信软键盘弹出与隐藏,效果图如下: 实现输入框弹出,软键盘弹出,获取焦点,否则失去焦点. 首先在 AndroidManifest 文件的对应 Activity 中加入下面代码: android:wi ...

  5. android中监听软键盘的弹出与隐藏,并获取软键盘的高度

    最近项目中有一个需求上弹出软键盘的时候,输入框位移至输入框上方,但是Activity中其他的VIew都不动.这个需求需要监听软软键盘的弹出与隐藏,并获取键盘的高度.上网找了一下发现,Android竟然 ...

  6. 简单可用 Android 安卓软键盘弹出、隐藏监听方法回调

    工具类 import android.app.Activity import android.graphics.Rect import android.view.ViewTreeObservercla ...

  7. Android App监听软键盘按键的三种方式(转)

    最近有类似需求,在csdn上刚好发现,粘贴过来,以防止忘记喽 前言: 我们在android手机上面有时候会遇到监听手机软键盘按键的时候,例如:我们在浏览器输入url完毕后可以点击软键盘右下角的&quo ...

  8. Android App监听软键盘按键的三种方式

    前言: 我们在android手机上面有时候会遇到监听手机软键盘按键的时候,例如:我们在浏览器输入url完毕后可以点击软键盘右下角的"GO"按键加载url页面:在点击搜索框的时候,点 ...

  9. Android App监听软键盘按键的三种方式 以及 输入法删除退格键的冲突问题解决

    输入法删除退格键的冲突问题解决 /***返回键处理 */@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {if( even ...

最新文章

  1. 8G+256G固态笔记本,结合这款IDEA插件,写代码飞起!
  2. 【CyberSecurityLearning 49】PHP与MySQL进行交互
  3. spring boot整合WebSocket示例
  4. RK1109 RK1126等芯片来袭,2020年瑞芯微旗下SoC一览
  5. 洛谷 P3384 【模板】树链剖分
  6. jquery-data的三种用法
  7. java编写代理服务器_如何编写Java代理
  8. 超过12000个零件,钢琴就是一部复杂的机器
  9. python高级编程 豆瓣_《Python高级编程》读书笔记:方法解释顺序浅析
  10. 5元的小乌龟吃什么_五月最适合吃这菜,5元一斤,两三天吃一次,鲜嫩正当时好美味...
  11. c语言正则表达式库,c语言正则表达式库--PCRE
  12. mysql -e 导出_mysql 导出数据导入数据
  13. 大数据Hadoop最新版实战Linux Ubuntu 16.04安装与运行测试例子...
  14. Java数据库操作要点
  15. Selenium官网打不开,这里看过来☺
  16. python电话簿_python 联系簿
  17. StackOverflow上87万访问量的问题:什么是“找不到符号”?
  18. python假设产品列表如下_Python.习题五 列表与元组(上)
  19. 中小企业如何化解经济危机
  20. oracle 00002,EXP-00002错误,求助

热门文章

  1. 关于对数据分析前辈的一次行业探讨
  2. virtualenv看这一篇就够了
  3. Ecstore可被访问外部接口的详细配置方式
  4. Spamhaus 遭受历史上最大的 DDoS 攻击——整个互联网都受到影响
  5. 我的世界盒子下载|我的世界盒子下载
  6. 悟管理-执行力的四个维度
  7. 我的程序员之路----2012在匍匐中前进
  8. 隧道保活超时或协商超时_快递柜超时取件需收费!网友炸了:这笔钱凭什么我们出?...
  9. php 当前栏目高亮,帝国CMS导航栏目实现当前栏目高亮
  10. html如何实现页面懒加载,原生JS如何实现图片懒加载