Bir Kısıtlama içindeki Wrap_content görünümüDüzen ekranın dışına uzanır


132

Kullanarak basit bir sohbet balonu uygulamaya çalışıyorum ConstraintLayout. Başarmaya çalıştığım şey bu:

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

Ancak, wrap_contentkısıtlamalarla düzgün çalışmıyor gibi görünüyor. Kenar boşluklarına saygı duyar, ancak kullanılabilir alanı doğru hesaplamaz. İşte düzenim:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.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="wrap_content">

    <TextView
        android:id="@+id/chat_message"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="16dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintHorizontal_bias="0"
        tools:background="@drawable/chat_message_bubble"
        tools:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris sodales accumsan tortor at bibendum."
        android:layout_marginStart="64dp"
        android:layout_marginLeft="64dp"
        android:layout_marginEnd="32dp"
        android:layout_marginRight="32dp"
        android:layout_marginTop="8dp"
        android:layout_marginBottom="8dp" />
</android.support.constraint.ConstraintLayout>

Bu şu şekilde işler:

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

Ben kullanıyorum com.android.support.constraint:constraint-layout:1.0.0-beta4.

Yanlış bir şey mi yapıyorum? Bu bir hata mı yoksa sadece sezgisel olmayan bir davranış mı? A kullanarak uygun davranışı elde edebilir miyim ConstraintLayout(diğer düzenleri kullanabileceğimi biliyorum, ConstrainLayoutözellikle soruyorum ).


metin görünümünü üst sınırlama düzeniyle birlikte gönderebilir misiniz? bildiğiniz gibi, ebeveyn düzeninin niteliklerinin çocuk üzerinde büyük etkisi var
Muhammed Atif

Bu arada, senin durumunda sanırım suçlu yatay önyargı. sağdan ve önyargılı düzeni kaldırmayı deneyin
Muhammed Atif

1
Yatay önyargı gereklidir, aksi takdirde balon ortalanmışsa. Düzen olmadan sağdan sağa doğru marj hesaba katılmayacaktır, ki bu bizim istediğimiz şey değil. Önerdiğiniz gibi onları çıkarmaya çalıştım, ancak yardımcı olmadı.
Marcin Jedynak

1
problem kesinlikle yatay sapma 0. Olası çözümleri kontrol edeceğim ve kısıtlama düzeninde benzer bir şeyle çalıştığım için en kısa sürede göndereceğim.
Muhammed Atif

1
@nmu sohbet balonu geliyor tools:background="@drawable/chat_message_bubble". Bunu uygulamak için çekilebilir klasörde chat_message_bubble.xml dosyası oluşturmanız ve ardından bu kodu eklemeniz gerekir: <shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="#FB4382"/> <corners android:radius="10dip"/> </shape>
Eugene Brusov

Yanıtlar:


242

Güncel değil: Daha iyi yanıtı görün

Hayır, bugün olduğu gibi ConstraintLayout ile istediğinizi yapamazsınız (1.0 beta 4):

  • wrap_content yalnızca widget'tan kendisini ölçmesini ister, ancak genişlemesini olası kısıtlamalara karşı sınırlamaz
  • match_constraints(0DP) olacak kısıtlamaları karşı widget boyutunu sınırlamak ... ama bile onları maç olacak wrap_contentya istemiyor budur, daha küçük olurdu (ilk örnek).

Yani şu anda, bu özel durum için şansınız yok: - /

Şimdi ... match_constraintsBu tam senaryo ile başa çıkmak için ekstra yetenekler eklemeyi düşünüyoruz ( wrap_contentboyut kısıtlamalardan daha fazla bitmedikçe davranmak ).

Bu yeni özelliğin 1.0 sürümünden önce yapılacağına söz veremem.

Düzenleme : Bu özelliği 1.0'da öznitelikle app:layout_constraintWidth_default="wrap"ekledik (genişlik 0dp olarak ayarlandı). Ayarlanırsa, widget, wrap_content kullanılıyormuş gibi aynı boyuta sahip olacak, ancak kısıtlamalarla sınırlı olacaktır (yani, bunların ötesine genişlemeyecektir)

Güncelle Bu etiketler artık kullanımdan kaldırılmıştır, bunun yerine layout_width = "WRAP_CONTENT" ve layout_constrainedWidth = "true" kullanın.


1
Bu benim için süper bir sorun. Şu anda TextView'ı bileşik çekmecelerle kullanamıyorum çünkü eğer onu match_constraintsbileşik çekilebilir olarak ayarlarsam , çok kısa metin olsa bile en sağda olacak.
Paul Woitaschek

2
@NicolasRoard: Kısıtlama düzeninde bana yardımcı olabilir misiniz, üst yarıda 0.4 yönergesi ve içeriği aşağıda olan bir resmim var, ancak kısıtlama düzenini wrap_content olarak ayarladığımda ekranın yalnızca 0,4'ünü (ve aşağıdaki metinler görünür değil), ben de kullandım app:layout_constraintWidth_default="wrap"ve kütüphanenin v1.0.2'si ama yardımcı olmuyor
Rat-a-tat-a-tat Ratatouille

3
app: layout_constraintWidth_default = "wrap" 0dp güzelce yaptığı gibi genişlikte!
Tunji_D

11
bu belgelerde / talimatlarda AÇIK olmalıdır.
SQLiteNoob

6
Düzenleme daha fazla öne çıkması için hareket etmeli mi? Orijinalin altında kaybolur. Cevabı takdir edin. Teşekkürler @NicolasRoard.
Tom Howard

276

Güncellendi (ConstraintLayout 1.1. +)

kullanımı app:layout_constrainedWidth="true"ileandroid:layout_width="wrap_content"

Daha önce (kullanımdan kaldırıldı):

app:layout_constraintWidth_default="wrap" ile android:layout_width="0dp"


5
Doğru, ConstraintLayout 1.1.0 beta 2'den beri inanıyorum. androidstudio.googleblog.com/2017/10/…
Fifer Sheep

2
Bu şimdi 1.1 sürümünde: medium.com/google-developers/…
Esdras Lopez

aşk yığın aşımı! teşekkürler bu bana yardımcı oldu! içeriği saklayın, ancak asla kısıtlamanın ötesine geçmeyin! #TIL
Dennis Anderson

Ne cevap, bunun var olduğunu bilmiyordum! Teşekkürler dostum, alternatiflerle 2 saat oynadıktan sonra bu bir zevkti!
dev2505

23

Tarafından verilen cevapta belirtildiği şekilde Evet, Nikolas roard eklemek gerekir app:layout_constraintWidth_default="wrap"ve 0DP için ayarlanan genişliği. Ve baloncuğunuzu doğru hizalamak için 1.0 ayarlamalısınız layout_constraintHorizontal_bias.

İşte son kaynak kodu:

<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView
        android:id="@+id/chat_message"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:padding="16dp"
        android:layout_marginTop="8dp"
        android:layout_marginStart="64dp"
        android:layout_marginEnd="8dp"
        android:layout_marginBottom="8dp"
        app:layout_constraintHorizontal_bias="1.0"
        app:layout_constraintWidth_default="wrap"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        android:background="@drawable/chat_message_bubble"
        android:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris sodales accumsan tortor at bibendum." />

</android.support.constraint.ConstraintLayout>

Sonuç olarak şuna benziyor:

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


Bence bunun nedeni OP'nin solda küçük balon
istemesi

2
buradaki önemli kısımapp:layout_constraintHorizontal_bias="1.0"
Lester

9

Daha önce de söylediğim gibi, ConstraintLayout 1.0'dan beri bunu başarmak mümkün, ancak en yeni sürümden (1.1.x) itibaren bunu yapma şeklinizi değiştirdiler.

ConstraintLayout 1.1'in yayımlanmasından bu yana, eski app:layout_constraintWidth_default="wrap"ve app:layout_constraintHeight_default="wrap"öznitelikler artık kullanımdan kaldırılmıştır .

Bir wrap_contentdavranış sağlamak , ancak yine de Görünümünüz üzerindeki kısıtlamaları uygulamak istiyorsanız , belgelerde belirtildiği gibi genişliğini ve / veya yüksekliğini ve / veya öznitelikleriyle wrap_contentbirleştirilecek şekilde ayarlamalısınız :app:layout_constrainedWidth=”true|false”app:layout_constrainedHeight=”true|false”

WRAP_CONTENT: kısıtlamaları zorlama (1.1'de Eklendi) Eğer bir boyut WRAP_CONTENT olarak ayarlanmışsa, 1.1'den önceki sürümlerde bu boyutlar birebir boyut olarak değerlendirilecektir - yani, kısıtlamalar ortaya çıkan boyutu sınırlamayacaktır. Genel olarak bu yeterli (ve daha hızlı) olsa da, bazı durumlarda, WRAP_CONTENT kullanmak isteyebilir, ancak sonuçta ortaya çıkan boyutu sınırlandırmak için kısıtlamaları uygulamaya devam edebilirsiniz. Bu durumda, ilgili özniteliklerden birini ekleyebilirsiniz:

app: layout_constrainedWidth = ”true | false” app: layout_constrainedHeight = ”true | false”

En son sürüme gelince, bunu yanıtladığımda, ConstraintLayout 1.1.2 sürümündedir .


3

Uygulamanın kullanımdan kaldırılması: layout_constraintWidth_default metni ve alternatifi

@ nicolas-roard'ın yanıtı app:layout_constraintWidth_default="wrap"ve android:layout_width="0dp"artık KULLANIMDAN KALDIRILDI .

Devam edin ve kullanın app:layout_constrainedWidth="true"ve android:layout_width="wrap_content".

Kullanımdan kaldırmanın nedeni bilmiyorum. Ancak ConstraintLayout kaynak kodunda hakkı


-7

Bunu kullanıyorum

app:layout_constraintEnd_toEndOf="parent"

bu nasıl ve OP'nin sorusu? bu içeriği nasıl sarıyor?
Alex

-8

Değiştirmelisin

android:layout_width="wrap_content"

ile

android:layout_width="match_parent"

TextView'unuzdan ve ardından dolgu ve kenar boşluğunu buna göre ayarlayın. Kodunuzu güncelledim

<android.support.constraint.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="wrap_content">

<TextView
    android:id="@+id/chat_message"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginBottom="8dp"
    android:layout_marginEnd="10dp"
    android:layout_marginLeft="60dp"
    android:layout_marginRight="10dp"
    android:layout_marginStart="60dp"
    android:layout_marginTop="8dp"
    android:padding="16dp"
    app:layout_constraintTop_toTopOf="parent"
    tools:background="#c9c7c7"
    tools:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris sodales accumsan tortor at bibendum." />

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


Bir ConstraintLayout'ta herhangi bir görünüm için "match_parent" kullanmaktan kaçınmalısınız. Burada
Eugene Brusov
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.