淺談安卓界面加載完成的回調

1.view.post(Runnable r) – 在子線程調用,必須在該view處於attached狀態下才能保證執行,onResume()調用完成之後,回調View的onAttachToWindow()之前attach。

2.我們知道在oncreate中View.getWidth和View.getHeight無法獲得一個view的高度和寬度,這是因爲View組件佈局要在onResume回調後完成。所以現在需要使用getViewTreeObserver().addOnGlobalLayoutListener()來獲得寬度或者高度。這是獲得一個view的寬度和高度的方法之一。

OnGlobalLayoutListener 是ViewTreeObserver的內部類,當一個視圖樹的佈局發生改變時,可以被ViewTreeObserver監聽到,這是一個註冊監聽視圖樹的觀察者(observer),在視圖樹的全局事件改變時得到通知。ViewTreeObserver不能直接實例化,而是通過getViewTreeObserver()獲得。

除了OnGlobalLayoutListener ,ViewTreeObserver還有如下內部類:

interface ViewTreeObserver.OnGlobalFocusChangeListener
當在一個視圖樹中的焦點狀態發生改變時,所要調用的回調函數的接口類
interface ViewTreeObserver.OnGlobalLayoutListener
當在一個視圖樹中全局佈局發生改變或者視圖樹中的某個視圖的可視狀態發生改變時,所要調用的回調函數的接口類
interface ViewTreeObserver.OnPreDrawListener
當一個視圖樹將要繪製時,所要調用的回調函數的接口類
interface ViewTreeObserver.OnScrollChangedListener
當一個視圖樹中的一些組件發生滾動時,所要調用的回調函數的接口類
interface ViewTreeObserver.OnTouchModeChangeListener
當一個視圖樹的觸摸模式發生改變時,所要調用的回調函數的接口類
其中,我們可以利用OnGlobalLayoutListener來獲得一個視圖的真實高度。
但是需要注意的是OnGlobalLayoutListener可能會被多次觸發,因此在得到了高度之後,要將OnGlobalLayoutListener註銷掉。

  1. @Override
    public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    if (hasFocus) {
    if (isFirstLaunch) {
    isFirstLaunch = false;
    // TODO 第一次啓動界面加載完畢後的操作
    }
    if (isResume) {
    isResume = false;
    // TODO 每一次從後臺打開後界面加載完畢後的操作
    }
    }
    }
    上述代碼是界面加載完畢後的回調,此後才能用view去show pop,否則就會報錯 在oncreate和resume中都是不行的,另外一點關閉pop之後還是會執行這個函數,故在需要設置標誌位
    在這裏插入圖片描述

4.web.setWebViewClient(new WebViewClient()
{
@Override
public void onPageFinished(WebView view,String url)
{
dialog.dismiss();
}
});

這個代碼不知道能不能判別WebView加載完畢,onprogressChanged也不一定,下面的方法沒試
public class MyWebView extends WebView{
interface DisplayFinish{
void After();
}
DisplayFinish df;
public void setDf(DisplayFinish df) {
this.df = df;
}
public MyWebView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyWebView(Context context) {
super(context);
}
//onDraw表示顯示完畢
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
df.After();
}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章