web-dev-qa-db-fra.com

Comment amener la vue devant tout?

J'ai de l'activité et beaucoup de widgets dessus, certains ont des animations et à cause des animations, certains des widgets se déplacent (traduisent) les uns sur les autres. Par exemple, la vue texte se déplace sur certains boutons. . .

Maintenant, je veux que les boutons soient toujours sur le devant. Et lorsque la visualisation de texte est en mouvement, je veux passer derrière les boutons.

Je ne peux pas y arriver. J'ai tout essayé et "bringToFront ()" ne fonctionne vraiment pas.

note Je ne veux pas contrôler l'ordre des z par l'ordre de placement de l'élément à la présentation car je ne peux tout simplement pas :), la présentation est complexe et je ne peux pas placer tous les boutons au début de la présentation

94
Lukap

Vous pouvez appeler bringToFront () sur la vue que vous souhaitez placer au premier plan.

Ceci est un exemple:

    yourView.bringToFront();
113
Medo Elkamaly

Je cherchais une bonne réponse dans le dépassement de capacité de la pile et quand je ne pouvais pas en trouver une, je parcourais la documentation.

personne ne semble être tombé sur cette réponse simple pour l'instant:

ViewCompat.setTranslationZ(view, translationZ);

traduction par défaut z est 0.0 

32
shrewdu

bringToFront() est le bon moyen, mais, REMARQUE: vous devez appeler les méthodes bringToFront() et invalidate() sur la vue de niveau supérieur (sous votre vue racine), par exemple:

La hiérarchie de votre vue est la suivante:

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

Ainsi, lorsque vous animerez vos boutons (1-> 6), ceux-ci apparaîtront sous (en dessous) de la ImageView. Pour la placer au dessus de la ImageView, vous devez appeler les méthodes bringToFront() et invalidate() sur votre LinearLayouts. Cela fonctionnera ensuite:) ** REMARQUE: n'oubliez pas de définir Android:clipChildren="false" pour votre présentation racine ou gradparent_layout de animate-view. Jetons un coup d'oeil à mon vrai code:

.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>

Certains codes 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!

18
Justin

Essayez FrameLayout, cela vous donne la possibilité de placer les vues les unes sur les autres. Vous pouvez créer deux LinearLayouts: une avec les vues d'arrière-plan et l'autre avec des vues de premier plan et les combiner à l'aide de FrameLayout. J'espère que cela t'aides.

14
Egor

Une solution encore plus simple consiste à éditer le XML de l'activité. Utilisation

Android:translationZ=""
12
Toby

Avec ce code en xml

 Android:translationZ="90dp"
7
Krishna

Vous pouvez essayer d'utiliser la bringChildToFront et vérifier si cette documentation est utile dans la page Développeurs Android .

2
Emanuel

j'ai fait face au même problème ... La solution suivante a fonctionné pour moi.

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

Il peut y avoir un autre moyen qui sauve la journée. Il suffit d'initier un nouveau dialogue avec la mise en page souhaitée et de l'afficher. J'en ai besoin pour montrer un loadingView sur un DialogFragment et c'était le seul moyen de réussir.

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

bringToFront () peut ne pas fonctionner dans certains cas, comme le mien. Mais le contenu de la disposition dialog_top doit remplacer tout ce qui se trouve sur la couche ui. Mais de toute façon, c'est une solution de contournement moche.

2
asozcan

Vous devez utiliser framelayout. Et la meilleure façon de le faire est de rendre la vue invisible lorsque cela n’est pas nécessaire. Aussi, vous devez définir la position pour chaque vue, afin qu'ils se déplacent en fonction de la position correspondante

0
Ranjit Mishra

Si vous utilisez une LinearLayout, vous devez appeler myView.bringToFront(), puis parentView.requestLayout() et parentView.invalidate() pour obliger le parent à redessiner avec la nouvelle commande enfant.

0
Cristian

Si vous utilisez ConstraintLayout, placez simplement l'élément après les autres pour le rendre plus visible

0
Fajar Ulin Nuha