OnGlobalLayoutListener:弃用和兼容性

crb*_*in1 72 compatibility android deprecated

我必须使用一个OnGlobalLayoutListener对象,然后删除监听器,我有一个问题与我用以下代码解决的弃用方法.

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);
}
Run Code Online (Sandbox Code Playgroud)

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

使用API​​ 10在模拟器中运行代码我在LogCat中有以下警告

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
Run Code Online (Sandbox Code Playgroud)

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

Udi*_*shi 137

我在我的项目中使用它:

@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
public static void removeOnGlobalLayoutListener(View v, ViewTreeObserver.OnGlobalLayoutListener listener){
    if (Build.VERSION.SDK_INT < 16) {
        v.getViewTreeObserver().removeGlobalOnLayoutListener(listener);
    } else {
        v.getViewTreeObserver().removeOnGlobalLayoutListener(listener);
    }
}
Run Code Online (Sandbox Code Playgroud)

看起来和你的相似.在不同的设备上测试(4.2.2和2.3.3),它运行得很好.似乎这是唯一的方式....如果你发现了别的什么我想知道它.祝好运

  • @ crbin1你可以在函数声明之前添加@TargetApi(Build.VERSION_CODES.JELLY_BEAN),如果你想避免看到这个警告/错误. (9认同)
  • 谷歌,这太可怕了. (7认同)

Jor*_*sys 38

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

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);
            }
}
Run Code Online (Sandbox Code Playgroud)


小智 10

    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
            //
        } 
    });
Run Code Online (Sandbox Code Playgroud)


Gil*_*ian 9

当然,检查Android版本并调用正确的方法要谨慎得多,但是如果你看看Android源代码,你可以看到一些有趣的东西:

 @Deprecated
    public void removeGlobalOnLayoutListener(OnGlobalLayoutListener victim) {
        removeOnGlobalLayoutListener(victim);
    }
Run Code Online (Sandbox Code Playgroud)

这段代码是从API 18中删除的


Bas*_*ssa 6

根据文档

此方法在 API 级别 16 中已弃用。请改用 #removeOnGlobalLayoutListener

奇迹般有效。