InputType — چیست، ویژگی‌های ورودی و پیکربندی آنها در Android

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

InputType — یک ویژگی Android است که ماهیت داده‌های وارد شده و رفتار صفحه‌کلید را برای فیلدهای متنی تعیین می‌کند. مقدار InputType یک ماسک بیتی است که کلاس ورودی (متن، عدد، تلفن، تاریخ) و اصلاح‌کننده‌ها (چندخطی، تصحیح خودکار، حروف بزرگ، ورودی مخفی) را ترکیب می‌کند. InputType بر نوع صفحه‌کلید نمایش داده شده، فیلتر کردن کاراکترهای وارد شده و عملکرد تکمیل خودکار تأثیر می‌گذارد. طبق Android Developers (2026)، InputType یکی از مهم‌ترین ویژگی‌ها برای اطمینان از ورود صحیح داده‌ها است و باید به صراحت برای هر فیلد متنی قابل ویرایش تنظیم شود.

نکات کلیدی

  • InputType — ماسک بیتی که کلاس ورودی و اصلاح‌کننده‌ها را برای EditText تعیین می‌کند.
  • کلاس‌های ورودی — TYPE_CLASS_TEXT, TYPE_CLASS_NUMBER, TYPE_CLASS_PHONE, TYPE_CLASS_DATETIME.
  • اصلاح‌کننده‌ها — پرچم‌هایی که رفتار را مشخص می‌کنند: MULTI_LINE, AUTO_CORRECT, PASSWORD, CAP_SENTENCES.
  • ترکیب — کلاس و اصلاح‌کننده‌ها از طریق OR بیتی برای پیکربندی دقیق ترکیب می‌شوند.
  • تأثیر — InputType صحیح ورود را سرعت می‌بخشد، خطاها را کاهش می‌دهد و UX فرم را بهبود می‌بخشد.

InputType در Android چیست

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 به طور پیش‌فرض برگردانده می‌شود.

kotlin
// ثابت‌های پایه 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

کلاس‌های InputType: TEXT, NUMBER, PHONE, DATETIME

در Android چهار کلاس پایه InputType تعریف شده است. هر کلاس مربوط به یک دسته خاص از داده‌ها است و نوع صفحه‌کلید مربوطه را فعال می‌کند. کلاس در بیت‌های 0–4 ماسک بیتی مشخص شده و می‌تواند از طریق ماسک TYPE_MASK_CLASS (0x0F) استخراج شود.

کلاسثابتصفحه‌کلیدکاربرد
TEXTTYPE_CLASS_TEXT (1)QWERTYمتن، نظرات، توضیحات
NUMBERTYPE_CLASS_NUMBER (2)عددیتعداد، قیمت، سن
PHONETYPE_CLASS_PHONE (3)تلفنشماره تلفن
DATETIMETYPE_CLASS_DATETIME (4)تاریخ/زمانتاریخ، زمان

TYPE_CLASS_DATETIME به ندرت مستقیماً استفاده می‌شود — معمولاً برای وارد کردن تاریخ از DatePicker یا DatePickerDialog استفاده می‌شود، نه فیلد متنی. با این حال در برخی سناریوها (ورود سریع دستی تاریخ) این کلاس می‌تواند مفید باشد. صفحه‌کلید تخصصی ندارد و معمولاً صفحه‌کلید عددی را نمایش می‌دهد.

هر کلاس ورودی می‌تواند با تغییرات (variation) — زیرنوع‌های مشخص شده در بیت‌های 5–7 ترکیب شود. به عنوان مثال، TYPE_TEXT_VARIATION_PASSWORD (بیت 5) ورود مخفی را به کلاس TEXT اضافه می‌کند. بیت‌های تغییر: 0x000000E0 (ماسک TYPE_MASK_VARIATION).

پرچم‌های اصلاح‌کننده InputType

پرچم‌های اصلاح‌کننده InputType (بیت‌های 8–31) قابلیت‌های اضافی را به کلاس پایه اضافه می‌کنند. آنها نوع صفحه‌کلید را تغییر نمی‌دهند، اما رفتار ورود را تغییر می‌دهند. پرچم‌ها برای هر کلاس خاص هستند — پرچم‌های TEXT با NUMBER کار نمی‌کنند و بالعکس. در زیر اصلاح‌کننده‌های اصلی برای هر کلاس فهرست شده است.

پرچم‌های TEXT

  • TYPE_TEXT_FLAG_CAP_CHARACTERS — همه حروف بزرگ.
  • TYPE_TEXT_FLAG_CAP_WORDS — هر کلمه با حرف بزرگ.
  • TYPE_TEXT_FLAG_CAP_SENTENCES — حرف بزرگ در ابتدای جمله (پیش‌فرض).
  • TYPE_TEXT_FLAG_AUTO_CORRECT — تصحیح خودکار غلط‌های املایی.
  • TYPE_TEXT_FLAG_AUTO_COMPLETE — تکمیل خودکار (برای AutoCompleteTextView).
  • TYPE_TEXT_FLAG_MULTI_LINE — ورود چندخطی.
  • TYPE_TEXT_FLAG_NO_SUGGESTIONS — غیرفعال کردن پیشنهادات.

پرچم‌های NUMBER

  • TYPE_NUMBER_FLAG_SIGNED — اجازه اعداد منفی (علامت منفی).
  • TYPE_NUMBER_FLAG_DECIMAL — اجازه نقطه اعشاری.

طبق Android Developers Documentation (2026)، پرچم‌های کلاس‌های مختلف همپوشانی ندارند — تلاش برای استفاده از پرچم TEXT با NUMBER نادیده گرفته می‌شود. برای بررسی پرچم تنظیم شده از AND بیتی استفاده می‌شود: (inputType and FLAG) != 0.

ترکیبات InputType: مثال‌هایی برای سناریوهای مختلف

ترکیب صحیح InputType با کلاس‌ها و پرچم‌ها کلید ایجاد فرم‌های راحت است. بیایید سناریوهای معمول و پیکربندی‌های InputType مربوطه را بررسی کنیم. هر سناریو ورود را برای یک نوع داده خاص بهینه می‌کند، فرم را بصری می‌سازد و پر کردن را سرعت می‌بخشد.

سناریوInputTypeصفحه‌کلید
نامtextCapWordsQWERTY، هر کلمه با حرف بزرگ
ایمیلtextEmailAddressQWERTY با @ و .
رمز عبورtextPasswordQWERTY، ورود مخفی
تلفنphoneاعداد با +, #, *
قیمتnumberDecimalاعداد با اعشار
تعدادnumberفقط اعداد
نظرtextCapSentences|textMultiLineQWERTY، چندخطی
جستجوtext|textNoSuggestionsQWERTY بدون پیشنهاد
kotlin
// ترکیب برای فیلد قیمت
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

تنظیم InputType به صورت برنامه‌نویسی از طریق setInputType() مقدار قبلی را بازنویسی می‌کند. اگر فقط نیاز به تغییر بخشی از ماسک دارید (مثلاً افزودن پرچم)، باید مقدار فعلی را ذخیره کنید، آن را تغییر دهید و دوباره اعمال کنید. هر فراخوانی setInputType() فیلترهای داخلی EditText را مجدداً پیکربندی می‌کند.

متد setRawInputType() با setInputType تفاوت دارد زیرا باعث پیکربندی مجدد فیلترها و پیشنهادات نمی‌شود. برای تغییر موقت InputType بدون بارگذاری مجدد کامل وضعیت EditText استفاده می‌شود. پس از فراخوانی setInputType() توصیه می‌شود IME را مجدداً راه‌اندازی کنید تا صفحه‌کلید به‌روزرسانی شود.

تغییر حالت‌ها

kotlin
// تغییر بین رمز عبور و متن قابل مشاهده
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)
}

استخراج کلاس و تغییر

kotlin
// دریافت کلاس ورودی
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

انتخاب صحیح InputType نه تنها UX، بلکه امنیت و صحت داده‌ها را شامل می‌شود. توصیه‌های اصلی عبارتند از: همیشه InputType صریح را برای هر EditText مشخص کنید. از خاص‌ترین کلاس ورودی استفاده کنید. پرچم‌های کلاس‌های مختلف را ترکیب نکنید. برای فیلدهای دارای داده‌های حساس از تغییرات PASSWORD استفاده کنید. برای فیلدهای جستجو از imeOptions=”actionSearch” استفاده کنید.

InputType همچنین بر کار خدمات دسترس‌پذیری (Accessibility) تأثیر می‌گذارد. فیلدهای دارای نوع textPassword محافظت بیشتری از صفحه‌خوان‌ها دریافت می‌کنند — آنها کاراکترهای وارد شده را با صدا نمی‌خوانند. برای فیلدهای textEmailAddress، Screen Reader به کاربر اطلاع می‌دهد که فیلد برای ایمیل در نظر گرفته شده است و پیشنهادات مربوطه را ارائه می‌دهد.

  • صراحت — همیشه InputType را به صراحت تنظیم کنید، به مقدار پیش‌فرض (textMultiLine) اعتماد نکنید.
  • خاص بودن — از خاص‌ترین نوع استفاده کنید: برای ایمیل از textEmailAddress استفاده کنید، نه text.
  • امنیت — برای رمزهای عبور، PIN و داده‌های کارت از تغییرات PASSWORD استفاده کنید.
  • تکمیل خودکار — InputType را با autofillHints برای پشتیبانی از مدیران رمز عبور ترکیب کنید.
  • تست — رفتار را روی صفحه‌کلیدهای مختلف (Gboard، SwiftKey، Samsung Keyboard) بررسی کنید.

طبق Material Design Guidelines (2025)، InputType باید با نوع داده‌ای که کاربر وارد می‌کند مطابقت داشته باشد. InputType نادرست نه تنها ورود را کند می‌کند، بلکه می‌تواند منجر به خطا شود: برای مثال، اگر برای وارد کردن شماره تلفن textMultiLine باقی بماند، صفحه‌کلید بلوک عددی را نشان نمی‌دهد و کاربر مجبور می‌شود هر بار به صورت دستی چیدمان را تغییر دهد.

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

InputType چه تفاوتی با Keyboard Type دارد؟

InputType — یک ویژگی EditText است که نوع داده‌های وارد شده را از طریق ماسک بیتی تعیین می‌کند. Keyboard Type — یک نام غیررسمی برای نوع بصری صفحه‌کلید است که توسط InputType فعال می‌شود. InputType همچنین بر فیلتر کردن کاراکترها، تصحیح خودکار و تکمیل خودکار تأثیر می‌گذارد، نه فقط بر چیدمان صفحه‌کلید.

چگونه InputType را به مقدار پیش‌فرض بازنشانی کنیم؟

editText.inputType = InputType.TYPE_CLASS_TEXT را تنظیم کنید یا از ثابت InputType.TYPE_NULL (0x00000000) برای بازنشانی کامل استفاده کنید. با TYPE_NULL فیلد در هنگام فوکوس صفحه‌کلید را نشان نمی‌دهد. برای بازگشت به ورود متن استاندارد، TYPE_CLASS_TEXT را بدون پرچم تنظیم کنید.

آیا می‌توان InputType سفارشی ایجاد کرد؟

نمی‌توان یک کلاس InputType جدید ایجاد کرد زیرا بخشی از فریم‌ورک Android است. با این حال می‌توان کلاس‌ها و پرچم‌های موجود را برای دستیابی به رفتار مورد نظر ترکیب کرد. فیلتر کردن اضافی کاراکترها را از طریق InputFilter پیاده‌سازی کنید که با متد setFilters() روی EditText تنظیم می‌شود.

InputType چگونه بر IME (صفحه‌کلید) تأثیر می‌گذارد؟

InputType از طریق InputConnection به سیستم ورود منتقل می‌شود. IME کلاس و تغییر InputType را می‌خواند و چیدمان صفحه‌کلید مربوطه را انتخاب می‌کند. برای مثال، TYPE_CLASS_NUMBER با TYPE_NUMBER_FLAG_DECIMAL باعث می‌شود صفحه‌کلید بلوک عددی با نقطه را نشان دهد. اکثر صفحه‌کلیدهای مدرن از این توصیه‌ها پیروی می‌کنند.

چگونه InputType را در زمان اجرا بررسی کنیم؟

از ویژگی editText.inputType در Kotlin یا متد editText.getInputType() در Java استفاده کنید. برای استخراج کلاس از ماسک استفاده کنید: inputType and InputType.TYPE_MASK_CLASS. برای بررسی یک پرچم خاص: inputType and InputType.TYPE_TEXT_FLAG_MULTI_LINE — اگر نتیجه != 0 باشد، پرچم تنظیم شده است.

خلاصه

  • InputType — ماسک بیتی متشکل از کلاس ورودی (TEXT, NUMBER, PHONE, DATETIME) و اصلاح‌کننده‌ها.
  • کلاس ورودی نوع پایه داده و نوع صفحه‌کلید نمایش داده شده را تعیین می‌کند.
  • اصلاح‌کننده‌ها رفتار را مشخص می‌کنند: چندخطی، تصحیح خودکار، حروف بزرگ، ورود مخفی.
  • ترکیب از طریق OR بیتی امکان ایجاد پیکربندی‌های دقیق برای سناریوهای مختلف را فراهم می‌کند.
  • تغییرات PASSWORD تصحیح خودکار را غیرفعال می‌کنند، کاراکترها را مخفی می‌کنند و از نوشتن در دیکشنری جلوگیری می‌کنند.
  • تنظیم برنامه‌نویسی از طریق setInputType() نیاز به راه‌اندازی مجدد IME برای به‌روزرسانی صفحه‌کلید دارد.
  • بهترین روش‌ها — InputType را به صراحت تنظیم کنید، از انواع خاص استفاده کنید و روی صفحه‌کلیدهای مختلف تست کنید.

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

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

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

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