ConstraintLayout'taki kısıtlamalara uyacak şekilde genişliği ayarlayın


98

Bir Görünümün sol ve sağ taraflarını ana görünümün kenar boşluklarıyla sınırlandırmak ve ayrılan alanı doldurmasını sağlamak istiyorum. Ancak, her iki genişlik ayarlama match_parentya da wrap_contentgörüntülenene aynı sonucu elde etmek için.

Match_constraints'e eşdeğer bir şey var mı (match_parent ve wrap_content'in aksine)? Düzeni etkiler match_parentve wrap_contentetkiler mi yoksa yeni kısıtlama düzeninde yok sayılırlar mı?

En sevdiğim platform için bu yeni düzen sistemini seviyorum!


1
Neden match_parentsenin için çalışmıyor?
Eugen Martynov

Yanıtlar:


128

match_parentdesteklenmiyor. İle 0dp, kısıtlamalarınızı 'kalanları doldurmak' yerine 'ölçeklenebilir' olarak düşünebilirsiniz.

Ayrıca, konumu (x, y ve genişlik, yükseklik) için ebeveynine bağlı olan 0dpbir konumla tanımlanabilir.match_parent


31
bu cevap neden kabul edildi?!? match_parent kısıtlama düzeni tarafından desteklenmez. Ve bu cevap, onu uygulamanın hiçbir yolunu vermez.
Daniele Segato

3
match_parent desteklenmiyor.
Nicolas Roard

7
Bu cevap doğrudur. Match_parent desteklenmediğini açıkça belirtir. Ayrıca, bir 'match_parent' ayarına makul bir alternatif gerçekleştirmek için, kısıtlamalar solda ve sağda ebeveyn olarak ayarlanmış 0dp (0dp veya uygun seçim) aynı sonucu verecektir. Arieck'in cevabında olan bu cevapta gerçekten dışarıda bırakılan tek şey, her iki taraf için (veya dikey için üst ve alt) sınırlamalar koyma ihtiyacıdır. Ben böyle yapıyorum ve herhangi bir sorun yaşamadım. Ayrıca, diğer bileşenlerle birlikte kullanıldığında ağırlık ayarı olarak çalışır.
Eric Engel

Birisi buraya gelip de işe yaramadığının cevabını ararsa. Görünüşe göre beta olarak kırılmış. 1.0.2'de çalışıyor gibi görünüyor. Alınan ders - kütüphaneleri dondurun, fırsatçı güncellemeleri kullanmayın.
2018

1
@Tequilaman yorumu cevap olabilir. Haklı olarak onu uygulamanın yolunu işaret etti. Her iki tarafta 0dp marjlı bir sınırlama oluşturun, hile yapar.
Utkarsh Mankad

170

match_parentMüsade edilmez. Ama aslında genişlik ve yüksekliği 0dp olarak ayarlayabilir ve üst ve alt ya da sol ve sağ kısıtlamaları "ana" olarak ayarlayabilirsiniz.

Örneğin match_parent, elemanın genişliğinde kısıtlamaya sahip olmak istiyorsanız , bunu şu şekilde yapabilirsiniz:

<TextView
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintEnd_toEndOf="parent"/>

4
Android ekibi "match_parent" işleminin çalışmasını sağlamalıdır. Son derece kolay olurdu. Match_parent yapmak, uygulamanın ebeveynin başlangıcı ve bitişi ile sınırlandırılmış gibi aynı işlevselliği sağlamanız yeterlidir. Dikey veya yatay olarak tespit etmek kolay olacaktır.
bharv14

Ama 0dp çift ölçümle sonuçlanmaz mı?
Pramod Garg

25

Görünüşe göre match_parent:

  • Doğrudan altındaki görünümler için uygun DEĞİLDİRConstraintLayout
  • Tamam görünümler için doğrudan altındadır görüşlerin iç içeConstraintLayout

Dolayısıyla, görüşlerinizin işlev görmesine ihtiyacınız varsa match_parent, o zaman:

  1. Doğrudan çocuklar arasında ConstraintLayoutkullanmalıdır0dp
  2. İç içe geçmiş öğeler (ör. Torundan Kısıtlama Düzeni'ne) kullanabilirmatch_parent

Misal:

<android.support.constraint.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingBottom="16dp">

    <android.support.design.widget.TextInputLayout
        android:id="@+id/phoneNumberInputLayout"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent">

        <android.support.design.widget.TextInputEditText
            android:id="@+id/phoneNumber"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>

    </android.support.design.widget.TextInputLayout>

ConstraintLayout içinde yuvalanmış bir ConstraintLayout hakkında, örneğinizde TextInputLayout'u bir ConstraintLayout olarak değiştirin?
superuser

16

match_parenttarafından desteklenmiyor ConstraintLayout. 0dpKısıtlamalarla eşleşmesine izin vermek için genişliği olarak ayarlayın .


ve wrap_content destekleniyor mu?
KG6ZVP

Evet, söyleyebileceğim kadarıyla.
Marcin Koziński

6
wrap_content destekleniyor
Romain Guy

13

Gönderen resmi doc :

Önemli: MATCH_PARENT, bir ConstraintLayout'ta bulunan widget'lar için önerilmez. Benzer davranış, MATCH_CONSTRAINT kullanılarak karşılık gelen sol / sağ veya üst / alt kısıtlamaların "ana" olarak ayarlanmasıyla tanımlanabilir.

Yani MATCH_PARENTetki elde etmek istiyorsanız , bunu yapabilirsiniz:

<TextView
    android:id="@+id/textView"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:text="TextView"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent" />

4

Adaptörünüzü kontrol edebilirsiniz.

 1 - MyLayoutBinding binding = MyLayoutBinding.inflate(layoutInflater);
 2 - MyLayoutBinding binding = MyLayoutBinding.inflate(layoutInflater, viewGroup, false);

1. kullandığım zaman senin gibi aynı problemi yaşadım. 2 deneyebilirsiniz.


Bu altın! Teşekkür ederim!
2019

3

Görüşünüzü match_parent olarak yapmak doğrudan mümkün değildir, ancak bunu biraz farklı bir şekilde yapabiliriz, ancak Sol ve Sağ özelliğini Başlangıç ​​ve Bitiş ile kullanmayı unutmayın, çünkü eğer RTL desteği kullanıyorsanız, buna ihtiyaç duyulacaktır.

    <Button
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"/>

2

genişliği veya yüksekliği (ebeveyn ile eşleşmek için ihtiyacınız olan her şeyi) 0dp olarak ayarlayın ve ebeveynle eşleşecek şekilde sol, sağ, üst, alt kenar boşluklarını ayarlayın


1

ofis dokümanında: https://developer.android.com/reference/android/support/constraint/ConstraintLayout

Bir boyut MATCH_CONSTRAINT olarak ayarlandığında, varsayılan davranış, elde edilen boyutun tüm kullanılabilir alanı almasıdır.

"MATCH_CONSTRAINT" ile eşdeğer olan 0dp kullanma

Önemli: MATCH_PARENT, bir ConstraintLayout'ta bulunan widget'lar için önerilmez. Benzer davranış, MATCH_CONSTRAINT kullanılarak karşılık gelen sol / sağ veya üst / alt kısıtlamaların "üst" olarak ayarlanmasıyla tanımlanabilir


0

Metin
Görünümü'nün üst öğenin merkezinde olmasını istiyorsanız .. Ana düzeniniz Kısıtlama Düzeni'dir.

<androidx.appcompat.widget.AppCompatTextView
     android:layout_width="0dp"
     android:layout_height="wrap_content"
     android:text="@string/logout"
     app:layout_constraintLeft_toLeftOf="parent"
     app:layout_constraintRight_toRightOf="parent"
     android:gravity="center">
</androidx.appcompat.widget.AppCompatTextView>

0

Kaydırma görünümünün içinde bir kısıtlama düzeni olduğunda bir cevap daha buldum, sonra şunu koymamız gerekiyor

android:fillViewport="true"

kaydırma görünümüne

ve

android:layout_height="0dp"

kısıtlama düzeninde

Misal:

<?xml version="1.0" encoding="utf-8"?>
<ScrollView 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"
        android:fillViewport="true">

    <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="0dp">

// Rest of the views

</androidx.constraintlayout.widget.ConstraintLayout>

</ScrollView>
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.