Android ConstraintLayout - розмістіть один вид поверх іншого


105

Я намагаюся додати ProgressBarверх (a Buttonобидва знаходяться всередині a ConstraintLayout).

<Button
    android:id="@+id/sign_in_button"
    android:layout_width="280dp"
    android:layout_height="75dp"
    android:layout_marginBottom="75dp"
    android:layout_marginTop="50dp"
    android:text="@string/sign_in"
    android:textColor="@color/white"
    android:textSize="22sp"
    android:textStyle="bold"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/passwordEditText"
    app:layout_constraintVertical_bias="0.0"/>

<ProgressBar
    android:id="@+id/progressBar"
    style="?android:attr/progressBarStyle"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:layout_constraintTop_toTopOf="@+id/sign_in_button"
    android:layout_marginTop="8dp"
    app:layout_constraintBottom_toBottomOf="@+id/sign_in_button"
    android:layout_marginBottom="8dp"
    app:layout_constraintVertical_bias="0.5"
    android:layout_marginLeft="8dp"
    app:layout_constraintLeft_toLeftOf="@+id/sign_in_button"
    android:layout_marginRight="8dp"
    app:layout_constraintRight_toRightOf="@+id/sign_in_button"/>

Але навіть після виклику bringToFrontна ProgressBarін onCreate, воно завжди залишається позаду Button.

ProgressBar progressBar = (ProgressBar)findViewById(R.id.progressBar);
progressBar.bringToFront();

це так дивно, я намагався трохи пограти з вашим макетом, навіть перевернувши ланцюжок, щоб смужка прогресу обмежувала текст редагування, а кнопка - панель прогресу, але кнопка, здається, завжди знаходиться на вершині панелі прогресу
lelloman

Чи можете ви використовувати FrameLayout? Спробуйте, знаючи, що в FrameLayout z-індекс задається наказом всередині макета (так, кнопка 1-го, прогрес 2-го)
razgraf

де ваш парольEditText, як я перевірив без програми: layout_constraintTop_toBottomOf = "@ + id / passwordEditText" Я бачу панель прогресу зверху, можу надати цей
парольEditText

Відповіді:


167

Встановити висоту на ProgressBar; 2dpздається, працює.

android:elevation="2dp"

Ви також можете спробувати встановити так, translationZяк пропонується у прийнятій відповіді на подібне питання .

Я також натрапив на цю відповідь як альтернативу.


17
Але elevationі translationZтільки для API> = 21, що відносно старіших інтерфейсів API?
q126y

1
@ q126y Я не думаю, що це не стало проблемою до API 21, тому старші API не повинні цього робити. Я спробував це на емуляторі під управлінням API 17, і панель прогресу з'явилася вгорі, як очікувалося.
Cheticamp

@Cheticamp так Як впоратися з цим? AS попереджає, що працює лише API рівня 21 і вище.
Ajay S

6
@ q126yViewCompat.setTranslationZ(view, 5)
Сільвія Н

2
ViewCompat.setElavation(view, 20f)допомагає вам
sagus_helgy

9

Для цього нам потрібно використовувати android: elevation.

android:elevation="10dp"

Цей атрибут висоти працює лише на рівні API> = 21. Але внизу він буде вести себе нормально. Якщо ми додамо «Прогрес» нижче за перегляд «Кнопки», він покаже подання, яке знаходиться внизу вгорі іншого подання.


6

У більшості випадків ви можете просто визначити вигляд, який ви хочете зверху, після того, який має з’являтися під ним.


Як ви гарантуєте, що coz xml може випадково переставитись
RamPrasadBismil

@ Криштан, краще надати фрагмент коду або приклад. Спасибі
блювер

1
Цікаво, чому ProgressBarвін не перебуває на вершині, Buttonнавіть якщо ProgressBarце визначено після Buttonпитання.
Михайло Ософський

Я думав, що це теж правда, але незалежно від того, де я розміщую перегляд зображень у порядку макета обмеження, воно завжди з’являється за кнопкою
behelit

1

У макеті обмежень ви повинні використовувати

траслізація

вище, ніж вигляд, який ви хочете нижче.


0

Оновлена ​​відповідь для Android Sutdio 3.5:

У оновленому редакторі макетів тепер набагато простіше вибрати, який перегляд буде попереду, як показано в примітках до випуску Android Studio

.. Крім того, синя накладка тепер виділяє ціль обмеження. Ця підсвітка особливо корисна при спробі обмежити компонент, який перекривається іншим.

https://developer.android.com/studio/releases

Ще простіше, якщо перетягнути View (копіювати пасту або з дерева компонентів у редакторі макета), він отримає нижчий пріоритет (тому він буде відставати від інших представлень)


0

Ви можете обернути це як нижче. Використовуйте framelayout як батьківський і поставте porogress bar поза макетом обмежень. Це перекриє кнопку

<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">
<androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
 //your all view inside it with button
 <Button/>......
  .........
 </androidx.constraintlayout.widget.ConstraintLayout>

 <ProgressBar
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

</FrameLayout>

0

Для кнопки за замовчуванням встановлений TranslationZ, тому у вас є два варіанти

1 - зробіть смугу прогресу TranslationZ більшою, ніж висота кнопки

ViewCompat.setTranslationZ(progressBar, 5)// to support older api <21

2 - зробіть кнопку TranslateZ на 0, щоб представлення відображалися один над одним для того, щоб у макеті обмежень ви можете досягти цього, встановивши кнопку "Стиль"

style="@style/Widget.AppCompat.Button.Borderless"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.