博客
关于我
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 常用
查看>>
MySQL 常用列类型
查看>>
mysql 常用命令
查看>>
Mysql 常见ALTER TABLE操作
查看>>
MySQL 常见的 9 种优化方法
查看>>
MySQL 常见的开放性问题
查看>>
Mysql 常见错误
查看>>
mysql 常见问题
查看>>
MYSQL 幻读(Phantom Problem)不可重复读
查看>>
mysql 往字段后面加字符串
查看>>
mysql 快速自增假数据, 新增假数据,mysql自增假数据
查看>>
Mysql 批量修改四种方式效率对比(一)
查看>>
Mysql 报错 Field 'id' doesn't have a default value
查看>>
MySQL 报错:Duplicate entry 'xxx' for key 'UNIQ_XXXX'
查看>>
Mysql 拼接多个字段作为查询条件查询方法
查看>>
mysql 排序id_mysql如何按特定id排序
查看>>
Mysql 提示:Communication link failure
查看>>
mysql 插入是否成功_PDO mysql:如何知道插入是否成功
查看>>
Mysql 数据库InnoDB存储引擎中主要组件的刷新清理条件:脏页、RedoLog重做日志、Insert Buffer或ChangeBuffer、Undo Log
查看>>
mysql 数据库中 count(*),count(1),count(列名)区别和效率问题
查看>>