Відповіді:
Найпростіший спосіб - просто звернути увагу на порядок додавання переглядів у ваш 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. Якщо так, додайте висоту до іншого пункту або видаліть висоту, щоб вирішити проблему. Звідси саме порядок поглядів диктує те, що виходить над іншим.