¿Cómo llevar la vista al frente de todo?

Tengo actividad y una gran cantidad de widgets en ella, algunos de ellos tienen animaciones y debido a las animaciones algunos de los widgets se mueven (traducir) uno sobre otro. Por ejemplo, la vista de texto se mueve sobre algunos botones. . .

Ahora lo que quiero es que los botones estén siempre en la parte delantera. Y cuando la vista de texto se mueve, quiero moverme detrás de los botones.

No puedo lograr esto He intentado todo lo que sé, y "bringToFront ()" definitelly no funciona.

Note No quiero controlar el orden z por el orden de colocar el elemento en el diseño porque simplemente no puedo :), el diseño es complejo y no puedo colocar todos los botones en la mendicidad del diseño

Puedes llamar a bringToFront () en la vista que quieras obtener en el frente

Esto es un ejemplo:

  yourView.bringToFront(); 

bringToFront() es la forma correcta, pero, NOTE que debe llamar a bringToFront() y invalidate() en la vista de nivel más alto (bajo su vista de raíz), por ejemplo:

La jerarquía de su vista es:

 -RelativeLayout |--LinearLayout1 |------Button1 |------Button2 |------Button3 |--ImageView |--LinearLayout2 |------Button4 |------Button5 |------Button6 

Por lo tanto, cuando usted anima de nuevo sus botones (1-> 6), sus botones debajo (debajo) del ImageView . Para llevarlo encima (encima) al ImageView debes llamar al bringToFront() e invalidate() en tu LinearLayout . Entonces funcionará 🙂 ** NOTA: Recuerde fijar android:clipChildren="false" para su disposición de la raíz o gradparent_layout de la vista animada. Echemos un vistazo a mi código real:

.xml

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:hw="http://schemas.android.com/apk/res-auto" android:id="@+id/layout_parent" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/common_theme_color" android:orientation="vertical" > <com.binh.helloworld.customviews.HWActionBar android:id="@+id/action_bar" android:layout_width="match_parent" android:layout_height="@dimen/dimen_actionbar_height" android:layout_alignParentTop="true" hw:titleText="@string/app_name" > </com.binh.helloworld.customviews.HWActionBar> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@id/action_bar" android:clipChildren="false" > <LinearLayout android:id="@+id/layout_top" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:gravity="center_horizontal" android:orientation="horizontal" > </LinearLayout> <ImageView android:id="@+id/imgv_main" android:layout_width="@dimen/common_imgv_height" android:layout_height="@dimen/common_imgv_height" android:layout_centerInParent="true" android:contentDescription="@string/app_name" android:src="@drawable/ic_launcher" /> <LinearLayout android:id="@+id/layout_bottom" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:gravity="center_horizontal" android:orientation="horizontal" > </LinearLayout> </RelativeLayout> </RelativeLayout> 

Algún código en .java

 private LinearLayout layoutTop, layoutBottom; ... layoutTop = (LinearLayout) rootView.findViewById(R.id.layout_top); layoutBottom = (LinearLayout) rootView.findViewById(R.id.layout_bottom); ... //when animate back //dragedView is my layoutTop's child view (i added programmatically) (like buttons in above example) dragedView.setVisibility(View.GONE); layoutTop.bringToFront(); layoutTop.invalidate(); dragedView.startAnimation(animation); // TranslateAnimation dragedView.setVisibility(View.VISIBLE); 

¡Gluck!

He estado buscando a través de desbordamiento de pila para encontrar una buena respuesta y cuando no pude encontrar uno me fui buscando a través de los documentos.

Nadie parece haber tropezado con esta simple respuesta todavía:

 ViewCompat.setTranslationZ(view, translationZ); 

La traducción por defecto z es 0.0

Trate FrameLayout , que le da la posibilidad de poner puntos de vista uno sobre otro. Puede crear dos LinearLayouts : uno con las vistas de fondo y otro con vistas de primer plano, y combinarlas utilizando FrameLayout . Espero que esto ayude.

Necesitas usar framelayout. Y la mejor manera de hacer esto es hacer la vista invisible cuando no se requieren. También necesitas fijar la posición para cada vista, de modo que se muevan según allí posición correspondiente

Puede haber otra manera de salvar el día. Sólo init un nuevo cuadro de diálogo con el diseño deseado y sólo muéstrelo. Lo necesito para mostrar un loadingView sobre un DialogFragment y ésta era la única manera que consigo.

 Dialog topDialog = new Dialog(this, android.R.style.Theme_Translucent_NoTitleBar); topDialog.setContentView(R.layout.dialog_top); topDialog.show(); 

BringToFront () puede no funcionar en algunos casos como el mío. Pero el contenido del diseño de dialog_top debe reemplazar cualquier elemento de la capa ui. Pero de todos modos, esto es una solución fea.

Una solución aún más simple es editar el XML de la actividad. Utilizar

 android:translationZ="" 

He enfrentado el mismo problema. La siguiente solución ha funcionado para mí.

  FrameLayout glFrame=(FrameLayout) findViewById(R.id.animatedView); glFrame.addView(yourView); glFrame.bringToFront(); glFrame.invalidate(); 

Si está usando un LinearLayout , debe llamar a myView.bringToFront() y después debe llamar a parentView.requestLayout() y parentView.invalidate() para obligar al padre a volver a dibujar con el nuevo orden hijo.

Puede establecer la visibilidad como falsa de otras vistas.

 view1.setVisibility(View.GONE); view2.setVisibility(View.GONE); ... 

o

 view1.setVisibility(View.INVISIBLE); view2.setVisibility(View.INVISIBLE); ... 

y establecer

 viewN.setVisibility(View.VISIBLE); 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.