浅谈安卓界面加载完成的回调

时间:2024-03-23 19:34:30

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();
}
}