Cómo traer una vista al frente sin llamar bringToFront ()?

Aparentemente hay un error en Android que rompe View.bringToFront .

Si tengo vistas organizadas en un GridView y quiero llevar una vista al frente llamando a bringToFront (), puede moverse a la posición inferior derecha en el GridView.

Algo sombrío está pasando allí, así que no puedo usar bringToFront (). Cuando no lo llamo, todo funciona bien. Pero las vistas se superponen – si utilizo la animación de escala para ampliar una vista, es parcialmente oscurecida por las vistas en la parte inferior y derecha.

He comprobado la fuente de bringToFront y llama a parent.bringChildToFront (…)

Es este método

 public void bringChildToFront(View child) { int index = indexOfChild(child); if (index >= 0) { removeFromArray(index); addInArray(child, mChildrenCount); child.mParent = this; } } 

Aparentemente elimina la vista de sí mismo! ¡Sin piedad! ¿Es un ViewGroup tan tonto que no puede manejar los índices Z de ninguna otra manera que los controles de barajar alrededor? Obviamente, cuando GridView elimina a su hijo y luego lo añade de nuevo, se coloca al final de la cuadrícula!

¿Hay algo que pueda hacer para mostrar una vista encima de otros sin recurrir a algún hacking? Una cosa que me viene a la mente es crear otra vista por encima de GridView, que aparecerá por encima de la que estoy tratando de bringToFront (), pero no me gusta esta solución.

Aparentemente perdí la android:clipChildren="false" en GridView. Resuelve mi problema.

¿Has intentado hacer que la View pueda enfocar y simplemente llamar a requestFocus ()?

Llamar bringToFront () cambia el orden en GridView. Intente crear un ImageView con una imagen de la vista que desee animar y animar en su lugar.

 Bitmap bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); view.draw(canvas); final ImageView imageView = new ImageView(getActivity()); imageView.setImageBitmap(bitmap); ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(view.getWidth() , view.getHeight()); imageView.setLayoutParams(params); rootview.addView(imageView); 

Agregue un oyente de animación a su animación y quite el ImageView al final de la animación.

Desde la API 21 puede llamar a:

 view.setZ(float) 

Si apuntas a la API por encima de 21, simplemente puedes añadir el atributo android:translationZ="xxx dp" a tu XML.

Tenga en cuenta que si agrega elevación en vistas como cardview, se pasa al eje Z. Y si quieres una vista venir a primer plano utilizando esta manera, sólo tienes que hacerlo más alto que la elevación que estableció.

Ejemplo: 6 dp elevación en cardview requerirá un 7dp en el atributo translationZ de la vista que desea en primer plano.

  • Diferencia entre el relleno y el margen de una vista
  • Android: Tutorial sobre la creación de vistas personalizadas
  • Android ScrollView Vs ListView
  • Android scrollview no se llena la vista de los padres
  • ¿Cómo puedo cerrar un SearchView mediante programación?
  • OnMeasure (): wrap_content, ¿cómo puedo saber el tamaño para envolver?
  • Cómo obtener la entrada de searchview a textview
  • Gestionar el enfoque en una vista personalizada
  • ¿Cómo enviar la vista hacia atrás? ¿Cómo controlar la orden z de forma programática?
  • Android DataBinding dónde obtener el contexto?
  • ¿Cómo ImageView acaba de redibujar parte de su contenido cuando se invoca invalidate (Rect)?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.