OnGlobalLayoutListener: depreciación y compatibilidad
Tengo que usar un objeto de OnGlobalLayoutListener
y después quitar el oyente, tuve un problema con los métodos obsoletos que resuelvo con el código siguiente.
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); }
¿Es correcto? Hay una mejor manera de manejar la compatibilidad?
- ¿Cada dispositivo Android contiene todas las versiones anteriores de SDK?
- ButtonStyle no funciona para 22.1.1
- No obtener onActivityResult () de una subclase ActionBarActivity
- Android: Tono con DrawableCompat
- No se puede agregar el paquete de compatibilidad al proyecto android
Ejecutar el código en el emulador con API 10 Tengo la siguiente advertencia en 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
¿Puedo ignorarlos de que tengo que arreglar de alguna manera?
- La aplicación de Android no se puede poner en la tienda de Amazon?
- ¿La aplicación no es compatible con el dispositivo que utilizo para desarrollarlo?
- Aplicación de Android compatible con 0 dispositivos
- ¿Cuál es el equivalente de getCheckedItemCount () para el nivel API <11?
- ¿Cómo puedo usar el mismo conjunto de pantallas de preferencias para todas las versiones de Android de 2.X a 4.X?
- ¿Cómo saber dónde se almacenan las imágenes en la tarjeta SD, DCIM / Camera, DCIM / 100MEDIA?
- Opcionalmente, utilizando la nueva API en Android
- XmlPullParserException: vector de etiqueta desplegable no válido
Estoy usando esto en mi proyecto:
@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); } }
Se parece a la suya. Probado en diferentes dispositivos (4.2.2 y 2.3.3) y funciona perfectamente. Parece que es la única manera … Si encuentras algo más me gustaría saberlo. buena suerte
Creo que la forma correcta es usar Build.VERSION.SDK_INT
y Build.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); } }
Por supuesto que comprobar la versión de Android y llamar al método correcto es mucho más prudente, pero si echa un vistazo en el código fuente de Android se puede ver algo interesante:
@Deprecated public void removeGlobalOnLayoutListener(OnGlobalLayoutListener victim) { removeOnGlobalLayoutListener(victim); }
Este código fue cortado de la API 18
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 // } });
Según los documentos :
Este método fue obsoleto en el nivel 16 de la API. Utilice #removeOnGlobalLayoutListener en su lugar
Funciona de maravilla.
- Cómo programar el MAC de un dispositivo Android
- ¿Puedo usar el mismo id en diferentes diseños en Android?