Відповіді:
Найпростіший спосіб - просто звернути увагу на порядок додавання переглядів у ваш XML-файл. Опускання файлу вниз означає вище вгору по осі Z.
Редагувати: це задокументовано тут і тут на сайті розробника Android. (Дякую @flightplanner)
Зверніть увагу, кнопки та інші елементи в API 21 і вище мають високу висоту, і тому ігноруйте порядок елементів xml незалежно від батьківського макета. Зайняв мене час, щоб зрозуміти це.
В Android, починаючи з рівня 21 API, елементи у файлі компонування отримують свій порядок Z як від того, як вони впорядковані у файлі, як описано у правильній відповіді, так і від їх висоти, більш високе значення висоти означає, що елемент отримує більш високий Z порядок .
Іноді це може спричинити проблеми, особливо з кнопками, які часто з’являються вгорі елементів, які відповідно до порядку XML повинні знаходитись під ними в Z порядку. Щоб виправити це, просто встановіть android:elevation
елементи XML у макеті, щоб вони відповідали порядку, який ви хочете досягти.
Якщо ви встановите висоту елемента в макеті, він почне кидати тінь. Якщо ви не хочете цього ефекту, ви можете видалити тінь з таким кодом:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
myView.setOutlineProvider(null);
}
Я не знайшов жодного способу видалити тінь піднесеного виду через макет xml.
android:elevation="1000dp"
. Жодна тінь не відображається таким чином.
Я зіткнувся з тими ж проблемами: У відносному компонуванні parentView у мене є 2 дитини childView1 та childView2. Спочатку я поставив childView1 над childView2, і я хочу, щоб childView1 опинився поверх childView2. Зміна порядку переглядів дітей не вирішила для мене проблеми. Що для мене працювало - це встановити android: clipChildren = "false" у parentView та в коді, який я встановив:
childView1.bringToFront();
parentView.invalidate();
child.bringToFront()
з parent.invalidate()
творами, але parent.bringChildToFront(child)
ні. Де логіка, яку ми всі очікуємо від ОС?
android:clipChildren="false"
зробив трюк. Дякую!
Зверніть увагу, що ви можете використовувати, view.setZ(float)
починаючи з рівня 21 API. Тут ви можете знайти більше інформації.
Думав, я би додав відповідь з моменту впровадження
android: перекладZ
Поле XML змінило речі. Інші відповіді, які передбачають біг
childView1.bringToFront();
parentView.invalidate();
на місці ВІДКРИТИ, тому що цей код НЕ буде виводити childView1 перед будь-яким видом із жорстким кодом Android: translationZ у XML-файлі. У мене були проблеми з цим, і як тільки я видалив це поле з інших поглядів, createToFront () спрацював чудово.
elevation
В API 21 є view.setElevation(float)
вбудована версія
Використовувати ViewCompat.setElevation(view, float);
для зворотної сумісності
Більше методів ViewCompat.setZ(v, pixels)
іViewCompat.setTranslationZ(v, pixels)
Інший спосіб збирати кнопки або переглядати масив та використовувати їх addView
для додавання до RelativeLayout
childView.bringToFront () не працював для мене, тому я встановив Z-переклад найменш доданого елемента (того, що накладав усіх інших дітей) на таке негативне значення:
lastView.setTranslationZ(-10);
див. https://developer.android.com/reference/android/view/View.html#setTranslationZ(float) для отримання додаткової інформації
Ви можете використовувати власні RelativeLayout
з переробленими
protected int getChildDrawingOrder (int childCount, int i)
Будьте в курсі - цей метод сприймає парам i
як "який погляд я повинен малювати i'th
". Так ViewPager
працює. Він встановлює індивідуальний порядок малювання спільно з PageTransformer
.
Перевірте, чи є у вас висота на одному з представлень у XML. Якщо так, додайте висоту до іншого пункту або видаліть висоту, щоб вирішити проблему. Звідси саме порядок поглядів диктує те, що виходить над іншим.