TextInputLayout: چیست، Material Design و پیکربندی در Android

نویسنده: IT Sectr منتشر شده: 2026-07-07 زمان مطالعه: 9 دقیقه

TextInputLayout — کامپوننتی از کتابخانه Material Components برای Android است که EditText را می‌پیچد و قابلیت‌های پیشرفته‌ای برای ورود متن اضافه می‌کند. عملکرد اصلی TextInputLayout برچسب شناور (floating label) است که هنگام وارد کردن متن بالای فیلد بالا می‌آید و باعث صرفه‌جویی در فضا و بهبود خوانایی می‌شود. علاوه بر این، کامپوننت از نمایش پیام‌های خطا، آیکون‌های داخل فیلد، شمارنده کاراکتر و سبک‌های مختلف پشتیبانی می‌کند. طبق Material Design Guidelines (2025)، TextInputLayout روش توصیه‌شده برای ایجاد فیلدهای متنی در برنامه‌های Android مطابق با استانداردهای Material Design 3 است.

نکات اصلی

  • TextInputLayout — پوششی برای EditText از Material Components با floating label.
  • Floating label — برچسب هنگام ورود متن بالای فیلد بالا می‌آید و در فضای صفحه صرفه‌جویی می‌کند.
  • خطاها — نمایش داخلی پیام‌های خطا در زیر فیلد ورودی.
  • آیکون‌ها — پشتیبانی از آیکون‌های چپ و راست برای اقدامات (نمایش رمز عبور، پاک کردن).
  • سبک‌ها — دو سبک اصلی: FilledBox و OutlinedBox، همچنین تم‌های سفارشی.

TextInputLayout در Android چیست

TextInputLayout — یک ViewGroup از بسته com.google.android.material.textfield است که LinearLayout را گسترش می‌دهد و درون خود EditText را نگه می‌دارد. این کامپوننت بخشی از کتابخانه Material Components برای Android از نسخه 1.0.0 به بعد است. وظیفه اصلی TextInputLayout ارائه پیاده‌سازی آماده Material Design Text Fields با حداقل تلاش از طرف توسعه‌دهنده است.

برخلاف EditText استاندارد، TextInputLayout انیمیشن برچسب شناور را مدیریت می‌کند که از طریق ویژگی android:hint EditText داخلی تنظیم می‌شود. وقتی فیلد خالی است، برچسب درون فیلد به صورت راهنمای معمولی نمایش داده می‌شود. به محض اینکه کاربر شروع به تایپ می‌کند، برچسب با انیمیشن به قسمت بالای فیلد منتقل می‌شود و اندازه آن کاهش می‌یابد. طبق Material Design Guidelines (2025)، چنین انیمیشنی درک فرم را بهبود می‌بخشد، زیرا کاربر حتی پس از وارد کردن داده‌ها نیز نام فیلد را می‌بیند.

از نظر معماری، TextInputLayout الگوی دکوراتور را پیاده‌سازی می‌کند: رویدادهای EditText را رهگیری می‌کند، نمایش عناصر اضافی (برچسب، خطا، آیکون‌ها، شمارنده) را مدیریت می‌کند و انیمیشن آنها را هماهنگ می‌کند. EditText داخلی از طریق متد getEditText() قابل دسترسی است و می‌تواند با ویژگی‌های استاندارد شامل inputType، maxLines و hint پیکربندی شود.

xml
<!-- 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 و پیکربندی آن

Floating label (برچسب شناور) — قابلیت کلیدی TextInputLayout است. وقتی فیلد خالی است، متن android:hint درون EditText به صورت راهنمای معمولی نمایش داده می‌شود. هنگام دریافت فوکوس یا هنگام تایپ متن، برچسب به قسمت بالای TextInputLayout منتقل می‌شود، اندازه فونت را کاهش می‌دهد و رنگ را تغییر می‌دهد. این رفتار مشکل ناپدید شدن راهنما پس از شروع تایپ را حل می‌کند.

پیکربندی floating label از طریق ویژگی‌های TextInputLayout انجام می‌شود: app:hintEnabled مشخص می‌کند که برچسب شناور فعال است یا خیر (پیش‌فرض true)، app:hintAnimationEnabled انیمیشن انتقال را فعال یا غیرفعال می‌کند، app:expandedHintEnabled نمایش برچسب را حتی وقتی فیلد خالی و بدون فوکوس است مجاز می‌کند. رنگ برچسب در حالت‌های مختلف از طریق سبک‌های colorPrimary و colorControlHighlight مدیریت می‌شود.

طبق Google Material Components Team (2025)، floating label به ویژه در فرم‌های با تعداد زیاد فیلد مفید است، جایی که کاربر ممکن است نام فیلد را پس از شروع تایپ فراموش کند. برخلاف android:hint ساده که هنگام تایپ ناپدید می‌شود، floating label همیشه قابل مشاهده باقی می‌ماند و زمینه را برای هر فیلد فراهم می‌کند.

ویژگیتوضیحاتپیش‌فرض
hintEnabledبرچسب شناور را فعال یا غیرفعال می‌کندtrue
hintAnimationEnabledانیمیشن بالا/پایین رفتن برچسب را فعال می‌کندtrue
expandedHintEnabledبرچسب را حتی وقتی فیلد خالی و بدون فوکوس است نشان می‌دهدfalse
hintTextAppearanceسبک متن برچسب شناورتم برنامه

نمایش خطاها در TextInputLayout

TextInputLayout یک سیستم نمایش خطای داخلی ارائه می‌دهد که از نظر بصری با فیلد ورودی ادغام شده است. هنگام تنظیم خطا از طریق متد error، کامپوننت فیلد را برجسته می‌کند (رنگ خط یا حاشیه به قرمز تغییر می‌کند) و متن خطا را در زیر فیلد نمایش می‌دهد. این کار نیاز به یک TextView جداگانه برای پیام‌های خطا را برطرف می‌کند.

مدیریت نمایش خطاها از طریق متدهای setError(CharSequence) و setErrorEnabled(boolean) انجام می‌شود. هنگام فراخوانی setError با متن، خطا بلافاصله نمایش داده می‌شود؛ هنگام فراخوانی setError(null) — پنهان می‌شود. TextInputLayout همچنین از آیکون خطای سفارشی از طریق ویژگی app:errorIconDrawable و مدیریت رنگ خطا از طریق app:errorTextColor پشتیبانی می‌کند.

طبق Material Design Guidelines (2025)، پیام‌های خطا باید مشخص و مفید باشند: به جای «ورودی نامعتبر» بنویسید «ایمیل باید شامل @ باشد». نمایش خطا باید پس از اتمام ورود (پس از از دست دادن فوکوس یا پس از ارسال فرم) انجام شود، نه در زمان واقعی — این کار استرس کاربر را هنگام پر کردن فرم کاهش می‌دهد.

kotlin
// تنظیم خطای برنامه‌نویسی
textInputLayout.error = "Password min 8 chars"

// مخفی‌سازی خطا
textInputLayout.error = null

// بررسی و تنظیم خطای اعتبارسنجی
if (email.isNullOrBlank()) {
    tilEmail.error = "Email is required"
} else {
    tilEmail.error = null
}

آیکون‌ها و اقدامات TextInputLayout

TextInputLayout از نمایش آیکون‌ها هم در ابتدای فیلد (start icon) و هم در انتهای فیلد (end icon) پشتیبانی می‌کند. آیکون‌ها می‌توانند عملکردهای مختلفی داشته باشند: تغییر وضعیت نمایش رمز عبور، پاک کردن فیلد، اقدام سفارشی. هر نوع آیکون توسط یک ویژگی جداگانه مدیریت می‌شود و می‌تواند از طریق ویژگی app:startIconDrawable یا app:endIconDrawable با آیکون سفارشی جایگزین شود.

End icon mode از طریق ویژگی app:endIconMode تنظیم می‌شود که می‌تواند مقادیر زیر را بگیرد: password_toggle — تغییر وضعیت نمایش رمز عبور، clear_text — پاک کردن فیلد، dropdown_menu — فلش برای منوی کشویی، custom — آیکون سفارشی. برای password_toggle، TextInputLayout به طور خودکار inputType را بین textPassword و textVisiblePassword تغییر می‌دهد و همچنین آیکون چشم را انیمیشن می‌کند.

  • password_toggle — آیکون چشم برای نمایش/پنهان کردن رمز عبور، انیمیشن داخلی.
  • clear_text — علامت ضربدر برای پاک کردن فیلد، هنگام وجود متن ظاهر می‌شود.
  • dropdown_menu — فلش برای Exposed Dropdown Menu (Material Design 3).
  • custom — هر آیکون سفارشی با مدیریت از طریق setEndIconOnClickListener.
xml
<!-- 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>

سبک‌های TextInputLayout: FilledBox و OutlinedBox

Material Components برای Android دو سبک اصلی برای TextInputLayout ارائه می‌دهد: FilledBox (پر شده) و OutlinedBox (با حاشیه). سبک FilledBox دارای پس‌زمینه رنگی و خطی در زیر فیلد است که در هنگام فوکوس تغییر رنگ می‌دهد. سبک OutlinedBox دارای پس‌زمینه شفاف و حاشیه در اطراف کل فیلد است که مرزهای واضح‌تری ایجاد می‌کند و برای فرم‌های با تعداد زیاد فیلد مناسب‌تر است.

انتخاب سبک به طراحی برنامه بستگی دارد: FilledBox برای فرم‌های پرکاربرد توصیه می‌شود، زیرا توجه کمتری به فیلدهای جداگانه جلب می‌کند. OutlinedBox برای فرم‌های کوتاه (ورود، ثبت‌نام) ترجیح داده می‌شود، جایی که هر فیلد باید به وضوح مشخص شود. سبک از طریق ویژگی style در XML یا از طریق تم برنامه تنظیم می‌شود.

ویژگیFilledBoxOutlinedBox
پس‌زمینهپر شدن با رنگ (معمولاً خاکستری)شفاف
مرزخط در پایینحاشیه دور فیلد
فوکوسخط ضخیم‌تر می‌شود و رنگ تغییر می‌کندحاشیه تغییر رنگ می‌دهد و ضخیم‌تر می‌شود
توصیهفرم‌های با ورود مکررفرم‌های کوتاه، تأکید بر فیلدها
سبکWidget.MaterialComponents.TextInputLayout.FilledBoxWidget.MaterialComponents.TextInputLayout.OutlinedBox

Material Design 3 (M3) سبک‌های به‌روزشده‌ای برای TextInputLayout با تایپوگرافی بهبودیافته، توکن‌های رنگی جدید و پشتیبانی از رنگ‌های پویای Material You معرفی کرد. در M3، OutlinedBox به سبک پیش‌فرض توصیه‌شده تبدیل شد و FilledBox فاصله‌ها و شعاع گردشدگی را برای مطابقت با مشخصات جدید تطبیق داد.

نمونه کدهای TextInputLayout

نمونه کامل پیاده‌سازی فرم ثبت‌نام با TextInputLayout شامل اعتبارسنجی ایمیل و رمز عبور، نمایش خطاها و آیکون نمایش رمز عبور. با فشار دادن دکمه ثبت‌نام، همه فیلدها بررسی می‌شوند و پیام‌های خطای مربوطه نمایش داده می‌شوند.

نشانه‌گذاری XML فرم ثبت‌نام

xml
@+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>

اعتبارسنجی فرم در Kotlin

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

سوالات متداول

چه نسخه‌ای از Material Components برای TextInputLayout لازم است؟

TextInputLayout از نسخه 1.0.0 کتابخانه com.google.android.material در دسترس است. برای قابلیت‌های Material Design 3 از نسخه 1.6.0 و بالاتر استفاده کنید. اتصال: implementation «com.google.android.material:material:1.12.0» در build.gradle ماژول.

چگونه رنگ برچسب شناور را در حالت فوکوس تغییر دهیم؟

رنگ برچسب شناور در حالت فوکوس توسط ویژگی app:hintTextColor یا از طریق تم با استفاده از colorPrimary مدیریت می‌شود. برای حالت‌های مختلف (فوکوس، خطا، غیرفعال) از انتخابگر در res/color/ یا ویژگی‌های boxStrokeColor، errorTextColor از کتابخانه Material Components استفاده کنید.

چگونه شمارنده کاراکتر را به TextInputLayout اضافه کنیم؟

ویژگی app:counterEnabled="true" را تنظیم کنید و حداکثر تعداد کاراکتر را از طریق app:counterMaxLength="100" تعیین کنید. TextInputLayout به طور خودکار شمارنده را در پایین فیلد نمایش می‌دهد (مثلاً «25/100»). رنگ شمارنده را می‌توان از طریق app:counterTextColor و app:counterOverflowTextColor برای تجاوز از حد تنظیم کرد.

تفاوت بین سبک‌های FilledBox و OutlinedBox چیست؟

FilledBox — پس‌زمینه رنگی، تأکید روی خط پایین. فضای بصری کمتری اشغال می‌کند. OutlinedBox — پس‌زمینه شفاف با حاشیه دور فیلد، مرزهای قابل‌ مشاهده‌تر. FilledBox برای فیلدهای پرکاربرد توصیه می‌شود، OutlinedBox برای فرم‌های کوتاه که وضوح هر فیلد مهم است.

آیا می‌توان از TextInputLayout بدون Floating Label استفاده کرد؟

بله، ویژگی app:hintEnabled="false" را تنظیم کنید تا برچسب شناور غیرفعال شود. در این حالت TextInputLayout به عنوان یک پوشش معمولی برای EditText کار می‌کند و عملکرد خطاها، آیکون‌ها و شمارنده کاراکتر را حفظ می‌کند، اما بدون انیمیشن برچسب. مفید برای فیلدهایی که hint نیاز نیست یا از برچسب سفارشی استفاده می‌شود.

خلاصه

  • TextInputLayout — پوششی برای EditText از Material Components با floating label، خطاها و آیکون‌ها.
  • Floating label مشکل پنهان شدن راهنما هنگام تایپ را حل می‌کند — برچسب بالا می‌آید و قابل مشاهده می‌ماند.
  • خطاها در زیر فیلد با برجسته‌سازی حاشیه به رنگ قرمز، بدون TextView جداگانه نمایش داده می‌شوند.
  • آیکون‌ها endIconMode از password_toggle، clear_text، dropdown_menu و custom پشتیبانی می‌کند.
  • سبک‌های FilledBox و OutlinedBox — دو گزینه اصلی ظاهر فیلد ورودی.
  • شمارنده کاراکتر از طریق counterEnabled و counterMaxLength فعال می‌شود.
  • Material Design 3 رنگ‌های پویای Material You و سبک‌های به‌روزشده OutlinedBox را اضافه می‌کند.

ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد

IT Sectr از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه

همچنین بخوانید