InputType — یک ویژگی Android است که ماهیت دادههای وارد شده و رفتار صفحهکلید را برای فیلدهای متنی تعیین میکند. مقدار InputType یک ماسک بیتی است که کلاس ورودی (متن، عدد، تلفن، تاریخ) و اصلاحکنندهها (چندخطی، تصحیح خودکار، حروف بزرگ، ورودی مخفی) را ترکیب میکند. InputType بر نوع صفحهکلید نمایش داده شده، فیلتر کردن کاراکترهای وارد شده و عملکرد تکمیل خودکار تأثیر میگذارد. طبق Android Developers (2026)، InputType یکی از مهمترین ویژگیها برای اطمینان از ورود صحیح دادهها است و باید به صراحت برای هر فیلد متنی قابل ویرایش تنظیم شود.
نکات کلیدی
InputType — یک ثابت عدد صحیح (Int) است که حالت ورود را برای یک فیلد متنی کدگذاری میکند. در Android، در کلاس android.text.InputType تعریف شده است. مقدار InputType از دو بخش تشکیل شده است: کلاس ورودی (بیتهای 0–4) و اصلاحکنندهها (بیتهای 5–31). کلاس ورودی نوع پایه داده — متن، عدد، تلفن، تاریخ را تعیین میکند. اصلاحکنندهها رفتار را در داخل کلاس انتخاب شده مشخص میکنند — برای مثال، برای کلاس متنی میتوان تصحیح خودکار، حروف بزرگ یا ورود چندخطی را فعال کرد.
مکانیزم InputType در سه سطح کار میکند: در سطح فریمورک Android تعیین میکند که کدام InputConnection ایجاد شود (ارتباط بین EditText و IME). در سطح IME (صفحهکلید) مشخص میکند که کدام کاراکترها نشان داده شوند و چگونه ورود پردازش شود. در سطح برنامه، کاراکترها را از طریق InputFilter تعبیه شده در EditText فیلتر میکند. طبق Android Source Code (AOSP, 2026)، ماسک بیتی در متد TextView.getInputType() که مقدار فعلی را برمیگرداند و setInputType() که فیلترهای داخلی و ارتباط با IME را مجدداً پیکربندی میکند، پردازش میشود.
یک ویژگی مهم InputType — به دلایل امنیتی نمیتوان آن را از فرآیند دیگری خواند. این کار از سرقت دادهها از طریق دسترسی به نوع ورود (مثلاً تشخیص اینکه آیا فیلد رمز عبور است) جلوگیری میکند. هنگام تلاش برای خواندن InputType از برنامه دیگر، TYPE_CLASS_TEXT به طور پیشفرض برگردانده میشود.
// ثابتهای پایه InputType
InputType.TYPE_CLASS_TEXT // 0x0001 = 1
InputType.TYPE_CLASS_NUMBER // 0x0002 = 2
InputType.TYPE_CLASS_PHONE // 0x0003 = 3
InputType.TYPE_CLASS_DATETIME // 0x0004 = 4
// ماسک برای استخراج کلاس
InputType.TYPE_MASK_CLASS // 0x0000000F
در Android چهار کلاس پایه InputType تعریف شده است. هر کلاس مربوط به یک دسته خاص از دادهها است و نوع صفحهکلید مربوطه را فعال میکند. کلاس در بیتهای 0–4 ماسک بیتی مشخص شده و میتواند از طریق ماسک TYPE_MASK_CLASS (0x0F) استخراج شود.
| کلاس | ثابت | صفحهکلید | کاربرد |
|---|---|---|---|
| TEXT | TYPE_CLASS_TEXT (1) | QWERTY | متن، نظرات، توضیحات |
| NUMBER | TYPE_CLASS_NUMBER (2) | عددی | تعداد، قیمت، سن |
| PHONE | TYPE_CLASS_PHONE (3) | تلفن | شماره تلفن |
| DATETIME | TYPE_CLASS_DATETIME (4) | تاریخ/زمان | تاریخ، زمان |
TYPE_CLASS_DATETIME به ندرت مستقیماً استفاده میشود — معمولاً برای وارد کردن تاریخ از DatePicker یا DatePickerDialog استفاده میشود، نه فیلد متنی. با این حال در برخی سناریوها (ورود سریع دستی تاریخ) این کلاس میتواند مفید باشد. صفحهکلید تخصصی ندارد و معمولاً صفحهکلید عددی را نمایش میدهد.
هر کلاس ورودی میتواند با تغییرات (variation) — زیرنوعهای مشخص شده در بیتهای 5–7 ترکیب شود. به عنوان مثال، TYPE_TEXT_VARIATION_PASSWORD (بیت 5) ورود مخفی را به کلاس TEXT اضافه میکند. بیتهای تغییر: 0x000000E0 (ماسک TYPE_MASK_VARIATION).
پرچمهای اصلاحکننده InputType (بیتهای 8–31) قابلیتهای اضافی را به کلاس پایه اضافه میکنند. آنها نوع صفحهکلید را تغییر نمیدهند، اما رفتار ورود را تغییر میدهند. پرچمها برای هر کلاس خاص هستند — پرچمهای TEXT با NUMBER کار نمیکنند و بالعکس. در زیر اصلاحکنندههای اصلی برای هر کلاس فهرست شده است.
طبق Android Developers Documentation (2026)، پرچمهای کلاسهای مختلف همپوشانی ندارند — تلاش برای استفاده از پرچم TEXT با NUMBER نادیده گرفته میشود. برای بررسی پرچم تنظیم شده از AND بیتی استفاده میشود: (inputType and FLAG) != 0.
ترکیب صحیح InputType با کلاسها و پرچمها کلید ایجاد فرمهای راحت است. بیایید سناریوهای معمول و پیکربندیهای InputType مربوطه را بررسی کنیم. هر سناریو ورود را برای یک نوع داده خاص بهینه میکند، فرم را بصری میسازد و پر کردن را سرعت میبخشد.
| سناریو | InputType | صفحهکلید |
|---|---|---|
| نام | textCapWords | QWERTY، هر کلمه با حرف بزرگ |
| ایمیل | textEmailAddress | QWERTY با @ و . |
| رمز عبور | textPassword | QWERTY، ورود مخفی |
| تلفن | phone | اعداد با +, #, * |
| قیمت | numberDecimal | اعداد با اعشار |
| تعداد | number | فقط اعداد |
| نظر | textCapSentences|textMultiLine | QWERTY، چندخطی |
| جستجو | text|textNoSuggestions | QWERTY بدون پیشنهاد |
// ترکیب برای فیلد قیمت
editText.inputType = InputType.TYPE_CLASS_NUMBER or
InputType.TYPE_NUMBER_FLAG_DECIMAL
// ترکیب برای فیلد نظر
editText.inputType = InputType.TYPE_CLASS_TEXT or
InputType.TYPE_TEXT_FLAG_CAP_SENTENCES or
InputType.TYPE_TEXT_FLAG_MULTI_LINE
تنظیم InputType به صورت برنامهنویسی از طریق setInputType() مقدار قبلی را بازنویسی میکند. اگر فقط نیاز به تغییر بخشی از ماسک دارید (مثلاً افزودن پرچم)، باید مقدار فعلی را ذخیره کنید، آن را تغییر دهید و دوباره اعمال کنید. هر فراخوانی setInputType() فیلترهای داخلی EditText را مجدداً پیکربندی میکند.
متد setRawInputType() با setInputType تفاوت دارد زیرا باعث پیکربندی مجدد فیلترها و پیشنهادات نمیشود. برای تغییر موقت InputType بدون بارگذاری مجدد کامل وضعیت EditText استفاده میشود. پس از فراخوانی setInputType() توصیه میشود IME را مجدداً راهاندازی کنید تا صفحهکلید بهروزرسانی شود.
// تغییر بین رمز عبور و متن قابل مشاهده
fun togglePasswordVisibility(editText: EditText) {
val currentType = editText.inputType
val isPassword = (currentType and
InputType.TYPE_TEXT_VARIATION_PASSWORD) != 0
editText.inputType = if (isPassword) {
InputType.TYPE_CLASS_TEXT or
InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD
} else {
InputType.TYPE_CLASS_TEXT or
InputType.TYPE_TEXT_VARIATION_PASSWORD
}
// حفظ موقعیت مکاننما
val cursorPos = editText.selectionStart
editText.setSelection(cursorPos)
}
// دریافت کلاس ورودی
fun getInputClass(inputType: Int): Int {
return inputType and InputType.TYPE_MASK_CLASS
}
// دریافت تغییر ورودی
fun getInputVariation(inputType: Int): Int {
return inputType and InputType.TYPE_MASK_VARIATION
}
// بررسی اینکه آیا فیلد رمز عبور است
fun isPasswordField(editText: EditText): Boolean {
return (editText.inputType and
InputType.TYPE_TEXT_VARIATION_PASSWORD) != 0
}
انتخاب صحیح InputType نه تنها UX، بلکه امنیت و صحت دادهها را شامل میشود. توصیههای اصلی عبارتند از: همیشه InputType صریح را برای هر EditText مشخص کنید. از خاصترین کلاس ورودی استفاده کنید. پرچمهای کلاسهای مختلف را ترکیب نکنید. برای فیلدهای دارای دادههای حساس از تغییرات PASSWORD استفاده کنید. برای فیلدهای جستجو از imeOptions=”actionSearch” استفاده کنید.
InputType همچنین بر کار خدمات دسترسپذیری (Accessibility) تأثیر میگذارد. فیلدهای دارای نوع textPassword محافظت بیشتری از صفحهخوانها دریافت میکنند — آنها کاراکترهای وارد شده را با صدا نمیخوانند. برای فیلدهای textEmailAddress، Screen Reader به کاربر اطلاع میدهد که فیلد برای ایمیل در نظر گرفته شده است و پیشنهادات مربوطه را ارائه میدهد.
طبق Material Design Guidelines (2025)، InputType باید با نوع دادهای که کاربر وارد میکند مطابقت داشته باشد. InputType نادرست نه تنها ورود را کند میکند، بلکه میتواند منجر به خطا شود: برای مثال، اگر برای وارد کردن شماره تلفن textMultiLine باقی بماند، صفحهکلید بلوک عددی را نشان نمیدهد و کاربر مجبور میشود هر بار به صورت دستی چیدمان را تغییر دهد.
سوالات متداول
InputType — یک ویژگی EditText است که نوع دادههای وارد شده را از طریق ماسک بیتی تعیین میکند. Keyboard Type — یک نام غیررسمی برای نوع بصری صفحهکلید است که توسط InputType فعال میشود. InputType همچنین بر فیلتر کردن کاراکترها، تصحیح خودکار و تکمیل خودکار تأثیر میگذارد، نه فقط بر چیدمان صفحهکلید.
editText.inputType = InputType.TYPE_CLASS_TEXT را تنظیم کنید یا از ثابت InputType.TYPE_NULL (0x00000000) برای بازنشانی کامل استفاده کنید. با TYPE_NULL فیلد در هنگام فوکوس صفحهکلید را نشان نمیدهد. برای بازگشت به ورود متن استاندارد، TYPE_CLASS_TEXT را بدون پرچم تنظیم کنید.
نمیتوان یک کلاس InputType جدید ایجاد کرد زیرا بخشی از فریمورک Android است. با این حال میتوان کلاسها و پرچمهای موجود را برای دستیابی به رفتار مورد نظر ترکیب کرد. فیلتر کردن اضافی کاراکترها را از طریق InputFilter پیادهسازی کنید که با متد setFilters() روی EditText تنظیم میشود.
InputType از طریق InputConnection به سیستم ورود منتقل میشود. IME کلاس و تغییر InputType را میخواند و چیدمان صفحهکلید مربوطه را انتخاب میکند. برای مثال، TYPE_CLASS_NUMBER با TYPE_NUMBER_FLAG_DECIMAL باعث میشود صفحهکلید بلوک عددی با نقطه را نشان دهد. اکثر صفحهکلیدهای مدرن از این توصیهها پیروی میکنند.
از ویژگی editText.inputType در Kotlin یا متد editText.getInputType() در Java استفاده کنید. برای استخراج کلاس از ماسک استفاده کنید: inputType and InputType.TYPE_MASK_CLASS. برای بررسی یک پرچم خاص: inputType and InputType.TYPE_TEXT_FLAG_MULTI_LINE — اگر نتیجه != 0 باشد، پرچم تنظیم شده است.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید