RemoveView no funciona después de LayoutInflater.inflate (resource, root, true)

Agregar y quitar una vista dinámicamente a una vista personalizada (FrameLayout) haciendo esto:

LayoutInflater inflater = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); mMyView = inflater.inflate(resId, this, true); 

Más adelante intento quitar la vista pero la vista no quitará:

 removeView(mMyView); 

Si hago esto en su lugar todo funciona como se esperaba:

 mMyView = inflater.inflate(resId, this, **false**); addView(mMyView); 

La única diferencia es que añado manualmente la vista en lugar de dejar que la llamada inflar lo haga. ¿Alguien sabe por qué esto haría la diferencia?

4 Solutions collect form web for “RemoveView no funciona después de LayoutInflater.inflate (resource, root, true)”

La respuesta está en esta llamada

 mMyView = inflater.inflate(resId, this, true); 

La documentación establece:

Devuelve La vista raíz de la jerarquía inflada. Si root fue suministrado y attachToRoot es true, esto es root; de lo contrario, es la raíz del archivo XML inflado.

http://developer.android.com/reference/android/view/LayoutInflater.html#inflate(int, android.view.ViewGroup, boolean)

Estaba asumiendo que la llamada inflada devuelve siempre la raíz del diseño inflado (definida por resId), pero si se proporciona el parámetro raíz y attachToRoot es true, entonces es la raíz del diseño al que se agregó el diseño inflado (es la nueva vista principal) y que es raíz (en este caso raíz == este).

Así que mientras

 mMyView = inflater.inflate(resId, this, false); 

asigna la vista a mMyView que queremos eliminar más adelante

 mMyView = inflater.inflate(resId, this, true); 

asigna al padre de esa vista. La llamada removeView (mMyView) es realmente idéntica a removeView (this) y que obviamente no hace nada.

Este comportamiento es IMO muy contra-intuitivo y propenso a errores. ¿Por qué debería devolver el diseño raíz en lugar del diseño inflado cuando ya tenemos ese diseño raíz con el parámetro raíz mientras no tenemos una referencia al diseño inflado todavía?

En mi experiencia, depende de dónde creas tu referencia a la vista de padres que pasas a inflar (…) la llamada. He estado en su situación y (aunque no debería fallar, a veces si no lo llamamos desde el lugar correcto) He demostrado que es mucho mejor al crear una vista personalizada en código, para establecer el LayoutParams programatically también. De la documentación se puede deducir que el ViewGroup principal se utiliza principalmente para obtener los parámetros de diseño. Por esta razón, después de inflar (con 'falso'), puede crear su propio FrameLayout.LayoutParams, proporcionar la vista inflada con ellos y, a continuación, agregar la vista a los padres. Puede intentar también en lugar de eliminar la vista directamente de su diseño personalizado, llamando a View.getParent (), arrojándola a su FrameLayout personalizado y, a continuación, llamando a removeView (…) del resultado encadenado.

  ((MyCustomFrameLayout)mMyView.getParent()).removeView(mMyView); 

Para fines de depuración (cuando utiliza 'true'), puede comprobar si el padre resultante de la vista inflada (y el propio niño) son los mismos que se pasan a las llamadas originales. Tal vez se están cambiando (o se pierde la referencia) en algún momento del código.

Espero que funcione para ti.

Si está utilizando la vista de lista, ha intentado invalidarla después de eliminarla.

 ListView.invalidate() 

Parece que en versiones más recientes de Android, las transiciones de diseño pueden retrasar la eliminación de vistas, ya sea retrasar la llamada a addView() o utilizar parent.setLayoutTransition(null) .

  • Android: aplica una transformación arbitraria a una vista
  • WebViewClient no se puede resolver con un tipo
  • Empuje el contenido excepto alguna vista cuando se muestra el teclado
  • ¿Puedo ejecutar JavaScript sin un WebView, o un WebView puede ejecutarse sin un contexto de actividad, como en un servicio?
  • ¿Por qué onTouchEvent de SurfaceView llamado unos segundos retrasados?
  • Cómo obtener la altura de la vista dentro del adaptador para crear bitmap de tamaño?
  • Ver los valores devueltos getHeight () y getWidth () demasiado grandes
  • Cómo cambiar el tamaño de la imagen al pulsar
  • ¿Cómo usar correctamente setZOrderMediaOverlay en Android?
  • Cómo convertir linearlayout a imagen
  • Cómo cambiar el color del divisor hijo de ExpanableListView por el archivo xml de diseño?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.