Setel lebar agar sesuai dengan batasan di ConstraintLayout


98

Saya ingin membatasi sisi kiri dan kanan View ke margin tampilan induknya dan membuatnya mengisi ruang yang dialokasikan. Namun, mengatur lebar ke salah satu match_parentatau wrap_contenttampaknya menghasilkan hasil yang sama.

Apakah ada sesuatu yang setara dengan match_constraints (berbeda dengan match_parent dan wrap_content)? Apakah match_parentdan wrap_contentmemengaruhi tata letak atau diabaikan dalam tata letak batasan baru?

Saya menyukai sistem tata letak baru ini untuk platform favorit saya!


1
Mengapa match_parenttidak berhasil untuk Anda?
Eugen Martynov

Jawaban:


126

match_parenttidak didukung. Dengan 0dp, Anda dapat menganggap batasan Anda sebagai 'terukur' daripada 'mengisi apa yang tersisa'.

Juga, 0dpdapat ditentukan oleh posisi, di mana match_parentbergantung pada induknya untuk posisinya (x, y dan lebar, tinggi)


31
mengapa jawaban ini diterima?!? match_parent tidak didukung oleh tata letak batasan. Dan jawaban ini tidak memberikan cara untuk mengimplementasikannya.
Daniele Segato

3
match_parent tidak didukung.
Nicolas Roard

7
Jawaban ini benar. Ini dengan jelas menyatakan match_parent tidak didukung. Selain itu, untuk melakukan alternatif yang wajar ke setelan 'match_parent', 0dp dengan batasan yang disetel ke induk di kiri dan kanan (margin 0 atau pilih sesuai) akan memberikan hasil yang sama. Satu-satunya hal yang benar-benar ditinggalkan dalam jawaban ini, yang ada dalam jawaban Arieck, adalah kebutuhan untuk menetapkan batasan di kedua sisi (atau atas dan bawah untuk vertikal). Ini adalah cara saya melakukannya dan saya tidak memiliki masalah apa pun. Selain itu, alat ini berfungsi sebagai pengaturan bobot saat digunakan dengan komponen lain.
Eric Engel

Jika seseorang datang ke sini mencari jawaban karena tidak berhasil. Tampaknya itu rusak dalam versi beta. Tampaknya berfungsi di 1.0.2. Hal yang dipelajari - bekukan perpustakaan, jangan gunakan pembaruan oportunistik.
inteist

1
Komentar @Tequilaman bisa jadi jawabannya. Dia dengan tepat menunjukkan cara menerapkannya. Buat pembatas di kedua sisi dengan margin 0dp, itu berhasil.
Utkarsh Mankad

170

match_parenttidak diizinkan. Tapi Anda sebenarnya bisa menyetel lebar dan tinggi ke 0dp dan menyetel batasan atas dan bawah atau kiri dan kanan ke "induk".

Jadi misalnya jika Anda ingin memiliki match_parentbatasan pada lebar elemen, Anda dapat melakukannya seperti ini:

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

4
Tim Android harus membuat "match_parent" berfungsi. Ini akan sangat mudah. Cukup buat match_parent menyediakan fungsionalitas yang sama seperti jika aplikasi dibatasi pada awal dan akhir induk. Akan mudah untuk dideteksi secara vertikal maupun horizontal.
bharv14

Tapi bukankah 0dp menghasilkan ukuran ganda?
Pramod Garg

25

Ternyata match_parentadalah:

  • TIDAK OK untuk dilihat langsung di bawahConstraintLayout
  • OK untuk tampilan yang bersarang di dalam tampilan yang berada langsung di bawahConstraintLayout

Jadi jika Anda membutuhkan tampilan Anda berfungsi sebagai match_parent, maka:

  1. Anak-anak langsung dari ConstraintLayoutharus menggunakan0dp
  2. Elemen bersarang (misalnya, cucu hingga ConstraintLayout) dapat digunakanmatch_parent

Contoh:

<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>

bagaimana dengan ConstraintLayout yang bersarang di ConstraintLayout, dalam contoh Anda, ubah TextInputLayout menjadi ConstraintLayout?
super


13

Dari dokumen resmi :

Penting: MATCH_PARENT tidak disarankan untuk widget yang terdapat dalam ConstraintLayout. Perilaku serupa dapat didefinisikan dengan menggunakan MATCH_CONSTRAINT dengan batasan kiri / kanan atau atas / bawah yang sesuai yang disetel ke "induk".

Jadi jika Anda ingin mencapai MATCH_PARENTefek, Anda dapat melakukan ini:

<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

Anda dapat memeriksa Adaptor Anda.

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

Saya memiliki masalah yang sama seperti Anda ketika saya menggunakan 1. Anda dapat mencoba 2.


Ini emas! Terima kasih!
grrigore

3

Untuk membuat view anda sebagai match_parent tidak bisa dilakukan secara langsung, tapi kita bisa melakukannya dengan cara yang sedikit berbeda, tapi jangan lupa untuk menggunakan atribut Left dan Right dengan Start dan End, karena jika menggunakan RTL support akan dibutuhkan.

    <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

atur lebar atau tinggi (apa pun yang Anda butuhkan untuk mencocokkan induk) ke 0dp dan atur margin kiri, kanan, atas, bawah untuk bertindak sebagai orang tua yang cocok


1

di dokumen kantor: https://developer.android.com/reference/android/support/constraint/ConstraintLayout

Saat dimensi disetel ke MATCH_CONSTRAINT, perilaku default adalah membuat ukuran yang dihasilkan mengambil semua ruang yang tersedia.

Menggunakan 0dp, yang setara dengan "MATCH_CONSTRAINT"

Penting: MATCH_PARENT tidak disarankan untuk widget yang terdapat dalam ConstraintLayout. Perilaku serupa dapat didefinisikan dengan menggunakan MATCH_CONSTRAINT dengan batasan kiri / kanan atau atas / bawah yang sesuai ditetapkan ke "induk"


0

Jika Anda ingin TextView di tengah induk ..
Tata letak utama Anda adalah Constraint Layout

<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

Saya menemukan satu jawaban lagi ketika ada tata letak kendala di dalam tampilan gulir yang perlu kita letakkan

android:fillViewport="true"

ke tampilan gulir

dan

android:layout_height="0dp"

dalam tata letak batasan

Contoh:

<?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>
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.