webview设置paddingbottom无效,通过js给android控件WebView设padding

本文介绍了一种解决Android WebView底部被遮挡的问题的方法。通过加载JavaScript代码为网页添加底部填充,确保底部UI元素可见且可交互。文章还讨论了不同方法的优缺点,并提供了具体的实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目中有个界面是用来显示一个网页的,很简单,放个WebView就ok了,可是返回按钮放在哪 ,ui的设计是在底部显示一个半透明的条,左边有一个返回按钮。这个条显示在内容上面。我有一个担心,就是要是最下面的内容需要操作的,虽然看的见,但不能操作。开始很自然就想到设padding,可是android的WebView有个bug,设了没有用。

之后想了很多的办法,通过判断WebView滑动到底了,再自己做动画,可是效果不是太好

if(Utils.dip2px(this,mWvContent.getContentHeight()) - mWvContent.getHeight() - mWvContent.getScaleY()== 0 ){}

这个判断条件有点点问题,有时候,他到底了,可是不等于0,这个可以加点幅度。然后就是一开始我也是在网上找了些判断,他们是直接用的getContentHeight(),实际使用中我发现在这个返回的是dp,我们需要转成px。

我还想着重写WebView,能力不怎么样,只能想到重新测量高度,在OnDraw()方法里画点底部的空白,可是都没有能实现。

达不到效果,于是我不甘心的继续在网上搜了下WebView 设 Padding,发现在个大神的:http://blog.youkuaiyun.com/janronehoo/article/details/45100551

我有想过通过js去改网页,可是我js不怎么得,不会啊!当我看到标题时,高兴的不行,最重要的是,问题解决了。谢谢大神

大神的代码:

webView.setWebViewClient(new WebViewClient() {
    @Override
    public void onPageFinished(WebView view, String url) {
        webView.loadUrl("javascript:document.body.style.padding=\"8%\"; void 0");
    }
});

和我想的效果差一点点,我就试着改了改,试过padding-bottom不行,paddingBottom可以,反正不懂,也就没有细究,实现就行,然后就是怎么设固定高度,而不是百分比。

mWvContent.loadUrl("javascript:document.body.style.paddingBottom=\"" + Utils.px2dip(this, mTvBack.getHeight()) + "px\"; void 0");

需要注意的是,执行js需要在page load 结束之后,大神代码中的onPageFinished()方法,有时候一些网页是不会调用的,所以还需要一些其他的,比如onReceivedSslError()方法,这也是在一些大神那看到的,感谢n多大神的分享。

http://www.cnblogs.com/accumulate-gogogo/p/5593563.html

package com.example.newviewapplication; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.util.AttributeSet; import android.view.View; import android.view.ViewGroup; import androidx.annotation.NonNull; import androidx.annotation.Nullable; public class CustomView extends View { private Paint mPainter; public CustomView(Context context) { super(context); init(); } public CustomView(Context context, @Nullable AttributeSet attrs) { this(context, attrs,0); init(); } public CustomView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); TypedArray t = context.obtainStyledAttributes(attrs,R.styleable.CustomView); int mColor = t.getColor(R.styleable.CustomView_circle_color,Color.BLUE); t.recycle(); mPainter.setColor(mColor); init(); } public CustomView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); } private void init(){ mPainter = new Paint(); mPainter.setColor(Color.RED); mPainter.setStrokeWidth(5f); mPainter.setStyle(Paint.Style.FILL); } @Override protected void onDraw(@NonNull Canvas canvas) { super.onDraw(canvas); //padding生效 // 获取传入的padding值 final int paddingLeft = getPaddingLeft(); final int paddingRight = getPaddingRight(); final int paddingTop = getPaddingTop(); final int paddingBottom = getPaddingBottom(); // 获取绘制内容的高度和宽度(考虑了四个方向的padding值) int width = getWidth() - paddingLeft - paddingRight ; int height = getHeight() - paddingTop - paddingBottom ; // 设置圆的半径 = 宽,高最小值的2分之1 int r = Math.min(width, height)/2; // 画出圆(蓝色) // 圆心 = 控件的中央,半径 = 宽,高最小值的2分之1 canvas.drawCircle(paddingLeft+width/2,paddingTop+height/2,r,mPainter); } //wrap_content生效 @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); // 获取宽-测量规则的模式和大小 int widthMode = MeasureSpec.getMode(widthMeasureSpec); int widthSize = MeasureSpec.getSize(widthMeasureSpec); // 获取高-测量规则的模式和大小 int heightMode = MeasureSpec.getMode(heightMeasureSpec); int heightSize = MeasureSpec.getSize(heightMeasureSpec); // 设置wrap_content的默认宽 / 高值 // 默认宽/高的定并无固定依据,根据需要灵活设置 // 类似TextView,ImageView等针对wrap_content均在onMeasure()对设置默认宽 / 高值有特殊处理,具体读者可以自行查看 int mWidth = 400; int mHeight = 400; // 当布局参数设置为wrap_content时,设置默认值 if (getLayoutParams().width == ViewGroup.LayoutParams.WRAP_CONTENT && getLayoutParams().height == ViewGroup.LayoutParams.WRAP_CONTENT) { setMeasuredDimension(mWidth, mHeight); // 宽 / 高任意一个布局参数为= wrap_content时,都设置默认值 } else if (getLayoutParams().width == ViewGroup.LayoutParams.WRAP_CONTENT) { setMeasuredDimension(mWidth, heightSize); } else if (getLayoutParams().height == ViewGroup.LayoutParams.WRAP_CONTENT) { setMeasuredDimension(widthSize, mHeight); } } } 代码报错:FATAL EXCEPTION: main Process: com.example.newviewapplication, PID: 15829 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.newviewapplication/com.example.newviewapplication.MainActivity}: android.view.InflateException: Binary XML file line #15 in com.example.newviewapplication:layout/activity_main: Binary XML file line #15 in com.example.newviewapplication:layout/activity_main: Error inflating class com.example.newviewapplication.CustomView
最新发布
07-29
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值