¿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.
- ¿Justificar texto en una aplicación de Android utilizando un WebView pero presentando una interfaz similar a TextView?
- Cómo insertar texto en textview en android
- Cómo establecer texto en un EditarTexto
- Cómo establecer el ancho de la ventana de texto wrap_content pero limitar a 1/3 del ancho de los padres
- Android y la velocidad de desplazamiento de la marquesina horizontal de TextView
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
- Fórmula química en Android
- mostrar texto en diálogo de alerta
- Tener un problema al eliminar TextViews de un LinearLayout mediante programación
- Cómo cambiar TextView texto en DataChange sin llamada atrás TextWatcher Listener
- Agregar una vista de texto a un FrameLayout en una posición determinada
- TextView no se adhiere a la parte superior derecha
- Android: última línea de texto cortada
- Android- Ajusta el ancho de un TextView a la izquierda de cualquier botón-1 o botón-2
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);
- Cómo grabar vídeo desde el fondo de la aplicación: Android
- "No se pudo resolver el recurso" en la vista previa de Android Studio