Android:WebView内输入框被键盘遮挡解决方案

先贴代码

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()方法调用,也可以把这个抽成静态方法调用

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    KeyBoardWorkaround keyBoardWorkaround = new KeyBoardWorkaround();
    keyBoardWorkaround.solve(this);

}

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

这个方法是厂商提供的,具体原因不清楚!
最初以为键盘无法弹出时因为webview焦点丢失,DispatchTouchEvent中给了焦点,没效果

//	横竖屏切换时调用
mWebView.clearFocus();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值