一、背景介绍
      首先介绍关于adjustSize与adjustpan

在manifest文件设置activity的windowSoftInputMode设置为 adjustPan 或者adjustResize

adjustPan会在软键盘弹出的时候平推整个界面,整个界面的大小不变的。缺点: 你编辑的部分会上弹到软键盘上面,但是会造成不可以拖拉,如果编辑的内容下面还有view,你想要操作的话必须先关闭软键盘

adjustResize则是会调整大小,以便为屏幕上的软键盘腾出空间。但是在全屏/沉浸式状态栏模式下是不可用的

二、解决方式
        安卓提供的adjustResize在全屏模式下不可用,就只能采用其他方式,谷歌上的大神采取的方式是根据app可展示区域的大小动态更改内容的大小,用scrollview包裹住content,这样就可以自己滑动做到不遮挡】

tips:  根目录必须用ScrollView包裹,不然展示区域变小后无法滑动,相当于没用   另外处理滑动冲突可以采用nestScrollView

这个代码考虑到了以下几种情况:

①有实体底部导航按钮的(oppo r9)  ②没有实体按钮但是开启虚拟底部导航按钮  (三星s8)  ③没有实体按钮但是关闭虚拟底部导航按钮的(红米k30)   ④三的基础上,但是代码运行却反馈有虚拟按钮的(oppo findx)

(其实难度主要在于如何判断得出底部导航按钮的高度和有无,需要对三星特别处理)

直接上代码:

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;
    Activity activity;
 
    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();
            int heightDifference = usableHeightSansKeyboard - usableHeightNow;
            if (heightDifference > (usableHeightSansKeyboard/4)) {
                // keyboard probably just became visible
                frameLayoutParams.height = usableHeightSansKeyboard - heightDifference+ getStatusBarHeight();
            } else {
                // keyboard probably just became hidden
                frameLayoutParams.height = usableHeightSansKeyboard-getNavigationBarHeight();
            }
            mChildOfContent.setBottom(frameLayoutParams.height);
            mChildOfContent.requestLayout();
            usableHeightPrevious = usableHeightNow;
        }
    }
 
    private int computeUsableHeight() {
        Rect r = new Rect();
        mChildOfContent.getWindowVisibleDisplayFrame(r);
        return (r.bottom - r.top);
    }
 
 
    public int getStatusBarHeight(){
        int result = 0;
        int resourceId = ContextUtils.getApplicationContext().getResources().getIdentifier("status_bar_height", "dimen", "android");
        if (resourceId > 0) {
            result = ContextUtils.getApplicationContext().getResources().getDimensionPixelSize(resourceId);
        }
        return result;
    }
 
 
    /**
     * 获取底部虚拟导航栏的高度
     * @return
     */
    public  int getNavigationBarHeight() {
        int height = 0;
        //屏幕实际尺寸
        DisplayMetrics dm = new DisplayMetrics();
        activity.getWindowManager().getDefaultDisplay().getRealMetrics(dm);
        int phoneHeight = dm.heightPixels;
        if (isNavigationBarExist()) {
            Resources resources =activity.getResources();
            int resourceId = resources.getIdentifier("navigation_bar_height",
                    "dimen", "android");
            if (resourceId > 0) {
                //获取NavigationBar的高度
                height = resources.getDimensionPixelSize(resourceId);
            }
        }
        if (height > 0){
            //处理全屏模式下,部分手机isNavigationBarExist()始终返回true,NavigationBar的高度
            int diffValue = (DensityUtils.getScreenHeight(ContextUtils.getApplicationContext()) + height) - phoneHeight;
             //这里对三星特别处理,以为三星机会把状态栏高度算入真正显示高度,
             //不过也可以理解,毕竟我们是全屏模式
            if(!"SAMSUNG".equalsIgnoreCase(Build.MANUFACTURER)){
                diffValue+= getStatusBarHeight();
            }
            if (diffValue > 0){
                height -= diffValue;
            }
        }
        return height;
    }
 
    /**
     * 检测底部虚拟导航栏是否存在
     *有很多教程写通过读取系统参数,无效,因为有些有参数但是不展示
     * @return
     */
    public  boolean isNavigationBarExist(){
        ViewGroup vp = (ViewGroup) activity.getWindow().getDecorView();
        if (vp != null) {
            for (int i = 0; i < vp.getChildCount(); i++) {
                vp.getChildAt(i).getContext().getPackageName();
                if (vp.getChildAt(i).getId() != View.NO_ID
                        && "navigationBarBackground".equals(activity.getResources().getResourceEntryName(vp.getChildAt(i).getId()))) {
                    return true;
                }
            }
        }
        return false;
    }
}
使用方式:

AndroidBug5497Workaround.assistActivity(你的activity)

感谢博主的分享,原文来自:安卓软键盘遮挡输入框+沉浸式+adjustsize失效+适配 (又名5497bug)_只会helloworld的博客-CSDN博客

安卓webview软键盘遮住底部按钮,又名AndroidBug5497相关推荐

  1. 安卓webview的软键盘遮住输入框

    关于webview的软键盘遮住输入框的问题,经过各方考证,终于是得到了解决. AndroidManifest 的 windowSoftInputMode无需设置,我之前就是设置了,一直不生效 以下是源 ...

  2. android 软键盘遮住按钮,Android应用中出现软键盘遮挡住按钮如何解决

    Android应用中出现软键盘遮挡住按钮如何解决 发布时间:2020-11-20 16:25:47 来源:亿速云 阅读:110 作者:Leah Android应用中出现软键盘遮挡住按钮如何解决?相信很 ...

  3. android 键盘将底部视图顶起,android 弹出软键盘将底部视图顶起问题

    今天要做一个搜索功能,搜索界面采用AutoCompleteTextView做搜索条,然后下面用listview来显示搜索结果,而我的主界面是在底 部用tab做了一个主界面导航,其中有一个搜索按钮,因为 ...

  4. 安卓手机软键盘弹起的问题

    现如今很多API对于安卓系统,iOS系统有些会兼容,有些不兼容.就拿软键盘弹起的问题来说吧,如果一个系统上面有一个输入框,底部有个按钮(前提按钮用了position:fixed),当我用安卓手机点击输 ...

  5. js防止安卓手机软键盘弹出挤压页面导致变形的方法

    h5防止安卓手机软键盘弹出挤压页面导致变形的方法 输入框定位在底部,手机端打开,输入框聚焦后软键盘打开为什么会瞬间自动关闭呢? 先看看问题: 1.原来是这样的: 2.在苹果手机里面是正常的: 3.到了 ...

  6. android虚拟键盘挡住布局,Android全屏时软键盘遮住输入框修改布局解决方案

    一般 *android:windowSoftInputMode="adjustResize" *就能解决软键盘遮住输入框的问题,但是当Activity设为Full Screen这个 ...

  7. android 键盘遮盖输入框_Android软键盘遮住输入框的解决方法终极适配

    新的一周,新的开始迎接新的挑战.今天简单介绍一下Android输入框被软键盘遮住的两种常用方法. 法一:清单文件对要进行设置的Activity属性配置android:windowSoftInputMo ...

  8. Android EditText软键盘换行键的修改和事件监听,软键盘设置搜索按钮;

    软键盘设置搜索按钮: 给EditText设置imeOptions属性: android:singleLine="true" android:imeOptions="act ...

  9. vue 手机键盘把底部按钮顶上去

    背景:在写提交订单页面时候,底部按钮当我点击输入留言信息的时候, 底部提交订单按钮被输入法软键盘顶上去遮挡住了. h5 ios输入框与键盘 兼容性优化 实现原理:当页面高度发生变化的时候改变底部but ...

最新文章

  1. iphone 在设置了initial-scale=1 之后,在设置滚动条之后,没有滑动效果的解决办法...
  2. 走向ASP.NET架构设计-第六章-服务层设计(中篇)
  3. Node.js 笔记01
  4. 不同的编译器:GCC G++ C C++的区别
  5. jQuery源码研究学习笔记(二)
  6. Linux驱动编程操作GPIO的简要说明
  7. Windows下 OpenSSL DES加密配置
  8. 【读书笔记】李彦宏传-张丽,学霸李彦宏:北大信管+留学纽约州立大学+百度创始人
  9. 微信小游戏声明文件(d.ts)
  10. android 自定义方形章,Android自定义View-圆形印章
  11. windows10批量修改文件后缀名
  12. 计算机英语i有关科技翻译的范文,the internet英语作文优秀范文带翻译
  13. 5-6中央处理器-多处理器系统硬件多线程
  14. 洞悉物联网发展1000问之为什么新零售不仅仅是无人零售?
  15. 鱼眼:一:一分钟详解鱼眼镜头标定基本原理及实现
  16. 深度学习主机环境配置: Ubuntu16.04+GeForce GTX 1080+TensorFlow
  17. Adobe Premiere剪辑技巧分享
  18. 用c语言实现cos x 函数
  19. 异化之地服务器维护要多久,异化之地3月26日停服维护公告_异化之地3月26日更新了什么_玩游戏网...
  20. js导出word文档 可以兼容IE8+浏览器适配其他浏览器

热门文章

  1. 随机网络与无标度网络
  2. 本人做c++有十多年啦,谈谈我这几年的C++学习之路
  3. 代码随想录算法训练营day13 | 239. 滑动窗口最大值 | 347.前 K 个高频元素
  4. 用C语言实现各种排序(附动图)
  5. 目标检测数据集下载地址总结
  6. win10下使用虚拟机VMware安装/制作纯净版苹果系统OS10.12.6教程及错误解决办法
  7. Jenkins中集成NodeJS插件问题对应
  8. nonlocal global
  9. 你的python送你的文件传输助手
  10. Linux awk指令详解