Membangun UI yang responsif dengan ConstraintLayout Bagian dari Android Jetpack.

Mencoba cara Compose
Jetpack Compose adalah toolkit UI yang direkomendasikan untuk Android. Pelajari cara menggunakan tata letak di Compose.

ConstraintLayout memungkinkan Anda membuat tata letak yang besar dan kompleks dengan hierarki tampilan datar, tanpa grup tampilan bertingkat. Mirip dengan RelativeLayout karena semua tampilan ditata sesuai dengan hubungan antara tampilan yang setara dan tata letak induk, tetapi lebih fleksibel daripada RelativeLayout dan lebih mudah digunakan dengan Layout Editor Android Studio.

Semua kecanggihan ConstraintLayout tersedia langsung dari alat visual Layout Editor, karena API tata letak dan Layout Editor dibangun khusus untuk satu sama lain. Anda dapat membuat tata letak menggunakan ConstraintLayout sepenuhnya dengan menariknya, bukan mengedit XML.

Halaman ini menunjukkan cara membuat tata letak dengan ConstraintLayout di Android Studio 3.0 atau yang lebih tinggi. Untuk mengetahui informasi selengkapnya tentang Layout Editor, lihat Membangun UI dengan Layout Editor.

Untuk melihat berbagai tata letak yang bisa Anda buat dengan ConstraintLayout, lihat project Contoh Tata Letak Batasan di GitHub.

Ringkasan terkait batasan

Untuk menentukan posisi tampilan di ConstraintLayout, Anda perlu menambahkan setidaknya satu batasan horizontal dan satu vertikal untuk tampilan tersebut. Setiap batasan mewakili koneksi atau perataan dengan tampilan lain, tata letak induk, atau panduan yang tidak terlihat. Setiap batasan menentukan posisi tampilan di sepanjang sumbu vertikal atau horizontal. Setiap tampilan harus memiliki minimal satu batasan untuk setiap sumbu, tetapi sering kali diperlukan lebih banyak.

Saat Anda melepas tampilan ke Layout Editor, tampilan akan tetap berada di tempat Anda meninggalkannya meskipun tidak memiliki batasan. Hal ini bertujuan untuk memudahkan pengeditan. Jika tidak memiliki batasan saat Anda menjalankan tata letak di perangkat, tampilan akan digambar pada posisi [0,0] (sudut kiri atas).

Di gambar 1, tata letak terlihat bagus di editor, tetapi tidak ada batasan vertikal di tampilan C. Jika tata letak ini digambar di perangkat, tampilan C akan disejajarkan secara horizontal dengan tepi kiri dan kanan tampilan A, tetapi akan muncul di bagian atas layar karena tidak memiliki batasan vertikal.

Gambar 1. Editor menampilkan tampilan C di bawah A, tetapi tidak memiliki batasan vertikal.

Gambar 2. Tampilan C sekarang dibatasi secara vertikal di bawah tampilan A.

Meskipun tidak adanya batasan tidak menyebabkan error kompilasi, Layout Editor menunjukkan tidak adanya batasan sebagai error di toolbar. Untuk menampilkan error dan peringatan lainnya, klik Show Warnings and Errors . Untuk membantu Anda menghindari tidak adanya batasan, Layout Editor otomatis menambahkan batasan untuk Anda dengan fitur Autoconnect and inferconstraint.

Menambahkan ConstraintLayout ke project Anda

Untuk menggunakan ConstraintLayout di project Anda, lakukan langkah berikut:

  1. Pastikan Anda memiliki repositori maven.google.com yang dideklarasikan di file settings.gradle:

    Groovy

        dependencyResolutionManagement {
          ...
          repositories {
              google()
          }
        )
        

    Kotlin

        dependencyResolutionManagement {
          ...
          repositories {
              google()
          }
        }
        
  2. Tambahkan library sebagai dependensi dalam file build.gradle level modul, seperti yang ditunjukkan dalam contoh berikut. Versi terbaru mungkin berbeda dengan yang ditunjukkan dalam contoh.

    Groovy

    dependencies {
        implementation "androidx.constraintlayout:constraintlayout:2.2.0-alpha13"
        // To use constraintlayout in compose
        implementation "androidx.constraintlayout:constraintlayout-compose:1.1.0-alpha13"
    }
    

    Kotlin

    dependencies {
        implementation("androidx.constraintlayout:constraintlayout:2.2.0-alpha13")
        // To use constraintlayout in compose
        implementation("androidx.constraintlayout:constraintlayout-compose:1.1.0-alpha13")
    }
    
  3. Di notifikasi sinkronisasi atau toolbar, klik Sync Project with Gradle Files.

Sekarang Anda sudah siap untuk membuat tata letak menggunakan ConstraintLayout.

Mengonversi tata letak

Gambar 3. Menu untuk mengonversi tata letak menjadi ConstraintLayout.

Untuk mengonversi tata letak yang ada menjadi tata letak terbatas, ikuti langkah-langkah berikut ini:

  1. Buka tata letak Anda di Android Studio, lalu klik tab Design di bagian bawah jendela editor.
  2. Di jendela Component Tree, klik kanan tata letak, lalu klik Convert LinearLayout to ConstraintLayout.

Membuat tata letak baru

Untuk memulai file tata letak terbatas yang baru, ikuti langkah-langkah berikut ini:

  1. Di jendela Project, klik folder modul, lalu pilih File > New > XML > Layout XML.
  2. Masukkan nama untuk file tata letak dan masukkan "androidx.constraintlayout.widget.ConstraintLayout" untuk Root Tag.
  3. Klik Finish.

Menambahkan atau menghapus batasan

Untuk menambahkan batasan, lakukan langkah-langkah berikut:

Video 1. Sisi kiri tampilan dibatasi ke sisi kiri induk.

  1. Tarik tampilan dari jendela Palette ke editor.

    Saat Anda menambahkan tampilan di ConstraintLayout, tampilan akan ditampilkan dalam kotak pembatas dengan tuas pengubah ukuran persegi di setiap sudut dan tuas batasan melingkar di setiap sisi.

  2. Klik tampilan untuk memilihnya.
  3. Lakukan salah satu hal berikut:
    • Klik tuas pembatas kemudian tarik ke titik link yang tersedia. Titik ini bisa menjadi tepi tampilan lain, tepi tata letak, atau panduan. Perhatikan bahwa saat Anda menarik tuas batasan, Layout Editor akan menampilkan anchor koneksi potensial dan overlay biru.
    • Klik salah satu tombol Create a connection di bagian Layout jendela Attributes, seperti yang ditunjukkan pada gambar 4.

      Gambar 4. Bagian Layout jendela Attributes memungkinkan Anda membuat koneksi.

Saat batasan dibuat, editor memberinya margin default untuk memisahkan kedua tampilan tersebut.

Saat membuat batasan, ingat aturan berikut:

  • Setiap tampilan harus memiliki minimal dua batasan: satu horizontal dan satu vertikal.
  • Anda hanya dapat membuat batasan di antara tuas batasan dan titik link yang memiliki bidang yang sama. Bidang vertikal—sisi kiri dan kanan—tampilan hanya dapat dibatasi ke bidang vertikal lainnya, dan dasar pengukuran hanya dapat dibatasi untuk dasar pengukuran lainnya.
  • Setiap tuas batasan dapat digunakan hanya untuk satu batasan, tetapi Anda dapat membuat beberapa batasan dari tampilan yang berbeda ke titik link yang sama.

Anda dapat menghapus batasan dengan melakukan salah satu langkah berikut:

  • Klik batasan untuk memilihnya, lalu klik Delete.
  • Klik Control (Command-klik di macOS) anchor batasan. Batasan berubah menjadi merah untuk menunjukkan bahwa Anda dapat mengklik untuk menghapusnya, seperti ditunjukkan dalam gambar 5.

    Gambar 5. Batasan berwarna merah menunjukkan bahwa Anda dapat mengklik untuk menghapusnya.

  • Di bagian Layout jendela Attributes, klik anchor batasan, seperti ditunjukkan dalam gambar 6.

    Gambar 6. Klik anchor batasan untuk menghapusnya.

Video 2. Menambahkan batasan yang berlawanan dengan yang sudah ada.

Jika Anda menambahkan batasan yang berlawanan pada tampilan, garis batasan akan melilit seperti pegas untuk menunjukkan gaya yang berlawanan, seperti yang ditunjukkan dalam video 2. Efeknya paling terlihat saat ukuran tampilan ditetapkan ke "fixed" atau "wrap content", dalam hal ini tampilan akan dipusatkan di antara batasan. Jika Anda ingin tampilan meregangkan ukurannya agar sesuai dengan batasan, ganti ukuran ke "match constraints". Jika Anda ingin mempertahankan ukuran saat ini, tetapi memindahkan tampilan agar tidak berada di tengah, sesuaikan bias batasan.

Anda dapat menggunakan batasan untuk mencapai berbagai jenis perilaku tata letak, seperti yang dijelaskan di bagian berikut.

Posisi induk

Batasi sisi tampilan ke tepi tata letak yang sesuai.

Dalam gambar 7, sisi kiri tampilan terhubung dengan tepi kiri tata letak induk. Anda dapat menentukan jarak dari tepi dengan margin.

Gambar 7. Batasan horizontal ke induk.

Urutan posisi

Tentukan urutan tampilan untuk dua tampilan, baik secara vertikal maupun horizontal.

Di gambar 8, B dibatasi agar selalu berada di sebelah kanan A, dan C dibatasi di bawah A. Namun, batasan ini tidak menyiratkan perataan, sehingga B tetap dapat bergerak ke atas dan ke bawah.

Gambar 8. Batasan horizontal dan vertikal.

Perataan

Ratakan tepi tampilan dengan tepi yang sama dari tampilan lain.

Di gambar 9, sisi kiri B diratakan dengan sisi kiri A. Jika Anda ingin meratakan bagian tengah tampilan, buat batasan di kedua sisi.

Anda dapat melakukan offset pada perataan dengan menarik tampilan ke dalam dari batasan. Misalnya, gambar 10 menunjukkan B dengan perataan offset 24dp. Offset ditentukan oleh margin tampilan yang dibatasi.

Anda juga dapat memilih semua tampilan yang ingin diratakan, lalu klik Align di toolbar untuk memilih jenis perataan.

Gambar 9. Batasan perataan horizontal.

Gambar 10. Batasan perataan horizontal offset.

Perataan baseline

Ratakan baseline teks tampilan ke baseline teks tampilan lain.

Di gambar 11, garis pertama B diratakan dengan teks di A.

Untuk membuat batasan dasar pengukuran, klik kanan tampilan teks yang ingin Anda batasi, lalu klik Show Baseline. Kemudian klik dasar pengukuran teks dan tarik garis ke dasar pengukuran lainnya.

Gambar 11. Batasan perataan dasar pengukuran.

Dibatasi oleh panduan

Anda dapat menambahkan panduan vertikal atau horizontal yang memungkinkan Anda membatasi tampilan dan tidak terlihat oleh pengguna aplikasi Anda. Anda dapat memosisikan panduan dalam tata letak berdasarkan satuan dp atau persentase yang sesuai dengan tepi tata letak.

Untuk membuat panduan, klik Guidelines di toolbar, lalu klik Add Vertical Guideline atau Add Horizontal Guideline.

Tarik garis putus-putus untuk mengubah posisinya, lalu klik lingkaran di tepi panduan untuk beralih mode pengukuran.

Gambar 12. Tampilan yang dibatasi pada panduan.

Dibatasi oleh barrier

Serupa dengan panduan, barrier adalah garis tidak terlihat yang dapat Anda batasi tampilan, kecuali jika barrier tidak menentukan posisinya sendiri. Sebaliknya, posisi penghalang bergerak berdasarkan posisi tampilan yang ada di dalamnya. Hal ini berguna jika Anda ingin membatasi tampilan ke kumpulan tampilan, bukan satu tampilan tertentu.

Misalnya, dalam gambar 13, tampilan C dibatasi ke sisi kanan pembatas. Pembatas disetel ke "end" (atau sisi kanan, dalam tata letak kiri-ke-kanan) tampilan A dan tampilan B. Pembatas bergerak bergantung pada apakah sisi kanan tampilan A atau tampilan B adalah yang paling kanan.

Untuk membuat barrier, ikuti langkah-langkah berikut:

  1. Klik Guidelines di toolbar, lalu klik Add Vertical Barrier atau Add Horizontal Barrier.
  2. Di jendela Component Tree, pilih tampilan yang Anda inginkan di dalam barrier, lalu tarik tampilan ke komponen barrier.
  3. Pilih barrier dari Component Tree, buka jendela Attributes , lalu tetapkan barrierDirection.

Sekarang Anda dapat membuat batasan dari tampilan lain ke barrier.

Anda juga dapat membatasi tampilan yang ada di dalam barrier ke barrier. Dengan cara ini, Anda bisa menyelaraskan semua tampilan dalam pembatas satu sama lain, bahkan jika tidak tahu tampilan mana yang terpanjang atau tertinggi.

Anda juga dapat menyertakan panduan di dalam pembatas untuk memastikan posisi "minimum" untuk barrier.

Gambar 13. Tampilan C dibatasi ke barrier, yang bergerak berdasarkan posisi dan ukuran tampilan A dan tampilan B.

Menyesuaikan bias batasan

Saat Anda menambahkan batasan ke kedua sisi tampilan, dan ukuran tampilan untuk dimensi yang sama adalah "fixed" atau "wrap content", tampilan akan dipusatkan di antara dua batasan dengan bias 50% secara default. Anda dapat menyesuaikan bias dengan menarik penggeser bias di jendela Attributes atau dengan menarik tampilan, seperti yang ditunjukkan dalam video 3.

Jika Anda ingin tampilan meregangkan ukurannya agar sesuai dengan batasan, ganti ukuran ke "match constraints".

Video 3. Menyesuaikan bias batasan.

Menyesuaikan ukuran tampilan

Gambar 14. Saat memilih tampilan, jendela Attributes menyertakan kontrol untuk 1 rasio ukuran, 2 menghapus batasan, 3 mode tinggi atau lebar, 4 margin, dan 5 bias batasan. Anda juga dapat menandai setiap batasan di Layout Editor dengan mengkliknya dalam daftar batasan 6.

Anda dapat menggunakan tuas sudut untuk mengubah ukuran tampilan, tetapi ini akan melakukan hardcode pada ukuran—tampilan tidak mengubah ukuran untuk konten atau ukuran layar yang berbeda. Untuk memilih mode ukuran yang berbeda, klik tampilan dan buka jendela Attributes di sisi kanan editor.

Pemeriksa tampilan berada di dekat bagian atas jendela Attributes, yang mencakup kontrol untuk beberapa atribut tata letak, seperti ditunjukkan pada gambar 14. Ini hanya tersedia untuk tampilan dalam tata letak batasan.

Anda dapat mengubah cara penghitungan tinggi dan lebar dengan mengklik simbol yang ditunjukkan dengan pemanggilan 3 pada gambar 14. Simbol ini mewakili mode ukuran sebagai berikut. Klik simbol tersebut untuk beralih di antara setelan ini:

  • Fixed: menentukan dimensi tertentu di kotak teks berikut atau dengan mengubah ukuran tampilan di editor.
  • Wrap Content: tampilan hanya diperluas seperlunya agar pas dengan kontennya.
    • layout_RestrictedWidth
    • Tetapkan nilai ini ke true agar dimensi horizontal dapat berubah untuk mengikuti batasan. Secara default, widget yang ditetapkan ke WRAP_CONTENT tidak dibatasi oleh batasan.

  • Match Constraints: tampilan akan diperluas selebar mungkin agar memenuhi batasan di setiap sisi, setelah memperhitungkan margin tampilan. Namun, Anda dapat mengubah perilaku tersebut dengan atribut dan nilai berikut. Atribut ini hanya berlaku jika Anda menetapkan lebar tampilan ke "match constraints":
    • layout_constraintWidth_min

      Ini memerlukan dimensi dp untuk lebar minimum tampilan.

    • layout_constraintWidth_max

      Ini memerlukan dimensi dp untuk lebar maksimum tampilan.

    Namun, jika dimensi yang diberikan hanya memiliki satu batasan, tampilan akan diperluas agar sesuai dengan kontennya. Menggunakan mode ini pada tinggi atau lebar juga memungkinkan Anda menetapkan rasio ukuran.

Menyetel ukuran sebagai rasio

Gambar 15. Tampilan disetel ke aspek 16:9 dengan lebar berdasarkan rasio tinggi.

Anda dapat menyetel ukuran tampilan ke rasio, seperti 16:9, jika setidaknya salah satu dimensi tampilan disetel ke "match constraints" (0dp). Untuk mengaktifkan rasio, klik Aktifkan/Nonaktifkan Batasan Rasio Lebar Tinggi (info 1 di gambar 14) dan masukkan rasio width:height dalam input yang muncul.

Jika lebar dan tinggi disetel ke "match constraints", Anda dapat mengklik Alihkan Aspect Ratio Constraint untuk memilih dimensi mana yang didasarkan pada rasio lainnya. Pemeriksa tampilan menunjukkan dimensi yang ditetapkan sebagai rasio dengan menghubungkan tepi-tepi yang sesuai dengan garis utuh.

Misalnya, jika Anda menyetel kedua sisi ke "match constraints", klik Switch Aspect Ratio Constraint dua kali untuk menyetel lebar menjadi rasio tinggi. Seluruh ukuran ditentukan oleh tinggi tampilan, yang dapat ditentukan dengan cara apa pun, seperti ditunjukkan dalam gambar 15.

Menyesuaikan margin tampilan

Agar tampilan Anda berjarak secara merata, klik Margin di toolbar untuk memilih margin default untuk setiap tampilan yang Anda tambahkan ke tata letak. Setiap perubahan yang Anda buat pada margin default hanya berlaku untuk tampilan yang Anda tambahkan sejak saat itu.

Anda dapat mengontrol margin untuk setiap tampilan di jendela Attributes dengan mengklik angka di baris yang merepresentasikan setiap batasan. Pada gambar 14, info 4 menunjukkan margin bawah yang disetel ke 16 dp.

Gambar 16. Tombol Margin toolbar.

Semua margin yang ditawarkan oleh alat ini adalah faktor 8 dp untuk membantu tampilan Anda diselaraskan dengan rekomendasi petak persegi 8 dp Desain Material.

Mengontrol grup linear dengan rantai

Gambar 17. Rantai horizontal dengan dua tampilan.

Rantai adalah kumpulan tampilan yang ditautkan satu sama lain dengan batasan posisi dua arah. Tampilan dalam rantai dapat didistribusikan baik secara vertikal maupun horizontal.

Gambar 18. Contoh setiap gaya rantai.

Rantai dapat diberi gaya dengan salah satu cara berikut:

  1. Spread: tampilan didistribusikan secara merata setelah margin diperhitungkan. Ini adalah defaultnya.
  2. Sebar di dalam: tampilan pertama dan terakhir ditempelkan ke batasan di setiap ujung rantai, dan sisanya didistribusikan secara merata.
  3. Berbobot: jika rantai ditetapkan ke spread atau spread here, Anda dapat mengisi ruang yang tersisa dengan menetapkan satu atau beberapa tampilan ke "match constraints" (0dp). Secara default, ruang didistribusikan secara merata di antara setiap tampilan yang ditetapkan ke "match constraints", tetapi Anda dapat menetapkan bobot tingkat kepentingan untuk setiap tampilan menggunakan atribut layout_constraintHorizontal_weight dan layout_constraintVertical_weight. Ini berfungsi dengan cara yang sama seperti layout_weight dalam tata letak linear: tampilan dengan nilai bobot tertinggi akan mendapatkan ruang paling besar, dan tampilan yang memiliki bobot yang sama akan mendapatkan jumlah ruang yang sama.
  4. Packed: tampilan dikemas setelah margin diperhitungkan. Anda dapat menyesuaikan bias seluruh rantai—kiri atau kanan, atau atas atau bawah—dengan mengubah bias tampilan "head" rantai.

Tampilan "head" rantai—tampilan paling kiri dalam rantai horizontal (dalam tata letak kiri-ke-kanan) dan tampilan paling atas dalam rantai vertikal—menentukan gaya rantai dalam XML. Namun, Anda dapat beralih antara spread, spread Inside, dan packed dengan memilih tampilan apa pun dalam rantai dan mengklik tombol rantai yang muncul di bawah tampilan.

Untuk membuat rantai, lakukan hal berikut, seperti ditunjukkan dalam video 4:

  1. Pilih semua tampilan untuk disertakan dalam rantai.
  2. Klik kanan salah satu tampilan.
  3. Pilih Jaringan Bisnis.
  4. Pilih Tengah Horizontal atau Tengah Vertikal.

Video 4. Membuat rantai horizontal.

Berikut beberapa hal yang perlu dipertimbangkan saat menggunakan rantai:

  • Tampilan dapat menjadi bagian dari rantai horizontal dan vertikal, sehingga Anda bisa membuat tata letak petak yang fleksibel.
  • Rantai hanya berfungsi dengan baik jika setiap ujung rantai dibatasi ke objek lain di sumbu yang sama, seperti ditunjukkan dalam gambar 14.
  • Meskipun orientasi rantai vertikal atau horizontal, menggunakan salah satunya tidak akan meratakan tampilan ke arah tersebut. Guna mencapai posisi yang tepat untuk setiap tampilan dalam rantai, sertakan batasan lain, seperti batasan perataan.

Membuat batasan secara otomatis

Daripada menambahkan batasan ke setiap tampilan saat Anda menempatkannya dalam tata letak, Anda dapat memindahkan setiap tampilan ke posisi yang diinginkan di Layout Editor, lalu mengklik Infer Constraints untuk membuat batasan secara otomatis.

Infer Constraints memindai tata letak untuk menentukan kumpulan batasan yang paling efektif bagi semua tampilan. Mode ini membatasi tampilan ke posisinya saat ini sekaligus memberikan fleksibilitas. Anda mungkin perlu melakukan penyesuaian agar tata letak merespons seperti yang Anda inginkan untuk berbagai ukuran dan orientasi layar.

Otomatis terhubung ke Orang Tua adalah fitur terpisah yang dapat Anda aktifkan. Jika diaktifkan dan Anda menambahkan tampilan turunan ke induk, fitur ini secara otomatis akan membuat dua atau lebih batasan untuk setiap tampilan saat Anda menambahkannya ke tata letak, tetapi hanya jika memungkinkan untuk membatasi tampilan ke tata letak induk. Autoconnect tidak membuat batasan untuk tampilan lain dalam tata letak.

Autoconnect dinonaktifkan secara default. Aktifkan dengan mengklik Enable Autoconnection to Parent di toolbar Layout Editor.

Animasi bingkai utama

Dalam ConstraintLayout, Anda dapat menganimasikan perubahan ukuran dan posisi elemen menggunakan ConstraintSet dan TransitionManager.

ConstraintSet adalah objek ringan yang mewakili batasan, margin, dan padding semua elemen turunan dalam ConstraintLayout. Saat Anda menerapkan ConstraintSet ke ConstraintLayout yang ditampilkan, tata letak akan memperbarui batasan semua turunannya.

Untuk membuat animasi menggunakan ConstraintSet, tentukan dua file tata letak yang berfungsi sebagai keyframe awal dan akhir untuk animasi. Selanjutnya, Anda dapat memuat ConstraintSet dari file keyframe kedua dan menerapkannya ke ConstraintLayout yang ditampilkan.

Contoh kode berikut menunjukkan cara menganimasikan pemindahan satu tombol ke bagian bawah layar.

// MainActivity.kt

fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.keyframe_one)
    constraintLayout = findViewById(R.id.constraint_layout) // member variable
}

fun animateToKeyframeTwo() {
    val constraintSet = ConstraintSet()
    constraintSet.load(this, R.layout.keyframe_two)
    TransitionManager.beginDelayedTransition()
    constraintSet.applyTo(constraintLayout)
}
// layout/keyframe1.xml
// Keyframe 1 contains the starting position for all elements in the animation
// as well as final colors and text sizes.

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.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">

    <Button
        android:id="@+id/button2"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="Button"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
// layout/keyframe2.xml
// Keyframe 2 contains another ConstraintLayout with the final positions.

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.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">

    <Button
        android:id="@+id/button2"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="Button"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintBottom_toBottomOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

Referensi tambahan

ConstraintLayout digunakan dalam aplikasi demo Sunflower.