博客
关于我
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 InnoDB引擎的锁机制详解
查看>>
Mysql INNODB引擎行锁的3种算法 Record Lock Next-Key Lock Grap Lock
查看>>
mysql InnoDB数据存储引擎 的B+树索引原理
查看>>
mysql innodb通过使用mvcc来实现可重复读
查看>>
mysql interval显示条件值_MySQL INTERVAL关键字可以使用哪些不同的单位值?
查看>>
Mysql join原理
查看>>
mysql order by多个字段排序
查看>>
MySQL Order By实现原理分析和Filesort优化
查看>>
mysql problems
查看>>
mysql replace first,MySQL中处理各种重复的一些方法
查看>>
MySQL replace函数替换字符串语句的用法(mysql字符串替换)
查看>>
Mysql Row_Format 参数讲解
查看>>
mysql select, from ,join ,on ,where groupby,having ,order by limit的执行顺序和书写顺序
查看>>
MySQL Server 5.5安装记录
查看>>
mysql slave 停了_slave 停止。求解决方法
查看>>
MySQL SQL 优化指南:主键、ORDER BY、GROUP BY 和 UPDATE 优化详解
查看>>
mysql sum 没返回,如果没有找到任何值,我如何在MySQL中获得SUM函数以返回'0'?
查看>>
mysql Timestamp时间隔了8小时
查看>>
Mysql tinyint(1)与tinyint(4)的区别
查看>>
mysql union orderby 无效
查看>>