web-dev-qa-db-fra.com

La vue à l'avant ne fonctionne pas

Je souhaite modifier l'ordre z de certaines vues pendant l'animation

Sur les androïdes au-dessus de 4.1.2, cela fonctionne très bien, et sur les androïdes au-dessous de 4.1.2, l'ordre Z ne change pas, la vue de dessus reste en haut.

Voilà ce que j'essaie.

myView.bringToFront();
((View)myView.getParent()).invalidate();

Comment le faire fonctionner sur des appareils plus anciens?

22
Lena Bru
   /**
     * Change the view's z order in the tree, so it's on top of other sibling
     * views. This ordering change may affect layout, if the parent container
     * uses an order-dependent layout scheme (e.g., LinearLayout). Prior
     * to {@link Android.os.Build.VERSION_CODES#KitKat} this
     * method should be followed by calls to {@link #requestLayout()} and
     * {@link View#invalidate()} on the view's parent to force the parent to redraw
     * with the new child ordering.
     *
     * @see ViewGroup#bringChildToFront(View)
     */
    public void bringToFront() {
        if (mParent != null) {
            mParent.bringChildToFront(this);
        }
    }

selon cela, je manquais tout simplement la ligne

((View)myView.getParent()).requestLayout();

et ça a marché!

23
Lena Bru

J'ai essayé tout ça. Un RelativeLayout était censé être au-dessus d'un bouton, mais il ne voulait tout simplement pas obéir.

Finalement, je l'ai résolu en ajoutant Android:elevation="2dp" à RelativeLayout.

La valeur d'élévation est uniquement utilisée dans le niveau 21 et supérieur de l'API. Dans mon cas, tout en dessous du niveau 21 de l'API était bien et tout ce qui était au-dessus ne l'était pas.

J'espère que cela pourrait aider quelqu'un :)

13
Colibri

J'espère que cela sera utile à quelqu'un. Aucune des solutions ci-dessus n'a fonctionné pour moi. Pourquoi? Parce que ma vue que je voulais être à la fronde avait une élévation plus petite que les autres vues. Ainsi, la vue avec une plus grande élévation était toujours en face, quoi qu'il arrive.

6
Adrian Buciuman

Si la vue parent est une mise en page relative, cela peut fonctionner ou ne pas fonctionner. J'ai essayé bringToFront, requestLayout et removeView; addView, mais pas de chance. Ma solution était de tout mettre dans un framelayout. Ce dont j'avais besoin en haut était de déplacer le fond du framelayout avec une visibilité invisible, puis dans le code, il était rendu visible.

1
kjoelbro

Pour Api 21 ou supérieur Il existe un attribut xml appelé translateZ qui vous permet de définir le niveau d'élévation sur la vue.

Vous pouvez également l'utiliser à peu près.

Android: translateZ = "30dp"

* API> = 21

1
BOTJr.