Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

OnGlobalLayoutListener: deprecation and compatibility

I have to use an OnGlobalLayoutListener object and then to remove the listener, I had a problem with deprecated methods that I resolve with following code.

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

Is it correct? There is a better way to handle compatibility?

Running the code in emulator with API 10 I have the following warning in 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 

Can I ignore them of I have to fix in some way?

like image 587
crbin1 Avatar asked Apr 24 '13 10:04

crbin1


1 Answers

I'm using this in my project:

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

looks similar to yours. Tested on different devices (4.2.2 & 2.3.3) and it run perfectly. seems like it's the only way....If you find anything else I would like to know it. good luck

2020 EDIT This approach is very very obsolete. I hope you moved your code to Kotlin. Now we can use doOnPreDraw function when using ktx library. https://developer.android.com/reference/kotlin/androidx/core/view/package-summary#(android.view.View).doOnPreDraw(kotlin.Function1)

like image 128
Udi Oshi Avatar answered Sep 23 '22 09:09

Udi Oshi