您的位置:首页 > 移动开发

如何监听WebView显示事件

2015-09-01 19:06 453 查看
我们都知道,在WebView的应用中,可以使用WebViewClient监听WebView的内容【加载】事件,比如onPageFinished、onPageStarted等。但是即使onPageFinished触发时,WebView的内容也并未显示。当我们想要监听WebView的内容显示事件的时候怎么办呢?

我先是找到了网上有答案说用
PictureListener,然后重写
onNewPicture
方法(链接在此)。但是官方文档写的很清楚,这个类已经废弃了(链接在此)。


于是必须用新的方法。还有人建议用重写WebView中的
invalidate()
方法,然后在其中判断
getContentHeight() > 0
以确定内容已经显示出来了(链接在此)。这个方法与重写onDraw()方法是类似的。需要在WebView中定义一个监听接口,比如OnLoadFinishListener,在使用时重写其onLoadFinish()方法就可以了。例如:

public class ArticleWebView extends WebView{

private OnLoadFinishListener mOnLoadFinishListener;

public interface OnLoadFinishListener{
public void onLoadFinish();
}

private boolean isRendered = false;

public ArticleWebView(Context context) {
super(context);
init();
}

public ArticleWebView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}

public ArticleWebView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}

private void init(){
}

@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if(!isRendered){
DebugLog.log("ArticleWebView", "getContentHeight():"+getContentHeight());
isRendered = getContentHeight() > 0;
if(mOnLoadFinishListener!= null){
mOnLoadFinishListener.onLoadFinish();
}
}
}

public void setOnLoadFinishListener(OnLoadFinishListener onLoadFinishListener){
this.mOnLoadFinishListener = onLoadFinishListener;
}
}


需要注意的是,onDraw方法在绘制过程中会被多次调用,每次调用时,WebView中绘制出的内容的高度可能是不同的。如果只判断getContentHeight() > 0,高度很小时,可能仍然得不到理想效果。可以通过判断getContentHeight()大于某个给定值来确定效果。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: