TextInputLayout — adalah komponen dari pustaka Material Components untuk Android yang membungkus EditText dan menambahkan kemampuan lanjutan untuk input teks. Fungsi utama TextInputLayout adalah label mengambang (floating label), yang naik di atas kolom saat mengetik teks, menghemat tempat dan meningkatkan keterbacaan. Selain itu, komponen ini mendukung penampilan pesan error, ikon di dalam kolom, penghitung karakter, dan berbagai gaya tampilan. Menurut Material Design Guidelines (2025), TextInputLayout adalah cara yang direkomendasikan untuk membuat kolom teks di aplikasi Android yang sesuai dengan standar Material Design 3.
Poin Utama
TextInputLayout — adalah ViewGroup dari paket com.google.android.material.textfield yang memperluas LinearLayout dan berisi EditText di dalamnya. Komponen ini adalah bagian dari pustaka Material Components untuk Android, mulai dari versi 1.0.0. Tugas utama TextInputLayout adalah menyediakan implementasi siap pakai Material Design Text Fields dengan usaha minimal dari pengembang.
Tidak seperti EditText standar, TextInputLayout mengelola animasi label mengambang, yang diatur melalui atribut android:hint dari EditText internal. Ketika kolom kosong, label ditampilkan di dalam kolom sebagai petunjuk biasa. Begitu pengguna mulai mengetik, label bergerak dengan animasi ke bagian atas kolom, memperkecil ukurannya. Menurut Material Design Guidelines (2025), animasi semacam ini meningkatkan persepsi formulir, karena pengguna selalu melihat nama kolom, bahkan setelah memasukkan data.
Secara arsitektural, TextInputLayout mengimplementasikan pola dekorator: ia mencegat event EditText, mengelola penampilan elemen tambahan (label, error, ikon, penghitung) dan mengoordinasikan animasinya. EditText internal dapat diakses melalui metode getEditText() dan dapat dikonfigurasi dengan atribut standar, termasuk inputType, maxLines, dan hint.
<!-- Basic TextInputLayout markup -->
@+id/tilEmail
android:layout_width="match_parent"
android:layout_height="wrap_content">
@+id/etEmail
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Email"
android:inputType="textEmailAddress" />
</com.google.android.material.textfield.TextInputLayout>
Floating label (label mengambang) — adalah kemampuan utama TextInputLayout. Ketika kolom kosong, teks dari android:hint ditampilkan di dalam EditText sebagai petunjuk biasa. Saat menerima fokus atau saat mengetik teks, label naik ke bagian atas TextInputLayout, memperkecil ukuran font dan mengubah warna. Perilaku ini memecahkan masalah ketidakjelasan petunjuk setelah mulai mengetik.
Pengaturan floating label dilakukan melalui atribut TextInputLayout: app:hintEnabled menentukan apakah label mengambang diaktifkan (default true), app:hintAnimationEnabled mengaktifkan atau menonaktifkan animasi transisi, app:expandedHintEnabled mengizinkan penampilan label bahkan ketika kolom kosong dan tidak dalam fokus. Warna label dalam berbagai keadaan dikelola melalui gaya colorPrimary dan colorControlHighlight.
Menurut Google Material Components Team (2025), floating label sangat berguna dalam formulir dengan banyak kolom, di mana pengguna mungkin lupa nama kolom setelah mulai mengetik. Tidak seperti android:hint sederhana yang menghilang saat mengetik, floating label tetap terlihat selalu, menyediakan konteks untuk setiap kolom.
| Atribut | Deskripsi | Default |
|---|---|---|
| hintEnabled | Mengaktifkan atau menonaktifkan label mengambang | true |
| hintAnimationEnabled | Mengaktifkan animasi naik/turun label | true |
| expandedHintEnabled | Menampilkan label bahkan saat kolom kosong dan tanpa fokus | false |
| hintTextAppearance | Gaya teks label mengambang | Tema aplikasi |
TextInputLayout menyediakan sistem penampilan error bawaan yang terintegrasi secara visual dengan kolom input. Saat mengatur error melalui metode error, komponen menyorot kolom (warna garis atau batas berubah menjadi merah) dan menampilkan teks error di bawah kolom. Ini menggantikan kebutuhan akan TextView terpisah untuk pesan error.
Pengelolaan penampilan error dilakukan melalui metode setError(CharSequence) dan setErrorEnabled(boolean). Saat memanggil setError dengan teks, error ditampilkan segera; saat memanggil setError(null) — disembunyikan. TextInputLayout juga mendukung ikon error kustom melalui atribut app:errorIconDrawable dan pengelolaan warna error melalui app:errorTextColor.
Menurut Material Design Guidelines (2025), pesan error harus spesifik dan berguna: daripada "Input tidak valid" tulis "Email harus mengandung @". Penampilan error harus terjadi setelah input selesai (setelah kehilangan fokus atau setelah mengirim formulir), bukan secara real-time — ini mengurangi stres pengguna saat mengisi formulir.
// Pengaturan error secara terprogram
textInputLayout.error = "Password min 8 chars"
// Menyembunyikan error
textInputLayout.error = null
// Memeriksa dan mengatur error validasi
if (email.isNullOrBlank()) {
tilEmail.error = "Email is required"
} else {
tilEmail.error = null
}
TextInputLayout mendukung penampilan ikon baik di awal kolom (start icon) maupun di akhir (end icon). Ikon dapat menjalankan berbagai fungsi: mengubah visibilitas sandi, membersihkan kolom, tindakan kustom. Setiap jenis ikon dikelola oleh atribut terpisah dan dapat diganti dengan ikon kustom melalui atribut app:startIconDrawable atau app:endIconDrawable.
End icon mode diatur melalui atribut app:endIconMode, yang dapat mengambil nilai: password_toggle — mengalihkan visibilitas sandi, clear_text — membersihkan kolom, dropdown_menu — panah untuk menu dropdown, custom — ikon kustom. Untuk password_toggle, TextInputLayout secara otomatis mengelola pengalihan inputType antara textPassword dan textVisiblePassword, serta menganimasikan ikon mata.
<!-- TextInputLayout with password toggle icon -->
@+id/tilPassword
android:layout_width="match_parent"
app:endIconMode="password_toggle"
app:passwordToggleTint="@color/primary">
@+id/etPassword
android:inputType="textPassword" />
</com.google.android.material.textfield.TextInputLayout>
Material Components untuk Android menyediakan dua gaya utama untuk TextInputLayout: FilledBox (terisi) dan OutlinedBox (dengan garis tepi). Gaya FilledBox memiliki latar belakang berwarna dan garis di bawah kolom yang berubah warna saat fokus. Gaya OutlinedBox memiliki latar belakang transparan dan garis tepi di sekitar seluruh kolom, menciptakan batas yang lebih jelas dan lebih cocok untuk formulir dengan banyak kolom.
Pemilihan gaya tergantung pada desain aplikasi: FilledBox direkomendasikan untuk formulir yang sering digunakan, karena menarik lebih sedikit perhatian ke kolom individu. OutlinedBox lebih disukai untuk formulir pendek (login, registrasi), di mana setiap kolom harus ditandai dengan jelas. Gaya diatur melalui atribut style di XML atau melalui tema aplikasi.
| Karakteristik | FilledBox | OutlinedBox |
|---|---|---|
| Latar belakang | Isian warna (biasanya abu-abu) | Transparan |
| Batas | Garis di bagian bawah | Garis tepi di sekitar kolom |
| Fokus | Garis menebal dan berubah warna | Garis tepi berubah warna dan menebal |
| Rekomendasi | Formulir dengan input sering | Formulir pendek, penekanan pada kolom |
| Gaya | Widget.MaterialComponents.TextInputLayout.FilledBox | Widget.MaterialComponents.TextInputLayout.OutlinedBox |
Material Design 3 (M3) memperkenalkan gaya yang diperbarui untuk TextInputLayout dengan tipografi yang ditingkatkan, token warna baru, dan dukungan untuk warna dinamis Material You. Di M3, OutlinedBox menjadi gaya default yang direkomendasikan, dan FilledBox menyesuaikan jarak dan radius pembulatan agar sesuai dengan spesifikasi baru.
Contoh lengkap implementasi formulir registrasi dengan TextInputLayout, termasuk validasi email dan sandi, penampilan error, dan ikon tampilkan sandi. Saat menekan tombol registrasi, semua kolom diperiksa dan pesan error yang sesuai ditampilkan.
@+id/tilName
app:boxBackgroundMode="outlined">
@+id/etName
android:hint="Name" />
</...TextInputLayout>
@+id/tilRegEmail
app:boxBackgroundMode="outlined">
@+id/etRegEmail
android:hint="Email"
android:inputType="textEmailAddress" />
</...TextInputLayout>
@+id/tilRegPassword
app:boxBackgroundMode="outlined"
app:endIconMode="password_toggle">
@+id/etRegPassword
android:hint="Password"
android:inputType="textPassword" />
</...TextInputLayout>
private fun validateForm(): Boolean {
var isValid = true
if (etName.text.isNullOrBlank()) {
tilName.error = "Enter your name"
isValid = false
} else {
tilName.error = null
}
val email = etRegEmail.text.toString()
if (!Patterns.EMAIL_ADDRESS.matcher(email).matches()) {
tilRegEmail.error = "Invalid email format"
isValid = false
} else {
tilRegEmail.error = null
}
val password = etRegPassword.text.toString()
if (password.length < 8) {
tilRegPassword.error = "Password min 8 chars"
isValid = false
} else {
tilRegPassword.error = null
}
return isValid
}
Pertanyaan yang Sering Diajukan
TextInputLayout tersedia mulai dari versi 1.0.0 pustaka com.google.android.material. Untuk fitur Material Design 3 gunakan versi 1.6.0 dan lebih tinggi. Koneksi: implementation "com.google.android.material:material:1.12.0" di build.gradle modul.
Warna label mengambang dalam keadaan fokus dikelola oleh atribut app:hintTextColor atau melalui tema menggunakan colorPrimary. Untuk keadaan berbeda (fokus, error, disabled) gunakan selektor di res/color/ atau atribut boxStrokeColor, errorTextColor dari pustaka Material Components.
Atur atribut app:counterEnabled="true" dan tentukan jumlah maksimum karakter melalui app:counterMaxLength="100". TextInputLayout akan secara otomatis menampilkan penghitung di bawah kolom (misalnya "25/100"). Warna penghitung dapat diatur melalui app:counterTextColor dan app:counterOverflowTextColor untuk melebihi batas.
FilledBox — latar belakang berwarna, penekanan pada garis bawah. Mengambil lebih sedikit ruang visual. OutlinedBox — latar belakang transparan dengan garis tepi di sekitar kolom, batas yang lebih terlihat. FilledBox direkomendasikan untuk kolom yang sering digunakan, OutlinedBox untuk formulir pendek di mana kejelasan setiap kolom penting.
Ya, atur atribut app:hintEnabled="false" untuk menonaktifkan label mengambang. Dalam hal ini TextInputLayout akan berfungsi sebagai pembungkus biasa untuk EditText, mempertahankan fungsionalitas error, ikon, dan penghitung karakter, tetapi tanpa animasi label. Berguna untuk kolom di mana hint tidak diperlukan atau label kustom digunakan.
Ringkasan
Kami akan mengembangkan aplikasi seluler turnkey
IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.
Baca juga