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 View.bringToFront () causa parpadeo
  • A veces listView.getChildAt (int index) devuelve NULL (Android)
  • SetPivotX funciona extraño en la vista escalada
  • ¿Hay una manera de desplazarse mediante programación una vista de desplazamiento a un texto de edición específico?
  • Ocultar vista de grupo en Lista expandible
  • Cómo aplicar un filtro de color a una vista con todos los niños
  • archivo interno del HTML de la demostración del androide
  • Android View.OnKeyListener: haga clic una vez, ejecute dos veces
  • Vista de visualización en la parte superior de la barra de acción
  • Poner cualquier vista sobre un VideoView en Android
  • Android 4.1 webview javascript no funciona.
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.