我們都知道,在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()大於某個給定值來確定效果。
