AndroidBug5497Workaround 修改

公司要使用app,所以学习了一下android app的开发。
目的就是把html内容给展示出来而已,使用webview来呈现html内容。
可是,在点击输入框时,软键盘会遮挡输入框的内容。

可是自己无论怎么调都不成功,如果网页放入chrome浏览器中又可以。

去网上找了好多教程,说是android的一个bug,历史还很久远google还不想解决,所以得自己解决。

教程说让加载AndroidBug5497Workaround类,
在webview所在的activity的
onCreate方法里的
setContentView()后调用AndroidBug5497Workaround.assistActivity(this);这个方法。

调用了之后,是可以看见输入框了,但是又出现了一个问题。

因为html太长了,在webview中会滚动,但是调用了AndroidBug5497Workaround.assistActivity(this);这个方法之后不能出现滚动了。

滚动的原因是webview的高度太短,装不下html,所以才出现滚动。
看了这个类,他的功能就是监听键盘弹起回收的事件,通过这两个事件来影响webview的高度。

frameLayoutParams.height = usableHeightSansKeyboard - heightDifference;

这段代码是键盘弹起后设置的webview的高度,具体这个方法是干什么的我不知道,我就知道我的webview的高度会通过这个函数变短。

问题出在变回来的时候的高度上。
frameLayoutParams.height = usableHeightSansKeyboard;
就是上面这个高度,他会变成手机屏幕分辨率的高度Nexus 5X是1920

但是webview没那么高。所以我首先获取了这个webview原始的高度,等软键盘弹回来的时候,设置会webview原始的高度即可。

设置变量用来存储webview的初始高度
private int initheight;

因为初始化我获得的webview的高度为0,所以我直接把下面这段代码仍在监听方法里面
int tempheight=mChildOfContent.getHeight();
if(initheight<tempheight)
{
initheight=tempheight;
}
因为初始化的时候initheight为0,所以一开始监听,mChildOfContent.getHeight();所获得的就是webview的高,设置之后,在软键盘回收的代码中替换为
//frameLayoutParams.height = usableHeightSansKeyboard;
frameLayoutParams.height = initheight;

就大功告成了
修改后的AndroidBug5497Workaround

public class AndroidBug5497Workaround {
    public static void assistActivity(Activity activity) {
        new AndroidBug5497Workaround(activity);
    }

    private View mChildOfContent;
    private int usableHeightPrevious;
    private FrameLayout.LayoutParams frameLayoutParams;

    private int initheight;

    private AndroidBug5497Workaround(Activity activity) {
        FrameLayout content = (FrameLayout) activity.findViewById(android.R.id.content);
        mChildOfContent = content.getChildAt(0);
        mChildOfContent.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            public void onGlobalLayout() {
                possiblyResizeChildOfContent();
            }
        });
        frameLayoutParams = (FrameLayout.LayoutParams) mChildOfContent.getLayoutParams();


    }

    private void possiblyResizeChildOfContent() {
        int tempheight=mChildOfContent.getHeight();
        if(initheight<tempheight)
        {
            initheight=tempheight;
        }

        int usableHeightNow = computeUsableHeight();
        if (usableHeightNow != usableHeightPrevious) {

            int usableHeightSansKeyboard = mChildOfContent.getRootView().getHeight();
            int heightDifference = usableHeightSansKeyboard - usableHeightNow;
            if (heightDifference > (usableHeightSansKeyboard/4 )) {

                frameLayoutParams.height = usableHeightSansKeyboard - heightDifference;
            } else {
                frameLayoutParams.height = initheight;
            }
            mChildOfContent.requestLayout();
            usableHeightPrevious = usableHeightNow;
        }
    }

    private int computeUsableHeight() {
        Rect r = new Rect();
        mChildOfContent.getWindowVisibleDisplayFrame(r);
        return (r.bottom-r.top);
    }

}
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
					<link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-7f770a53f2.css" rel="stylesheet">
            </div>

转自:https://blog.csdn.net/tlxfif/article/details/77977471

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值