Android ConstraintLayout - Đặt một chế độ xem lên trên một chế độ xem khác


105

Tôi đang cố gắng thêm một ProgressBarvào đầu của a Button(cả hai đều nằm trong 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"/>

Nhưng ngay cả sau khi gọi bringToFrontvào ProgressBartrong onCreate, nó luôn luôn ở lại phía sau Button.

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

điều này thật kỳ lạ, tôi đã cố gắng chơi một chút với bố cục của bạn, thậm chí đảo ngược chuỗi để thanh tiến trình bị ràng buộc đối với văn bản chỉnh sửa và nút đối với thanh tiến trình nhưng nút này dường như luôn ở trên đầu thanh tiến trình
lelloman

Bạn có thể sử dụng FrameLayout không? Hãy thử, biết rằng trong FrameLayout, chỉ số z được cung cấp theo thứ tự bên trong bố cục (vì vậy Nút 1, Tiến trình 2)
razgraf

nơi là passwordEditText của bạn như tôi đã kiểm tra mà không cần ứng dụng: layout_constraintTop_toBottomOf = "@ + id / passwordEditText" tôi có thể nhìn thấy thanh tiến trình trên đỉnh u có thể quy định rằng passwordEditText
Pavan

Câu trả lời:


167

Đặt độ cao trên ProgressBar; 2dpdường như hoạt động.

android:elevation="2dp"

Bạn cũng có thể thử đặt translationZnhư được đề xuất trong câu trả lời được chấp nhận cho một câu hỏi tương tự .

Tôi cũng đã xem câu trả lời này như một sự thay thế.


17
Nhưng elevationtranslationZchỉ dành cho API> = 21, còn các API cũ hơn thì sao?
q126y 09/07/17

1
@ q126y Tôi không nghĩ rằng điều này trở thành vấn đề cho đến API 21, vì vậy các API cũ hơn không cần điều này. Tôi đã thử nó trên trình giả lập chạy API 17 và thanh tiến trình xuất hiện trên cùng như mong đợi.
Cheticamp, 09/07/2017

@Cheticamp vậy Làm thế nào để xử lý điều này? AS đang đưa ra cảnh báo rằng nó chỉ hoạt động API cấp 21 trở lên.
Ajay S

6
@ q126yViewCompat.setTranslationZ(view, 5)
Silvia H

2
ViewCompat.setElavation(view, 20f)giúp bạn
sagus_helgy

9

Chúng ta cần sử dụng android: elevation để kiểm soát điều này.

android:elevation="10dp"

Thuộc tính độ cao này chỉ hoạt động ở cấp độ API> = 21. Nhưng ở cấp độ bên dưới nó sẽ hoạt động bình thường. Nếu chúng ta thêm Tiến trình bên dưới dạng xem Nút, nó sẽ hiển thị dạng xem ở dưới cùng ở đầu dạng xem khác.


6

Trong hầu hết các trường hợp, bạn có thể chỉ cần xác định chế độ xem bạn muốn ở trên cùng sau chế độ xem sẽ xuất hiện bên dưới nó.


Làm thế nào để bạn đảm bảo rằng coz xml vô tình có thể được sắp xếp lại
RamPrasadBismil

@Cristan, tốt hơn hết bạn nên cung cấp đoạn mã hoặc ví dụ. Cảm ơn
blueware

1
Tôi tự hỏi tại sao ProgressBarkhông có trên đầu trang của Buttonmặc dù ProgressBarđược định nghĩa sau Buttontrong câu hỏi.
Michael Osofsky

Tôi nghĩ điều này cũng đúng nhưng bất kể tôi đặt chế độ xem hình ảnh ở đâu trong thứ tự bố cục ràng buộc, nó luôn xuất hiện sau một nút
behelit

0

Câu trả lời cập nhật cho Android Sutdio 3.5:

Trong Trình chỉnh sửa bố cục được cập nhật, giờ đây, việc chọn Chế độ xem sẽ ở phía trước dễ dàng hơn nhiều như được trình bày trong ghi chú phát hành Android Studio

.. Ngoài ra, lớp phủ màu xanh lam hiện làm nổi bật mục tiêu của ràng buộc. Đánh dấu này đặc biệt hữu ích khi cố gắng hạn chế một thành phần trùng lặp với thành phần khác.

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

Thậm chí dễ dàng hơn, Nếu bạn kéo Chế độ xem lên (sao chép dán hoặc từ Cây thành phần trong trình chỉnh sửa bố cục), nó sẽ có mức ưu tiên thấp hơn (vì vậy nó sẽ ở phía sau các chế độ xem khác)


0

Trong bố cục Ràng buộc, bạn nên sử dụng

traslationz

cao hơn chế độ xem mà bạn muốn ở bên dưới.


0

Bạn có thể bọc nó như bên dưới Sử dụng framelayout làm cha mẹ và đặt thanh porogress bên ngoài bố cục ràng buộc. Nút này sẽ chồng lên nhau

<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

Nút theo mặc định được đặt DịchZ, vì vậy bạn có hai tùy chọn

1 - đặt thanh tiến trình TranslationZ lớn hơn độ cao của nút

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

2 - tạo nút DịchZ về 0 để các khung nhìn Xuất hiện phía trên nhau theo thứ tự trong Bố cục Ràng buộc của bạn, bạn có thể đạt được điều này bằng cách Cài đặt Kiểu thành nút

style="@style/Widget.AppCompat.Button.Borderless"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.