Risposte:
Il modo più semplice è semplicemente prestare attenzione all'ordine in cui le viste vengono aggiunte al tuo file XML. Più in basso nel file significa più in alto nell'asse Z.
Modifica: questo è documentato qui e qui sul sito degli sviluppatori Android. (Grazie @flightplanner)
Si noti che i pulsanti e altri elementi in API 21 e versioni successive hanno un'elevazione elevata e pertanto ignorano l'ordine xml degli elementi indipendentemente dal layout principale. Mi ci è voluto un po 'per capirlo.
In Android a partire dal livello API 21, gli elementi nel file di layout ottengono il loro ordine Z sia dal modo in cui sono ordinati all'interno del file, come descritto nella risposta corretta, sia dalla loro elevazione, un valore di elevazione più elevato significa che l'oggetto ottiene un ordine Z più alto .
Questo a volte può causare problemi, specialmente con pulsanti che appaiono spesso in cima agli elementi che secondo l'ordine dell'XML dovrebbero essere al di sotto di loro nell'ordine Z. Per risolvere questo problema, imposta gli android:elevation
elementi nel tuo XML di layout in modo che corrispondano all'ordine Z che desideri raggiungere.
Se imposti un'elevazione di un elemento nel layout, inizierà a proiettare un'ombra. Se non desideri questo effetto, puoi rimuovere l'ombra con il codice in questo modo:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
myView.setOutlineProvider(null);
}
Non ho trovato alcun modo per rimuovere l'ombra di una vista elevata attraverso il layout xml.
android:elevation="1000dp"
. Nessuna ombra è resa in questo modo.
Ho riscontrato gli stessi problemi: in un layout relativo parentView, ho 2 figli childView1 e childView2. Inizialmente, ho inserito childView1 sopra childView2 e desidero che childView1 sia in cima a childView2. Cambiare l'ordine delle opinioni dei bambini non ha risolto il problema per me. Quello che ha funzionato per me è impostare Android: clipChildren = "false" su parentView e nel codice che ho impostato:
childView1.bringToFront();
parentView.invalidate();
child.bringToFront()
con le parent.invalidate()
opere, ma parent.bringChildToFront(child)
non lo fa. Dov'è la logica che tutti ci aspettiamo da un sistema operativo?
android:clipChildren="false"
fatto il trucco. Grazie!
Nota che puoi utilizzare a view.setZ(float)
partire dal livello API 21. Qui puoi trovare maggiori informazioni.
Ho pensato di aggiungere una risposta dall'introduzione di
Android: translationZ
Il campo XML ha cambiato un po 'le cose. Le altre risposte che suggeriscono di correre
childView1.bringToFront();
parentView.invalidate();
sono totalmente a posto TRANNE che questo codice NON porterà childView1 davanti a nessuna vista con un Android hardcoded: translationZ nel file XML. Ho avuto problemi con questo, e una volta rimosso questo campo dalle altre viste, bringToFront () ha funzionato bene.
elevation
L'API 21 ha il view.setElevation(float)
build-in
Utilizzare ViewCompat.setElevation(view, float);
per compatibilità con le versioni precedenti
Più metodi ViewCompat.setZ(v, pixels)
eViewCompat.setTranslationZ(v, pixels)
Un altro modo è possibile raccogliere pulsanti o visualizzare l'array e utilizzare addView
per aggiungere a RelativeLayout
childView.bringToFront () non ha funzionato per me, quindi ho impostato la traduzione Z dell'elemento aggiunto più di recente (quello che stava sovrapponendo tutti gli altri bambini) su un valore negativo in questo modo:
lastView.setTranslationZ(-10);
vedere https://developer.android.com/reference/android/view/View.html#setTranslationZ(float) per ulteriori informazioni
È possibile utilizzare personalizzato RelativeLayout
con ridefinito
protected int getChildDrawingOrder (int childCount, int i)
Attenzione: questo metodo assume param i
come "quale vista dovrei disegnare i'th
". ViewPager
Funziona così . Imposta l'ordine di disegno personalizzato in combinazione con PageTransformer
.
Controlla se hai qualche elevazione su una delle viste in XML. In tal caso, aggiungi l'elevazione all'altro oggetto o rimuovi l'elevazione per risolvere il problema. Da lì, è l'ordine dei punti di vista che detta ciò che viene sopra l'altro.