首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >OnGlobalLayoutListener:弃用和兼容性

OnGlobalLayoutListener:弃用和兼容性
EN

Stack Overflow用户
提问于 2013-04-24 18:23:14
回答 3查看 45.8K关注 0票数 75

我必须使用OnGlobalLayoutListener对象,然后删除侦听器,我遇到了一个问题,我用下面的代码解决了不推荐使用的方法。

代码语言:javascript
复制
protected void onCreate(Bundle savedInstanceState) {
    final LinearLayout llTotal = (LinearLayout) findViewById(R.id.mmc_ll);
    ViewTreeObserver vto = llTotal.getViewTreeObserver();
    if(vto.isAlive()){
        vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                //
                // mycode
                //
                if (Build.VERSION.SDK_INT<16) {
                    removeLayoutListenerPre16(llTotal.getViewTreeObserver(),this);
                } else {
                    removeLayoutListenerPost16(llTotal.getViewTreeObserver(), this);
                }
            } 
        });
    }
    super.onCreate(savedInstanceState);
}

@SuppressWarnings("deprecation")
private void removeLayoutListenerPre16(ViewTreeObserver observer, OnGlobalLayoutListener listener){
    observer.removeGlobalOnLayoutListener(listener);
}

@TargetApi(16)
private void removeLayoutListenerPost16(ViewTreeObserver observer, OnGlobalLayoutListener listener){
    observer.removeOnGlobalLayoutListener(listener);
}

这是正确的吗?有没有更好的方法来处理兼容性?

在使用API10的仿真器中运行代码时,在LogCat中出现以下警告

代码语言:javascript
复制
04-24 09:30:12.565: I/dalvikvm(471): Could not find method android.view.ViewTreeObserver.removeOnGlobalLayoutListener, referenced from method com.my.project.ActivityHome.removeLayoutListenerPost16
04-24 09:30:12.565: W/dalvikvm(471): VFY: unable to resolve virtual method 2950: Landroid/view/ViewTreeObserver;.removeOnGlobalLayoutListener (Landroid/view/ViewTreeObserver$OnGlobalLayoutListener;)V

我可以忽略它们吗,或者我必须以某种方式修复它们?

EN

回答 3

Stack Overflow用户

发布于 2014-05-19 23:20:45

我认为正确的方法是使用Build.VERSION.SDK_INTBuild.VERSION_CODES

代码语言:javascript
复制
public static void removeOnGlobalLayoutListener(View v, ViewTreeObserver.OnGlobalLayoutListener listener){
        if(Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
                v.getViewTreeObserver().removeGlobalOnLayoutListener(listener);
            } else {
                v.getViewTreeObserver().removeOnGlobalLayoutListener(listener);
            }
}
票数 39
EN

Stack Overflow用户

发布于 2016-12-01 14:32:37

代码语言:javascript
复制
    mView.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                mView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
            } else {
                //noinspection deprecation
                mView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
            }
            //
            // mycode
            //
        } 
    });
票数 10
EN

Stack Overflow用户

发布于 2013-10-07 09:54:25

当然,检查Android版本并调用正确的方法要谨慎得多,但如果您查看Android源代码,您会发现一些有趣的东西:

代码语言:javascript
复制
 @Deprecated
    public void removeGlobalOnLayoutListener(OnGlobalLayoutListener victim) {
        removeOnGlobalLayoutListener(victim);
    }

此代码是从API 18中截取的

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16189525

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档