android - programacion - ¿Cómo llevar la vista al frente de todo?
manual de programacion android pdf (11)
Tengo actividad y muchos widgets, algunos tienen animaciones y debido a las animaciones algunos de los widgets se están moviendo (traduciendo) uno sobre otro. Por ejemplo, la vista de texto se mueve sobre algunos botones. . .
Ahora el asunto es que quiero que los botones siempre estén en el frente. Y cuando la vista de texto se está moviendo, quiero moverme detrás de los botones.
No puedo lograr esto Probé todo lo que sé, y "bringToFront ()" Definely no funciona.
note que 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 al inicio del diseño
He estado buscando a través del desbordamiento de pila para encontrar una buena respuesta y cuando no pude encontrar una, revisé los documentos.
nadie parece haber tropezado con esta simple respuesta todavía:
ViewCompat.setTranslationZ(view, translationZ);
la traducción predeterminada z es 0.0
Necesitas usar framelayout. Y la mejor manera de hacerlo es hacer que la vista sea invisible cuando no se requiera. También necesita establecer la posición para cada vista, para que se muevan de acuerdo a su posición correspondiente
Pruebe FrameLayout
, le da la posibilidad de poner vistas una encima de otra. Puede crear dos LinearLayouts
: uno con las vistas de fondo y otro con vistas en primer plano, y combinarlos usando FrameLayout
. Espero que esto ayude.
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);
Puede haber otra forma de salvar el día. Simplemente inicie un nuevo cuadro de diálogo con el diseño deseado y simplemente muéstrelo. Lo necesito para mostrar LoadView sobre un DialogFragment y esta fue la única forma en que tuve éxito.
Dialog topDialog = new Dialog(this, android.R.style.Theme_Translucent_NoTitleBar);
topDialog.setContentView(R.layout.dialog_top);
topDialog.show();
bringToFront () podría no funcionar en algunos casos como el mío. Pero el contenido del diseño dialog_top debe anular cualquier cosa en la capa ui. Pero de todos modos, esta es una solución fea.
Puede intentar usar bringChildToFront
, puede verificar si esta documentation es útil en la página de Desarrolladores de Android .
Puede llamar a bringToFront () en la vista que desea obtener en el frente
Esto es un ejemplo:
yourView.bringToFront();
Si está utilizando LinearLayout
, debe llamar a myView.bringToFront()
y luego debe llamar a parentView.requestLayout()
y parentView.invalidate()
para forzar al padre a volver a dibujar con el nuevo orden secundario.
Una solución incluso más simple es editar el XML de la actividad. Utilizar
android:translationZ=""
me he enfrentado al mismo problema la siguiente solución me ha funcionado.
FrameLayout glFrame=(FrameLayout) findViewById(R.id.animatedView);
glFrame.addView(yourView);
glFrame.bringToFront();
glFrame.invalidate();
bringToFront()
es la manera correcta, pero, bringToFront()
CUENTA que debes llamar a los bringToFront()
e invalidate()
en la vista de nivel más alto (debajo de tu vista raíz), por ejemplo:
La jerarquía de su vista es:
-RelativeLayout
|--LinearLayout1
|------Button1
|------Button2
|------Button3
|--ImageView
|--LinearLayout2
|------Button4
|------Button5
|------Button6
Entonces, cuando anime sus botones (1-> 6), sus botones estarán debajo (debajo) de ImageView
. Para traerlo (arriba) a ImageView
debe llamar a los bringToFront()
e invalidate()
en sus LinearLayout
. Entonces funcionará :) ** NOTA: Recuerde configurar android:clipChildren="false"
para su diseño 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>
Un poco de 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!