Android'de RelativeLayout görünümlerinin Z sırasını tanımlama


226

Android'de bir RelativeLayout görünümlerinin z sırasını tanımlamak istiyorum.

Bunu yapmanın bir yolunun çağırdığını biliyorum bringToFront.

Bunu yapmanın daha iyi bir yolu var mı? Xml düzeninde z sırasını tanımlayabilirsem harika olurdu.


4
View.bringToFront (); anser
Shirish Herwade

Yanıtlar:


314

En kolay yol, Görünümlerin XML dosyanıza eklendiği sıraya dikkat etmektir. Dosyada aşağı inmek Z ekseninde yukarı doğru demek.

Düzenleme: Bu, burada ve burada Android geliştirici sitesinde belgelenmiştir . (Teşekkürler @flightplanner)


16
Bu maalesef değiştirmek her zaman mümkün değildir. Örneğin, göreli bir düzende, her öğe yalnızca dosyada daha önce tanımlanmış olanlara göre düzenlenebilir
Casebash

67
Casebash, "@ + id / your_element_before_its_defined" işlevini kullanmanız ve daha sonra tanımlayacağınız öğede aynı kimliği kullanmanız gerektiğine inanmıyorum. Bu konuda yanlış olabilirim, bu düzenler benim için çok zor, ama kesinlikle işe yaradığı izlenimini edindim.
tjb

7
tjb haklı (ve memnunum). @ + İd değerini kimliğin ilk sözü ile birlikte kullanın, örneğin layout_above = "@ + id / some_id"
Michiel

3
Ayrıca <item type = "id" name = "<your_id>" /> değerlerini xml dosyasına koyabilir ve daha sonra herhangi bir yere başvurabilirsiniz.
karl

8
Partiye yaklaşık 3 yıl geç kaldığımı biliyorum, ama @hpique'ye yanıt olarak, bu burada
HexAndBugs


68

API 21 ve sonraki sürümlerdeki düğmelerin ve diğer öğelerin yüksek bir yüksekliğe sahip olduğunu ve bu nedenle üst düzenden bağımsız olarak öğelerin xml sırasını göz ardı ettiğini lütfen unutmayın. Bunu anlamak için bana biraz zaman ayırdı.


16
benim için bu hatanın çözümü, düğme üzerinde görüntülenmesini istediğim görünümde setElevation (1000) 'i çağırmaktı.
ateş

setElevation (), API düzeyi 21 gerektirir
dp2050

21

Android'de API düzey 21'den başlayarak, düzen dosyasındaki öğeler Z sırasını doğru yanıtta açıklandığı gibi dosya içinde nasıl sıralandıklarından alır ve yüksekliklerinden daha yüksek bir yükseklik değeri, öğenin daha yüksek bir Z sırası aldığı anlamına gelir. .

Bu bazen sorunlara neden olabilir, özellikle de XML'nin sırasına göre Z sırasının altında olması gereken öğelerin üstünde sıkça görülen düğmelerle. Bunu düzeltmek android:elevationiçin düzen XML'nizdeki öğeleri, elde etmek istediğiniz Z sırasına uyacak şekilde ayarlayın.

Düzende bir öğenin yüksekliğini ayarladım, gölge oluşturmaya başlayacak. Bu efekti istemiyorsanız gölgeyi aşağıdaki gibi kodla kaldırabilirsiniz:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
   myView.setOutlineProvider(null);
}

Yükseltilmiş bir görünümün gölgesini düzen xml'sinden kaldırmanın herhangi bir yolunu bulamadım.


1
Yorumlarda belirtildiği gibi kullanabilirsiniz android:elevation="1000dp". Bu şekilde gölge yapılmaz.
Vadim Kotov

15

Aynı sorunlarla karşılaştım: Göreli düzen parentView, 2 çocuk childView1 ve childView2 var. İlk başta childView1'i childView2'nin üstüne koydum ve childView1'in childView2'nin üstünde olmasını istiyorum. Çocukların görüşlerinin sırasını değiştirmek sorunu benim için çözmedi. Benim için ne çalıştı parentView ve ayarladığım kodda android: clipChildren = "false" ayarlamaktır:

childView1.bringToFront();

parentView.invalidate();

2
Bu çalışıyor ve Android beni çok üzüyor. child.bringToFront()ile parent.invalidate()işler ama parent.bringChildToFront(child)yok. Bir işletim sisteminden hepimizin beklediği mantık nerede?
Oliver Hausler

Bazı görünümleri canlandırmak için (X ve Y çevirileri), LinearLayout, FrameLayout ve RelativeLayout için birkaç kombinasyon denedim, ancak her zaman sorunlar vardı (örtüşmelerle veya orantılı boyutlarla ilgili değil). Sonunda android:clipChildren="false"hile yaptı. Teşekkür ederim!
JCarlosR

15

view.setZ(float)API düzeyi 21'den başlayarak kullanabileceğinizi lütfen unutmayın . Burada daha fazla bilgi bulabilirsiniz.


13

Girişinden bu yana bir cevap ekleyeceğimi düşündüm

android: ÇeviriZ

XML alanı işleri biraz değiştirdi. Koşmayı öneren diğer cevaplar

childView1.bringToFront();

parentView.invalidate();

Bu kod, XML dosyasında bir sabit kodlu android: translationZ ile herhangi bir görünümün önünde childView1'i getirmeyeceği DIŞINDA tamamen nokta. Bu sorun yaşıyordum ve bir kez diğer alanlardan bu alanı kaldırdık, bringToFront () gayet iyi çalıştı.


Bu android elevation
5'ler

5

API 21'de view.setElevation(float)yerleşik

ViewCompat.setElevation(view, float);Geriye dönük uyumluluk için kullanın

Diğer yöntemler ViewCompat.setZ(v, pixels) veViewCompat.setTranslationZ(v, pixels)

Başka bir yol düğmeleri toplamak veya dizi görüntülemek ve addViewRelativeLayout'a eklemek için kullanın




0

XML'deki Görünümlerden birinde yükseklik olup olmadığını kontrol edin. Öyleyse, sorunu çözmek için diğer öğeye yükseklik ekleyin veya yükselişi kaldırın. Oradan, diğerinin üstüne gelenleri dikte eden görüşlerin sırasıdır.


0

Veya örtüşen düğmeyi veya görünümleri bir FrameLayout içine yerleştirin. Daha sonra, xml dosyasındaki RelativeLayout, eklendikleri gibi alt düzenlerin sırasına saygı gösterir.


0

Aynı kodu elde etmek için aşağıdaki kod örneğini de kullanabilirsiniz

ViewCompat.setElevation(sourceView, ViewCompat.getElevation(mCardView)+1);

Bu geriye dönük uyumludur. İşte mCardViewaşağıda olması gereken bir görünüm sourceView.

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.