博客
关于我
Android:WebView内输入框被键盘遮挡解决方案
阅读量:505 次
发布时间:2019-03-07

本文共 4411 字,大约阅读时间需要 14 分钟。

先贴代码

package com.miss.plugin;import android.app.Activity;import android.graphics.Rect;import android.os.Build;import android.util.Log;import android.view.View;import android.view.ViewTreeObserver;import android.widget.FrameLayout;public class KeyBoardWorkaround {       private  final String TAG = "KeyBoardWorkaround";    //  activity 的根视图    private  View rootView;    //  记录根视图的显示高度    private  int rootViewVisibleHeight;    private  boolean hasInit = false;    private  int initHeight;    private  int initWidth;    //  是否发生旋转    private  boolean hasRotate = false;    private  FrameLayout.LayoutParams frameLayoutParams;    private  int statusBarHeight;    /**     *     * @param activity     */    public  void solve(Activity activity) {           //  tpc : 获取activity的根视图        rootView = activity.getWindow().getDecorView();        //  tpc : 获取状态栏的高度,此部分做机型适配        int resourceId = activity.getResources().getIdentifier("status_bar_height", "dimen", "android");        statusBarHeight = activity.getResources().getDimensionPixelSize(resourceId);        FrameLayout content = (FrameLayout) activity.findViewById(android.R.id.content);        final View mChildOfContent = content.getChildAt(0);        frameLayoutParams = (FrameLayout.LayoutParams) mChildOfContent.getLayoutParams();        //  tpc : 监听视图树中全局布局发生改变或视图树种某个视图可视状态发生改变        rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {               @Override            public void onGlobalLayout() {                   //  tpc : 获取当前根视图在屏幕上显示的大小                Rect rect = new Rect();                rootView.getWindowVisibleDisplayFrame(rect);                int visibleHeight = rect.height();                Log.e(TAG, "visibleHeight =  " + visibleHeight);                Log.e(TAG, "visibleWidth =  " + rect.width());                if (!hasInit) {                       initHeight = rect.height();                    initWidth = rect.width();                    hasInit = !hasInit;                }                if (rootViewVisibleHeight == 0) {                       rootViewVisibleHeight = visibleHeight;                    return;                }                //  根视图显卡显示高度没有变化,可以看做软键盘状态没有改变                if (rootViewVisibleHeight == visibleHeight) {                       return;                }                //  发生了旋转                if (visibleHeight == initWidth) {                       rootViewVisibleHeight = visibleHeight;                    frameLayoutParams.height = initWidth;                    frameLayoutParams.width = initHeight;                    mChildOfContent.requestLayout();                    hasRotate = true;                    return;                }                //  旋转恢复                if (hasRotate) {                       rootViewVisibleHeight = visibleHeight;                    frameLayoutParams.height = initHeight;                    frameLayoutParams.width = initWidth;                    hasRotate = false;                    return;                }                //  根视图高度变小超过200,软键盘显示                if (rootViewVisibleHeight - visibleHeight > 200) {                       //  TODO 键盘展示逻辑,机型适配                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {                           frameLayoutParams.height = visibleHeight + statusBarHeight;                    } else {                           frameLayoutParams.height = visibleHeight;                    }                    mChildOfContent.requestLayout();                    rootViewVisibleHeight = visibleHeight;                    return;                }                //  根视图高度变大超过200,软键盘隐藏                if (visibleHeight - rootViewVisibleHeight > 200) {                       //  TODO 键盘收起逻辑                    frameLayoutParams.height = initHeight;                    mChildOfContent.requestLayout();                    rootViewVisibleHeight = visibleHeight;                    return;                }            }        });    }}

调用

在有WebView的活动的onCreate()方法调用,也可以把这个抽成静态方法调用

@Overrideprotected void onCreate(Bundle savedInstanceState) {       super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    KeyBoardWorkaround keyBoardWorkaround = new KeyBoardWorkaround();    keyBoardWorkaround.solve(this);}

横竖屏切换后键盘无法正常弹出

这个方法是厂商提供的,具体原因不清楚!

最初以为键盘无法弹出时因为webview焦点丢失,DispatchTouchEvent中给了焦点,没效果

//	横竖屏切换时调用mWebView.clearFocus();

转载地址:http://aefjz.baihongyu.com/

你可能感兴趣的文章
n = 3 , while n , continue
查看>>
n 叉树后序遍历转换为链表问题的深入探讨
查看>>
N!
查看>>
N-Gram的基本原理
查看>>
n1 c语言程序,全国青少年软件编程等级考试C语言经典程序题10道七
查看>>
Nacos Client常用配置
查看>>
nacos config
查看>>
Nacos Config--服务配置
查看>>
Nacos Derby 远程命令执行漏洞(QVD-2024-26473)
查看>>
Nacos 与 Eureka、Zookeeper 和 Consul 等其他注册中心的区别
查看>>
Nacos 单机集群搭建及常用生产环境配置 | Spring Cloud 3
查看>>
Nacos 启动报错[db-load-error]load jdbc.properties error
查看>>
Nacos 报Statement cancelled due to timeout or client request
查看>>
Nacos 注册服务源码分析
查看>>
Nacos 融合 Spring Cloud,成为注册配置中心
查看>>
Nacos-注册中心
查看>>
Nacos-配置中心
查看>>
Nacos2.X 源码分析:为订阅方推送、服务健康检查、集群数据同步、grpc客户端服务端初始化
查看>>
Nacos2.X 配置中心源码分析:客户端如何拉取配置、服务端配置发布客户端监听机制
查看>>
Nacos2.X源码分析:服务注册、服务发现流程
查看>>