Android ConstraintLayout - Menempatkan satu tampilan di atas tampilan lain

106

Saya mencoba menambahkan ProgressBardi atas a Button(keduanya ada di dalam 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"/>

Tetapi bahkan setelah menelepon bringToFrontdi ProgressBardalam onCreate, selalu tetap di belakang Button.

ProgressBar progressBar = (ProgressBar)findViewById(R.id.progressBar);
progressBar.bringToFront();
Adam Johns
sumber
ini sangat aneh, saya mencoba bermain-main sedikit dengan tata letak Anda, bahkan membalikkan rantai sehingga bilah kemajuan dibatasi untuk teks edit dan tombol ke bilah kemajuan tetapi tombolnya tampaknya selalu di atas bilah kemajuan
lelloman
Apakah Anda dapat menggunakan FrameLayout? Cobalah, mengetahui bahwa di FrameLayout, indeks-z diberikan oleh urutan di dalam tata letak (jadi Tombol 1, Kemajuan ke-2)
razgraf
di mana passwordEditText Anda seperti yang saya periksa tanpa aplikasi: layout_constraintTop_toBottomOf = "@ + id / passwordEditText" saya dapat melihat progress bar di atas dapatkah Anda memberikan passwordEditText
Pavan

Jawaban:

167

Tetapkan ketinggian di ProgressBar; 2dpsepertinya berhasil.

android:elevation="2dp"

Anda juga dapat mencoba mengatur translationZseperti yang disarankan dalam jawaban yang diterima untuk pertanyaan serupa .

Saya juga menemukan jawaban ini sebagai alternatif.

Cheticamp
sumber
17
Tetapi elevationdan translationZhanya untuk API> = 21, bagaimana dengan API yang lebih lama?
q126y
1
@ q126y Saya rasa ini tidak menjadi masalah hingga API 21, jadi API lama seharusnya tidak memerlukannya. Saya telah mencobanya pada emulator yang menjalankan API 17 dan bilah kemajuan muncul di atas seperti yang diharapkan.
Cheticamp
@Cheticamp jadi Bagaimana menangani ini? AS memberikan peringatan bahwa itu hanya berfungsi API level 21 dan lebih tinggi.
Ajay S
6
@ q126yViewCompat.setTranslationZ(view, 5)
Silvia H
2
ViewCompat.setElavation(view, 20f)membantu Anda
sagus_helgy
9

Kita perlu menggunakan android: elevasi untuk mengontrolnya.

android:elevation="10dp"

Atribut elevasi ini hanya bekerja di API level> = 21. Tapi di bawahnya itu akan berperilaku normal. Jika kita menambahkan Kemajuan di bawah tampilan Tombol, itu menunjukkan tampilan yang ada di bawah di bagian atas tampilan lain.

Ishan Fernando
sumber
6

Dalam kebanyakan kasus, Anda cukup menentukan tampilan yang Anda inginkan di atas setelah yang akan muncul di bawahnya.

Cristan
sumber
Bagaimana Anda memastikan bahwa karena xml dapat secara tidak sengaja diatur ulang
RamPrasadBismil
@Cristan, sebaiknya berikan cuplikan kode atau contoh. Terima kasih
blueware
1
Saya bertanya-tanya mengapa ProgressBartidak di atas Buttonmeskipun ProgressBarditentukan setelah Buttondalam pertanyaan.
Michael Osofsky
Saya pikir ini juga benar, tetapi di mana pun saya menempatkan tampilan gambar dalam urutan tata letak kendala, itu selalu muncul di belakang tombol
lihat
1

Dalam tata letak Batasan, Anda harus menggunakan

traslationz

lebih tinggi dari tampilan yang Anda inginkan di bawah.

Waqas Yousaf
sumber
0

Jawaban terbaru untuk Android Sutdio 3.5:

Di Layout Editor yang diperbarui, sekarang lebih mudah untuk memilih Tampilan mana yang akan ditampilkan di depan seperti yang ditunjukkan dalam catatan rilis Android Studio

.. Selain itu, hamparan biru sekarang menyoroti target pembatas. Penyorotan ini sangat berguna saat mencoba membatasi komponen yang tumpang tindih dengan yang lain.

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

Lebih mudah lagi, Jika Anda menyeret View ke atas (salin tempel atau dari Component Tree di editor tata letak) itu akan mendapatkan prioritas yang lebih rendah (jadi itu akan berada di belakang tampilan lain)

Refael
sumber
0

Anda dapat membungkusnya seperti di bawah ini Gunakan framelayout sebagai induk dan letakkan bilah porogress di luar tata letak batasan. Tombol ini akan tumpang tindih

<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>
Rohan Sharma
sumber
0

Tombol secara default memiliki set TranslationZ, jadi Anda memiliki dua opsi

1 - buat bilah kemajuan TranslationZ lebih besar dari ketinggian tombol

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

2 - buat tombol TranslateZ ke 0 sehingga tampilan Muncul di atas satu sama lain dalam urutan Constraint Layout Anda, Anda dapat mencapai ini dengan Mengatur Gaya ke tombol

style="@style/Widget.AppCompat.Button.Borderless"
Mohammed Alaa
sumber
0

Meskipun android:elevation="4dp"atau traslationzakan berfungsi, tetapi untuk level API tersebut setidaknya harus 21. Jika karena alasan tertentu Anda tidak dapat melakukannya, pastikan tampilan yang Anda inginkan di atas disebutkan setelah tampilan lain. Misalnya, jika saya ingin progressBar di atas ImageView:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 
   xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   tools:context=".ImageActivity">

<ImageView
   android:id="@+id/image_view"
   android:layout_width="0dp"
   android:layout_height="0dp"
   app:layout_constraintBottom_toBottomOf="parent"
   app:layout_constraintDimensionRatio="6:4"
   app:layout_constraintEnd_toEndOf="parent"
   app:layout_constraintStart_toStartOf="parent"
   app:layout_constraintTop_toTopOf="parent" />

<ProgressBar
   android:id="@+id/progress_bar"
   style="?android:attr/progressBarStyle"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   app:layout_constraintBottom_toBottomOf="parent"
   app:layout_constraintEnd_toEndOf="parent"
   app:layout_constraintStart_toStartOf="parent"
   app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
Abhi
sumber