先上最终的代码:

public class AndroidWorkaround {public static void assistActivity(View content) {new AndroidWorkaround(content);}private View mChildOfContent;private int usableHeightPrevious;private ViewGroup.LayoutParams frameLayoutParams;private AndroidWorkaround(View content) {mChildOfContent = content;mChildOfContent.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {public void onGlobalLayout() {possiblyResizeChildOfContent();}});frameLayoutParams = mChildOfContent.getLayoutParams();}private void possiblyResizeChildOfContent() {int usableHeightNow = computeUsableHeight();if (usableHeightNow != usableHeightPrevious) {frameLayoutParams.height = usableHeightNow;mChildOfContent.requestLayout();usableHeightPrevious = usableHeightNow;}}private int computeUsableHeight() {Rect r = new Rect();mChildOfContent.getWindowVisibleDisplayFrame(r);return (r.bottom);}public static boolean checkDeviceHasNavigationBar(Context context) {boolean hasNavigationBar = false;Resources rs = context.getResources();int id = rs.getIdentifier("config_showNavigationBar", "bool", "android");if (id > 0) {hasNavigationBar = rs.getBoolean(id);}try {Class systemPropertiesClass = Class.forName("android.os.SystemProperties");Method m = systemPropertiesClass.getMethod("get", String.class);String navBarOverride = (String) m.invoke(systemPropertiesClass, "qemu.hw.mainkeys");if ("1".equals(navBarOverride)) {hasNavigationBar = false;} else if ("0".equals(navBarOverride)) {hasNavigationBar = true;}} catch (Exception e) {}return hasNavigationBar;}}

注意点:这里构造方法的参数是当前你写的布局view
-----------------------------------------------------------------------------------------------
PS:
1.单单解决输入法挡住软键盘
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 Activity activity;private View mChildOfContent;private int usableHeightPrevious;private FrameLayout.LayoutParams frameLayoutParams;private AndroidBug5497Workaround(Activity activity) {this.activity = activity;FrameLayout content = (FrameLayout) activity.findViewById(android.R.id.content);mChildOfContent = content.getChildAt(0);mChildOfContent.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {public void onGlobalLayout() {possiblyResizeChildOfContent();}});frameLayoutParams = (FrameLayout.LayoutParams) mChildOfContent.getLayoutParams();}private void possiblyResizeChildOfContent() {int usableHeightNow = computeUsableHeight();if (usableHeightNow != usableHeightPrevious) {int usableHeightSansKeyboard = mChildOfContent.getRootView().getHeight();//这个判断是为了解决19之前的版本不支持沉浸式状态栏导致布局显示不完全的问题
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {Rect frame = new Rect();activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);int statusBarHeight = frame.top;usableHeightSansKeyboard -= statusBarHeight;}int heightDifference = usableHeightSansKeyboard - usableHeightNow;if (heightDifference > (usableHeightSansKeyboard / 4)) {// keyboard probably just became visible
                frameLayoutParams.height = usableHeightSansKeyboard - heightDifference;} else {// keyboard probably just became hidden
                frameLayoutParams.height = usableHeightSansKeyboard;}mChildOfContent.requestLayout();usableHeightPrevious = usableHeightNow;}}private int computeUsableHeight() {Rect frame = new Rect();activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);int statusBarHeight = frame.top;Rect r = new Rect();mChildOfContent.getWindowVisibleDisplayFrame(r);//这个判断是为了解决19之后的版本在弹出软键盘时,键盘和推上去的布局(adjustResize)之间有黑色区域的问题
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {return (r.bottom - r.top) + statusBarHeight;}return (r.bottom - r.top);}}

2.单单解决华为手机虚拟按键挡住底部界面
public class AndroidBug54971Workaround {// 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.

    /**
     * 关联要监听的视图
     *
     * @param viewObserving
     */
    public static void assistActivity(View viewObserving) {new AndroidBug54971Workaround(viewObserving);}private View mViewObserved;//被监听的视图
    private int usableHeightPrevious;//视图变化前的可用高度
    private ViewGroup.LayoutParams frameLayoutParams;private AndroidBug54971Workaround(View viewObserving) {mViewObserved = viewObserving;//给View添加全局的布局监听器
        mViewObserved.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {public void onGlobalLayout() {resetLayoutByUsableHeight(computeUsableHeight());}});frameLayoutParams = mViewObserved.getLayoutParams();}private void resetLayoutByUsableHeight(int usableHeightNow) {//比较布局变化前后的View的可用高度
        if (usableHeightNow != usableHeightPrevious) {//如果两次高度不一致
            //将当前的View的可用高度设置成View的实际高度
            frameLayoutParams.height = usableHeightNow;mViewObserved.requestLayout();//请求重新布局
            usableHeightPrevious = usableHeightNow;}}/**
     * 计算视图可视高度
     *
     * @return
     */
    private int computeUsableHeight() {Rect r = new Rect();mViewObserved.getWindowVisibleDisplayFrame(r);return (r.bottom - r.top);}
}

注意点:setContentView(R.layout.content_frame); 
AndroidBug54971Workaround.assistActivity(findViewById(android.R.id.content));

解决输入法遮挡布局和华为手机底部虚拟按键遮挡底部界面的方法相关推荐

  1. Android:解决华为手机隐藏虚拟按键Activity被重新创建的问题

    解决华为手机隐藏虚拟按键Activity被重新创建的问题 问题描述 解决方法 分析 问题描述 在华为手机P9上 屏幕底部虚拟按键用户可以随时隐藏或显示,在改变后 返回上一页,会导致页面重新创建,页面操 ...

  2. android 虚拟按键挡住布局,Android 关于导航栏(虚拟按键)遮挡PopupWindow底部布局的问题...

    我们自定义popupWindow的时候,一般会设置这些参数 setContentView(contentView); //设置高度为屏幕高度 setWidth(UIUtils.getScreenHei ...

  3. 解决华为手机隐藏虚拟按键Activity被重启的问题

    引言 最近技术群里面的妹纸说:在华为手机上开发应用的时候,隐藏底部的虚拟按键Activity会被重启的问题,并且找不到问题所在,于是查查资料,发现问题解决起来蛮简单的. 问题描述 一开始觉得应该是代码 ...

  4. 界面适配华为手机的虚拟按键的解决方案

    一.概述 在项目中,测试发现在一些华为手机的屏幕适配上出现了问题,主要是因为华为Mate等一些系列的手机有一个虚拟按键的设计.当这些虚拟按键由用户手势滑出,或默认显示的话,就会遮挡我们本身的应用布局. ...

  5. 解决华为手机隐藏虚拟按键Activity被重新创建的问题

    把Activity的生命周期全部打印出来,确定隐藏或显示虚拟按键时,确实导致了Activity重建 然后在onCreate方法中 Configuration configuration = getRe ...

  6. 解决华为手机虚拟按键遮挡页面底部tab栏的问题

    谷歌原生,华为之类的虚拟按键遮挡页面底部RadioButton之类的问题. if (AndroidWorkaround.checkDeviceHasNavigationBar(this)) { //适 ...

  7. 华为手机和谷歌原生系统虚拟按键遮挡布局问题

    很多情况下,例如华为手机和谷歌原生系统只有虚拟按键,这时候假如你们做了特殊处理我们可以将布局绘制到navigationBar里面.当然为了避免这种情况,我们应该讲所有的绘图到在navigationBa ...

  8. android 虚拟按键遮挡布局,完美解决虚拟按键遮盖底部视图的问题

    Android部分手机会有虚拟按键,而没有实体按键,例如华为系列的手机. 然而在开发过程中,有时候会涉及底部视图的开发,最终的结果却因为虚拟按键的关系,结果底部视图被虚拟按键给遮盖住了. 在这里,分为 ...

  9. 安卓类似华为手机适配底部虚拟按键的解决方案

    场景1:华为手机遮挡了屏幕底部. 场景2:进入应用时,虚拟键自动缩回,留下空白区域. 需求: 需要安卓能自适应底部虚拟按键,用户隐藏虚拟按键时应用要占满整个屏幕,当用户启用虚拟键时,应用能往上收缩,等 ...

最新文章

  1. AAAI 2020 | 多模态基准指导的生成式多模态自动文摘
  2. Spring – Sending E-Mail Via Gmail SMTP Server With MailSender--reference
  3. HDU 1754 I Hate It(线段树)
  4. ces测试数据测试ces测试数据测试ces测试数据测试ces测试数据测试ces测试数据测试
  5. BZOJ3511: 土地划分
  6. oracle 递归计算,SQL(Oracle)中的递归计算
  7. 【数据库】第二章 基础函数、聚合函数、条件查询、子查询和多表查询
  8. 华为mate10手机听筒测试软件,华为mate 10功能说:这几个设置,让你通话体验直线上升,简直了!...
  9. phpstudy设置允许远程访问mysql数据库
  10. matlab练习程序(对应点集配准的四元数法)
  11. 极路由大部分机型官方固件
  12. 微信小程序上线问题与经验总结
  13. PMBOK第6版 项目管理过程组与知识领域(15至尊图)
  14. 2022-2028年中国现代服务行业企业投资项目指引及机会战略分析报告
  15. html页面如何实现搜索功能,使用jQuery怎么实现一个页面关键字搜索功能
  16. 东芝计算机配置,东芝z830配置 东芝Z830-K02S参数【图文】
  17. C语言(字符串输入)
  18. matlab(1):使用matlab处理excel数据进行画图
  19. Web组件构建库-Lit
  20. 生命不息,折腾不止:Jetson Nano填坑之软件篇

热门文章

  1. JNPF快速开发平台 3.4.1 3.3.1 3.3.2 企业版旗舰版 框架源码 大屏设计 大屏源码
  2. 【秦丝进销存】虚拟服装店即将取代实体服装店?实体店真的没救了吗!
  3. python类子类调用父类方法总结
  4. 公益领域:长安链ChainMaker在全民义务植树中的应用实践
  5. 一个简单的死锁demo以及死锁分析
  6. git官网下载不了的解决办法
  7. SaaS产品订阅模式客户分析方法总结
  8. Python教程笔记----6小时完全入门
  9. 酷安开发者签名认证步骤
  10. PHPCMS V9 学习总结(转)