Android ConstraintLayout - Bir görünümü başka bir görünümün üstüne yerleştir


115

A'nın ProgressBarüstüne bir eklemeye çalışıyorum Button(her ikisi de a'nın içindedir 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"/>

Ama çağırdıktan sonra bringToFrontüzerine ProgressBarin onCreatearkasında, her zaman kalır Button.

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

bu çok tuhaf, düzeninizle biraz oynamaya çalıştım, zinciri tersine çevirmeye çalıştım, böylece ilerleme çubuğu düzenleme metni ve ilerleme çubuğunun düğmesi ile sınırlandırılır, ancak düğme her zaman ilerleme çubuğunun üstünde görünüyor
lelloman

Bir FrameLayout kullanabiliyor musunuz? Bir deneyin, FrameLayout'ta z-endeksinin mizanpaj içindeki sırayla verildiğini bilerek (yani Düğme 1, İlerleme 2)
razgraf

uygulama olmadan kontrol ettiğim gibi passwordEditText'in nerede: layout_constraintTop_toBottomOf = "@ + id / passwordEditText" Üstte ilerleme çubuğunu görebiliyorum şifreyi sağlayabilir misinEditText
Pavan

Yanıtlar:


179

Üzerinde bir yükseklik ayarlayın ProgressBar; 2dpişe yarıyor gibi görünüyor.

android:elevation="2dp"

Ayrıca benzer bir soruyatranslationZ kabul edilen yanıtta önerildiği gibi ayarlamayı deneyebilirsiniz .

Ben de bu cevaba alternatif olarak rastladım .


18
Ancak elevationve translationZsadece API> = 21 için, peki ya eski API'ler?
q126y

1
@ q126y API 21'e kadar bunun bir sorun olduğunu düşünmüyorum, bu nedenle eski API'lerin buna ihtiyacı olmamalı. API 17 çalıştıran bir emülatörde denedim ve beklendiği gibi ilerleme çubuğu en üstte belirdi.
Cheticamp

@Cheticamp yani bununla nasıl başa çıkılır? AS bir uyarı veriyor, sadece API seviyesi 21 ve üzerinde çalışıyor.
Ajay S

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

2
ViewCompat.setElavation(view, 20f)yardımcı olur
sagus_helgy

12

Bunu kontrol etmek için android: elevation kullanmalıyız.

android:elevation="10dp"

Bu yükseklik özelliği yalnızca API seviyesi> = 21'de çalışır. Ancak bunun altında normal şekilde davranacaktır. Düğme görünümünün altına İlerleme eklersek, diğer görünümün en altında altta bulunan görünümü gösterir.


6

Çoğu durumda, altında görünmesi gereken görünümden sonra üstte olmasını istediğiniz görünümü basitçe tanımlayabilirsiniz.



@Cristan, bir kod parçacığı veya bir örnek sağlamak daha iyidir. Teşekkürler
blueware

1
Sorudan sonra tanımlanmasına rağmen neden ProgressBarüstte olmadığını merak ediyorum . ButtonProgressBarButton
Michael Osofsky

Bunun da doğru olduğunu düşündüm, ancak kısıtlama düzeni sıralamasında bir görüntü görünümünü nereye yerleştirirsem
koyayım

3

Kısıtlama düzeninde kullanmalısınız

traslationz

aşağıda görmek istediğiniz görünümden daha yüksek.


1

Android Sutdio 3.5 için güncellenmiş cevap:

Güncellenen Düzen Düzenleyicide, Android Studio sürüm notlarında gösterildiği gibi hangi Görünümün önde olacağını seçmek artık çok daha kolay

.. Ek olarak, mavi bir kaplama artık kısıtlamanın hedefini vurguluyor. Bu vurgulama, özellikle başka bir bileşenle örtüşen bir bileşene sınırlama girişiminde bulunurken kullanışlıdır.

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

Daha da kolay, Görünümü yukarı sürüklerseniz (kopyala yapıştır veya mizanpaj düzenleyicideki Bileşen Ağacı'ndan) daha düşük öncelik kazanır (böylece diğer görünümlerin arkasında olur)


1

Düğme varsayılan olarak TranslationZ ayarlıdır, bu nedenle iki seçeneğiniz vardır

1 - ilerleme çubuğu TranslationZ, düğme yüksekliğinden büyük olur

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

2 - Çevirme düğmesini 0'a çevirin, böylece görünümler Kısıtlama Düzeninizde sırayla birbirinin üzerinde görünür, bunu Stili düğmesine ayarlayarak yapabilirsiniz

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

0

Bunu aşağıdaki gibi sarmalayabilirsiniz. Çerçeve düzeni üst öğesi olarak kullanın ve porogress çubuğunu kısıtlama düzeninin dışına koyun. Bu örtüşecek düğme

<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

Her ne kadar android:elevation="4dp"veya traslationzçalışacak olsa da , ancak bu API seviyesi için en az 21 olmalıdır. Herhangi bir nedenle bunu yapamıyorsanız, üstte istediğiniz görünümün diğer görünümlerden sonra belirtildiğinden emin olun. Örneğin, ImageView'ün üstünde progressBar'ı istersem:

<?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>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.