¿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.
- Ellipsize sólo una sección en un TextView
- Cómo eliminar la fila de la tabla en el diseño de la tabla en android
- Detectar si TextView en ListView está ellipsizado
- Destacando el color del texto usando Html.fromHtml () en Android?
- Cómo agregar borde a un texto en textview android
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
- Alternativa a ReplacementSpan en Android
- Tamaño de fuente a grande para caber en caché para Emoji en Kitkat solamente
- Android TextView: ¿hay una manera de forzar la animación de la marquesina con texto corto?
- Nuevo carácter de línea \ n no se muestra correctamente en textView Android
- Dibujar contenido de TextView actual en Bitmap
- Cómo configurar la fuente personalizada para palabra en un texto TextView
- Puedo cambiar el aspecto y la sensación de la clickablespan
- Android: agrega texto a la presentación al pulsar el botón
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