Android'de negatif kenar boşlukları kullanmak kötü bir uygulama mı?


114

Negatif marj gösterimi:

                         görüntü açıklamasını buraya girin

Senaryo

Birine negatif bir kenar boşluğu ayarlayarak, başka bir görünümün sınırlayıcı kutusunu istila etmesi için örtüşen görünümler.

Düşünceler

Gerekirse düzenlerin çakışmasıyla beklediğiniz şekilde çalışıyor gibi görünüyor. Ama bilmeden işleri doğru yapmadığım için daha büyük bir problemle karşılaşmak istemiyorum. Emülatörler, fiziksel cihazlar, adlandırın, negatif kenar boşlukları kullandığınızda her şey doğru çalışıyor gibi görünür, bir görünüm diğerinin görüş sınırlayıcı kutusunu işgal eder ve düzende nasıl açıklandığına bağlı olarak diğer görünümün üstünde veya altında olacaktır.

Ayrıca API 21 beri ayarlayabilirsiniz farkındayım translationZve elevation görünümü üzerinde veya diğer görünümler altında görünür hale getirmek için bağlıyor ama benim endişe temelde olmasından kaynaklanır belgelerinde için layout_marginnitelikler açıkça belirtti oluyor marj değerleri pozitif olmalı , let bana alıntı:

Alıntı:
Bu görünümün sol, üst, sağ ve alt taraflarında fazladan boşluk belirtir. Bu alan, bu görüşün sınırlarının dışında. Marj değerleri pozitif olmalıdır . "14,5sp" gibi bir birimle eklenen kayan nokta sayısı olan bir boyut değeri olmalıdır. Kullanılabilir birimler şunlardır: px (piksel), dp (yoğunluktan bağımsız pikseller), sp (tercih edilen yazı tipi boyutuna göre ölçeklenmiş pikseller), inç (inç), mm (milimetre) ...

Yıllarda aslen Olumsuz marjlar ile herhangi bir sorun olmadı bu soruyu soran beri, mümkün olduğunca bunları kullanmaktan kaçınmak çalıştım ama vermedi değil belgelerine durumları budur, çok değilim bu yüzden bile, herhangi bir sorunla karşılaştınız bunun için endişeli.


1
Espresso testlerinin, marjlarından biri negatifse nesneyi göremeyeceğini biliyorum ... bu yüzden onları kullanmamak için bir neden
Tim Boland

Yanıtlar:


193

2010 yılında @RomainGuy (çekirdek Android mühendisi), negatif marjların belirtilmemiş davranışlara sahip olduğunu belirtti .

2011 yılında @RomainGuy , LinearLayoutve üzerinde negatif kenar boşlukları kullanabileceğiniziRelativeLayout belirtti .

2016'da @RomainGuy, resmi olarak hiçbir zaman desteklenmediklerini ve tarafından desteklenmeyeceklerini belirttiConstraintLayout .

Yine de bu sınırlamayı aşmak kolaydır.

Temel görünümünüzün alt kısmına bir yardımcı görünüm (yükseklik 0dp, ebeveyn ile sınırlandırılmış genişlik) ekleyin, alt tarafa istediğiniz kenar boşluğunu ekleyin.
Ardından, görünümünüzü bunun altında konumlandırın ve desteklenmeyen negatif bir değer kullanmak zorunda kalmadan, etkin bir şekilde "negatif" bir kenara sahip olmasına izin verin.


1
O zaman zararsız bir şey gibi görünüyor, birinin başka bir iç görüsü olması durumunda açık bırakmak
Juan Cortés

1
@DrewLeSueur: Bu varsayımı yapmazdım. Negatif bir dolgunun ne anlama geldiği hakkında hiçbir fikrim yok.
CommonsWare

1
@CommonsWare bana söyleyebilir misin, böyle bir şey yapmak mümkün mü? "- @ dimen / anyvalue"? Bildirilen değeri çağırmak istiyorum ama negatif. Yardım.
deadfish

2
@ 100kg: Maalesef bu desteklenmiyor.
CommonsWare

21
Android 4.4 KitKat'ta negatif marjlarla ilgili bir şeylerin değiştiğini fark ettim (4.3'e kıyasla; en azından Asus Nexus 7'de). İhtiyaç duyduğunuz android:clipChildren="false"ve android:clipToPadding="false"daha önce nerede olmadığınız veya işler böyle bittiği ortaya çıktı .
Jonik

18

Umarım bu birine yardımcı olur. ConstraintLayout@ CommonsWare'in yanıtına dayalı olarak çalışan örnek kod :

Temel görünümünüzün alt kısmına bir yardımcı görünüm (yükseklik 0dp, ebeveyn ile sınırlandırılmış genişlik) ekleyin, alt tarafa istediğiniz kenar boşluğunu ekleyin. Ardından, görünümünüzü bunun altında konumlandırın ve desteklenmeyen negatif bir değer kullanmak zorunda kalmadan, etkin bir şekilde "negatif" bir kenara sahip olmasına izin verin.

Basit kod:

<TextView
    android:id="@+id/below"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#F1B36D"
    android:padding="30dp"
    android:text="I'm below"
    android:textColor="#ffffff"
    android:textSize="48sp"
    android:textAlignment="center"
    tools:layout_editor_absoluteX="129dp"
    tools:layout_editor_absoluteY="0dp" />

<android.support.v4.widget.Space
    android:id="@+id/space"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:layout_marginBottom="32dp"
    app:layout_constraintBottom_toBottomOf="@+id/below"
    app:layout_constraintLeft_toLeftOf="@id/below"
    app:layout_constraintRight_toRightOf="@id/below" />

<TextView
    android:id="@+id/top"
    android:layout_width="100dp"
    android:layout_height="60dp"
    android:textAlignment="center"
    android:textColor="#ffffff"
    android:text="I'M ON TOP!"
    android:background="#676563"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/space" />

Çıktı:

görüntü açıklamasını buraya girin


16

Negatif kenar boşluğu kullanmak istemeniz durumunda, container ve clipToPadding için yeterli dolguyu false olarak ayarlayın ve çocukları için negatif kenar boşluğu ayarlayın, böylece çocuk görünümünü kırpmasın !


4

Geçmişte kötü bir uygulama olabilirdi, ancak Materyal Tasarım ve onun hareketli eylem düğmeleri ile artık birçok durumda kaçınılmaz ve gerekli görünüyor. Temel olarak, tek bir RelativeLayout'a koyamayacağınız iki ayrı mizanpajınız olduğunda, bunlar belirgin şekilde ayrı bir işleme ihtiyaç duyuyorlarsa (örneğin, başlık ve içerikleri düşünün), FAB'yi üst üste getirmenin tek yolu, onu bunlardan birinden ayırmaktır. negatif kenar boşlukları kullanan düzenler. Bu da tıklanabilir alanlarda ek sorunlar yaratır.


3

Benim için ve bir TextView'da negatif bir kenar boşluğu belirleme konusunda (OP'nin bir ViewGroup'a atıfta bulunduğunu fark ettim, ancak negatif kenar boşlukları ayarlama ile ilgili sorunlar arıyordum ve buraya geldim) ... 4.0.3 ile ilgili bir sorun buldum ( API 15) YALNIZCA ve android:layout_marginTopveya ayarıandroid:layout_marginBottom -2dp gibi negatif bir değere ayarına.

Bazı nedenlerden dolayı TextView hiç görüntülenmiyor. Görünüşe göre "gitmiş" gibi görünüyor (sadece görünmez değil).

Bunu layout_margin'in diğer 3 sürümüyle denediğimde sorunu görmedim.

Bunu gerçek bir cihazda denemediğime dikkat edin, bu bir 4.0.3 emülatörü kullanıyor. Bu, yalnızca 4.0.3'ü etkilediğini bulduğum 2. garip şey, bu yüzden yeni kuralım her zaman bir 4.0.3 emülatörü ile test etmektir :)

Elimde android:lineSpacingExtra="-2dp"olsa bile işe yarayan bir TextView alt kenar boşluğunu azaltma konusunda başarılı oldum android:singleLine="true"(ve bu yüzden satır aralığının bir faktör olacağını düşünmemiştim).


1
Nexus 4 (xhdpi olan) ve 4.2.2'de benzer davranış buldum. Bir ana sayfa düzeninde dolgu olmasına rağmen, dolgusuz bir düzen vardı. Negatif marginTop ile bir TextView vardı. 5.0'da iyi çalıştı. Hem cihazda hem de Nexus 4 emülatöründe 4.2.2'de kaybolur. Çözüm, dolguyu TextView içeren düzene taşımaktı.
louielouie

3

Hayır, kullanmamalısın negative margin. bunun yerine kullanmalısınız translate. Negatif kenar boşluğu bazen işe yarasa bile, düzeni programlanabilir bir şekilde değiştirdiğinizde çeviri yardımcı olacaktır. Kenar boşluğunu kullandığınızda görünüm ekranı aşamaz.


0

Bunun oldukça kısa bir süre için mümkün olduğunu biliyordum. Ama bunda bir sorun görmüyorum. Sadece ekran boyutlarına ve benzerlerine dikkat edin, böylece ekranda üst üste binmemesi gereken öğeleri yanlışlıkla yapmayacağınızdan emin olun. (yani metnin üstündeki metin muhtemelen kötü bir fikirdir.)

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.