如何監聽WebView顯示事件

        咱們都知道,在WebView的應用中,可使用WebViewClient監聽WebView的內容【加載】事件,好比onPageFinished、onPageStarted等。可是即便onPageFinished觸發時,WebView的內容也並未顯示。當咱們想要監聽WebView的內容顯示事件的時候怎麼辦呢?html

        我先是找到了網上有答案說用PictureListener,而後重寫onNewPicture方法(連接在此)。可是官方文檔寫的很清楚,這個類已經廢棄了(連接在此)。java

        因而必須用新的方法。還有人建議用重寫WebView中的invalidate()方法,而後在其中判斷getContentHeight() > 0 以肯定內容已經顯示出來了(連接在此)。這個方法與重寫onDraw()方法是相似的。須要在WebView中定義一個監聽接口,好比OnLoadFinishListener,在使用時重寫其onLoadFinish()方法就能夠了。例如:android

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()大於某個給定值來肯定效果。web

相關文章
相關標籤/搜索