Android ConstraintLayout - วางมุมมองหนึ่งไว้บนมุมมองอื่น


115

ฉันกำลังพยายามเพิ่ม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ในก็มักจะเข้าพักที่อยู่เบื้องหลังonCreateButton

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

นี่เป็นเรื่องแปลกมากฉันพยายามเล่นกับเลย์เอาต์ของคุณเล็กน้อยแม้กระทั่งการย้อนกลับห่วงโซ่เพื่อให้แถบความคืบหน้า จำกัด ข้อความแก้ไขและปุ่มไปยังแถบความคืบหน้า แต่ปุ่มดูเหมือนจะอยู่ด้านบนของแถบความคืบหน้าเสมอ
lelloman

คุณสามารถใช้ FrameLayout ได้หรือไม่? ลองใช้ดูโดยให้รู้ว่าใน FrameLayout ดัชนี z จะได้รับตามลำดับภายในเลย์เอาต์ (เช่นปุ่มที่ 1 ความคืบหน้า 2)
razgraf

passwordEditText ของคุณอยู่ที่ไหนตามที่ฉันตรวจสอบโดยไม่มีแอป: layout_constraintTop_toBottomOf = "@ + id / passwordEditText" ฉันเห็นแถบความคืบหน้าคุณสามารถระบุ passwordEditText นั้นได้
Pavan

คำตอบ:


179

ตั้งค่าระดับความสูงบนProgressBar; 2dpดูเหมือนจะได้ผล

android:elevation="2dp"

นอกจากนี้คุณยังสามารถลองตั้งค่าtranslationZตามที่แนะนำในคำตอบที่ได้รับการยอมรับให้เป็นคำถามที่คล้ายกัน

ฉันยังเจอคำตอบนี้เป็นทางเลือก


18
แต่elevationและtranslationZมีเฉพาะสำหรับ API> = 21 สิ่งที่เกี่ยวกับ APIs เก่า?
q126y

1
@ q126y ฉันไม่คิดว่าสิ่งนี้จะกลายเป็นปัญหาจนกระทั่ง API 21 ดังนั้น API ที่เก่ากว่าไม่ควรต้องการสิ่งนี้ ฉันได้ลองใช้กับอีมูเลเตอร์ที่ใช้ API 17 และแถบความคืบหน้าปรากฏอยู่ด้านบนตามที่คาดไว้
Cheticamp

@Cheticamp ดังนั้นจะจัดการอย่างไร? AS กำลังแจ้งเตือนว่าใช้ได้เฉพาะ API ระดับ 21 ขึ้นไป
Ajay S

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

2
ViewCompat.setElavation(view, 20f)ช่วยคุณ
sagus_helgy

12

เราจำเป็นต้องใช้ android: ระดับความสูงเพื่อควบคุมสิ่งนี้

android:elevation="10dp"

แอตทริบิวต์ระดับความสูงนี้ใช้ได้เฉพาะในระดับ API> = 21 แต่ในด้านล่างนั้นจะทำงานได้ตามปกติ หากเราเพิ่มความคืบหน้าด้านล่างมุมมองปุ่มจะแสดงมุมมองซึ่งอยู่ด้านล่างที่ด้านบนของมุมมองอื่น ๆ


6

ในกรณีส่วนใหญ่คุณสามารถกำหนดมุมมองที่คุณต้องการไว้ด้านบนหลังจากมุมมองที่ควรปรากฏด้านล่าง


คุณจะแน่ใจได้อย่างไรว่า coz the xml สามารถจัดเรียงใหม่ได้โดยบังเอิญ
RamPrasadBismil

@ คริสตันควรให้ข้อมูลโค้ดหรือตัวอย่างดีกว่า ขอบคุณ
blueware

1
ผมสงสัยว่าทำไมProgressBarไม่ได้อยู่บนด้านบนของButtonแม้ว่าProgressBarจะถูกกำหนดหลังจากที่Buttonในคำถาม
Michael Osofsky

ฉันคิดว่านี่เป็นเรื่องจริงเช่นกัน แต่ไม่ว่าฉันจะวางมุมมองภาพไว้ที่ใดในการจัดลำดับเลย์เอาต์ข้อ จำกัด มันก็มักจะปรากฏอยู่ด้านหลังปุ่มเสมอ
behelit


1

คำตอบที่อัปเดตสำหรับ Android Sutdio 3.5:

ในตัวแก้ไขเค้าโครงที่อัปเดตตอนนี้คุณสามารถเลือกมุมมองที่จะอยู่ด้านหน้าได้ง่ายขึ้นมากตามที่แสดงในบันทึกย่อประจำรุ่นของ Android Studio

.. นอกจากนี้ภาพซ้อนทับสีน้ำเงินจะเน้นเป้าหมายของข้อ จำกัด การไฮไลต์นี้มีประโยชน์อย่างยิ่งเมื่อพยายาม จำกัด ส่วนประกอบที่ทับซ้อนกับส่วนประกอบอื่น

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

ง่ายยิ่งขึ้นถ้าคุณลาก View up (คัดลอกวางหรือจาก Component Tree ในตัวแก้ไขเค้าโครง) จะมีลำดับความสำคัญต่ำกว่า (ดังนั้นจะอยู่หลังมุมมองอื่น ๆ )


1

ปุ่มโดยค่าเริ่มต้นจะมีการตั้งค่า TranslationZ ดังนั้นคุณมีสองตัวเลือก

1 - ทำให้แถบความคืบหน้า TranslationZ มากกว่าการยกระดับปุ่ม

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

2 - ทำให้ปุ่ม TranslateZ เป็น 0 เพื่อให้มุมมองปรากฏเหนือกันและกันตามลำดับในเค้าโครงข้อ จำกัด ของคุณคุณสามารถทำได้โดยการตั้งค่ารูปแบบเป็นปุ่ม

style="@style/Widget.AppCompat.Button.Borderless"

0

คุณสามารถห่อได้ดังต่อไปนี้ใช้ framelayout เป็นหลักและวางแถบ porogress ไว้นอกเลย์เอาต์ข้อ จำกัด ปุ่มนี้จะทับซ้อนกัน

<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

แม้ว่าandroid:elevation="4dp"หรือtraslationzจะใช้งานได้ แต่สำหรับระดับ API นั้นควรมีอย่างน้อย 21 หากด้วยเหตุผลบางประการที่คุณไม่สามารถทำได้โปรดตรวจสอบให้แน่ใจว่ามุมมองที่คุณต้องการอยู่ด้านบนถูกกล่าวถึงหลังจากมุมมองอื่น ๆ ตัวอย่างเช่นหากฉันต้องการให้ progressBar อยู่ด้านบนของ 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>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.