博客
关于我
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/

你可能感兴趣的文章
mysql中cast() 和convert()的用法讲解
查看>>
mysql中datetime与timestamp类型有什么区别
查看>>
MySQL中DQL语言的执行顺序
查看>>
mysql中floor函数的作用是什么?
查看>>
MySQL中group by 与 order by 一起使用排序问题
查看>>
mysql中having的用法
查看>>
MySQL中interactive_timeout和wait_timeout的区别
查看>>
mysql中int、bigint、smallint 和 tinyint的区别、char和varchar的区别详细介绍
查看>>
mysql中json_extract的使用方法
查看>>
mysql中json_extract的使用方法
查看>>
mysql中kill掉所有锁表的进程
查看>>
mysql中like % %模糊查询
查看>>
MySql中mvcc学习记录
查看>>
mysql中null和空字符串的区别与问题!
查看>>
MySQL中ON DUPLICATE KEY UPDATE的介绍与使用、批量更新、存在即更新不存在则插入
查看>>
MYSQL中TINYINT的取值范围
查看>>
MySQL中UPDATE语句的神奇技巧,让你操作数据库如虎添翼!
查看>>
Mysql中varchar类型数字排序不对踩坑记录
查看>>
MySQL中一条SQL语句到底是如何执行的呢?
查看>>
MySQL中你必须知道的10件事,1.5万字!
查看>>