ساخت کیبورد سفارشی برای اندروید با Xamarin Forms – از صفر تا صد
در برخی موارد هنگام اجرای پروژهها نیاز به کیبوردهایی داریم که بعضی امکانات خاص دارند که کیبورد معمولی اندروید فاقد آن است. در این مقاله روش ساخت کیبورد سفارشی اندروید با Xamarin Forms را توضیح خواهیم داد.


نخستین گزینهای که در این موارد به ذهن میرسد، این است که یک Entry غیر فعال با یک GestureRecognizer اضافه کنیم که یک کنترل به همراه یک انیمیشن نمایش میدهد تا ظاهر شدن کیبورد را شبیهسازی کند، اما به سرعت متوجه میشویم که این ایده قابلیت اجرای مجدد ندارد و لذا آن را کنار میگذاریم.
بهترین گزینه این است که مسیر native را پی بگیریم، اما اغلب این مسیرها در نهایت به ایجاد یک سرویس منتهی میشوند. بدیهی است که کاربران ما علاقه چندانی به این ندارند که یک کیبورد را جداگانه دانلود کنند تا صرفاً در اپلیکیشن مورد استفاده قرار دهند و باید توجه داشته باشیم که ما از Xamarin Forms استفاده میکنیم. از آنجا که میخواهیم این کیبورد سفارشی را در Xamarin Forms پیادهسازی کنیم، بهترین گزینه ممکن یک Custom Renderer (+) برای کنترل Entry است که از EditText به عنوان مبنایی برای کنترل native استفاده میکند. تلاش میکنیم تا همه دانشی که در نتیجه بررسی گزینههای مختلف به دست آمده است را در مورد این کیبورد سفارشی اندروید پیادهسازی کنیم.
کدنویسی
توجه کنید که به منظور پیادهسازی کیبورد سفارشی اندروید باید Xamarin Forms با نسخه 3.6.0.135200-pre1 یا بالاتر استفاده کنید، زیرا به متد OnFocusChangeRequest نیاز داریم که در این نسخهها موجود است. ابتدا یک کنترل سفارشی میسازیم که یک مشخصه «اتصالپذیر» bindable دارد.
در این مشخصه، خصوصیتی به نام EnterCommand و با نوع ICommand وجود دارد که برای اتصال به اکشن فشرده شدن کلید Enter استفاده میشود. اینک کنترل سفارشی ما به صورت زیر است:
سپس به پروژه اندروید میرویم و آنجا کار میکنیم. در ادامه دوباره به پروژه Xamarin Forms خود بازمیگردیم. پیش از ادامه باید مطمئن شویم که همه پکیجهای اندروید مورد نیاز را داریم:

سپس باید MainActivity اندروید خود را ویرایش کنیم تا از نمایش کیبورد نیتیو جلوگیری کنیم. به این منظور از خصوصیت SoftInputMode.StateAlwaysHidden استفاده میکنیم:
کار بعدی که انجام میدهیم آغاز تعریف کیبورد سفارشی است.
درون پوشه Resource/layout یک لیآوت اندروید به نام CustomKeyboard و از نوع InputMethodService.Keyboard ایجاد میکنیم.
قبل از هر چیز مشخصه alignParentBottom را به صورت true تنظیم میکنیم، زیرا میخواهیم کیبورد از سمت پایین صفحه ظاهر شود. سپس مشخصه keyPreviewLayout را به صورت null تنظیم میکنیم، زیرا در این نمونه نمیخواهیم وقتی کلیدی فشرده شد، لیآوت واکنشی داشته باشد.
چنان که میبینید مشخصه keyBackground به یک drawable به نام keyboard_background اشاره میکند که وجود ندارد، بنابراین باید آن را درون پوشه Drawable به صورت یک فایل xml بسازیم. در این بخش یک سلکتور حالت برای دو حالت کلید یعنی normal (بدون فشرده شدن) و pressed (فشرده شدن) تعریف میکنیم.
چنان که میبینید میخواهیم دو xml دیگر درون پوشه Drawable بسازیم که در آنها حس و ظاهر کیبورد خود را تعریف میکنیم تا با قالب اپلیکیشن هماهنگ باشد.
فایل normal.xml
فایل pressed.xml
اینک درون پوشه values یک فایل xml به نام ids ایجاد میکنیم که در ادامه مورد استفاده قرار خواهد گرفت:
سپس درون پوشه Resources یک پوشه به نام xml میسازیم. درون آن یک فایل xml ایجاد میکنیم که کلیدهای کیبورد خاص خود را در آن تعریف میکنیم.
\در این مورد کیبورد به نام special_keyboard خوانده میشود و از نوع Keyboard خواهد بود که در آن اندازه افقی و عمودی کلیدها، مشخصههای horizontalGap و verticalGap که به فاصلهبندی اشاره میکنند و همچنین نوع ابعاد %p را تعریف میکنیم که نوعی از درصد مرتبط با نمای والد است.
هر ردیف از کلیدها درون بخشهایی قرار میگیرد که با تگهای <Row></Row> از هم جدا میشوند. ردیف نخست با یک خط جداکننده اشغال شده است که محدوده کیبورد را نشان میدهد. تگ ردیف دارای ارتفاع 4dp است و بخش فوقانی کیبورد را از طریق مشخصه rowEdgeFlags نشان میدهد. سپس یک خط به صورت یک key درون تگهای Row اضافه میکنیم که عرض کامل کیبورد را اشغال میکند. جداکننده ما یک Xml دیگر است که درون پوشه Drawable ایجاد خواهیم کرد.
فایل kb_separator_line.xml
هر Key دو مشخصه صراحتاً ضروری به نامهای codes و keyLabel دارد. code عددی است که به سیستم عامل اعلام میکند که کلید به کدام حرف یا نماد مربوط است. کیبوردهای سفارشی مختلف از کدهای گوناگونی برای اشاره به نماد یا کلیدها استفاده میکنند؛ اما بهترین فرست کدها که اغلب نیازها را تأمین میکند Android Keycodes (+) است. میتوانید مستندات رسمی اندروید (+) و یا حتی مستندات اندروید زامارین (+) را نیز ببینید، اما هیچ کدام از آنها با دقت کار نمیکنند.
keyLabel رشتهای است که قرار است در کلید ما نمایش یابد. قرار دادن این مشخصه حتی در صورتی که قصد نمایش هیچ متنی روی کلید ندارید، حائز اهمیت بالایی است. در آن حالت میتوانید از ""=keyLabel استفاده کنید.
در مورد استایل در ابتدا و انتهای هر ردیف یک کلید با کد معادل 0 اضافه میکنیم. این کلیدها دارای مشخصه keyEdgeFlags با مقادیر left یا right مناسب هستند. کد کامل کیبورد به صورت زیر است:
فایل special_keyboard.xml
در نهایت پیش از کار روی رندر کننده پوشه دیگری درون Resources به نام anim ایجاد میکنیم که در آن یک فایل xml به نام slide_in_bottom می سازیم. انیمیشن ظاهرشدن کیبورد ما روی صفحه در این فایل قرار میگیرد:
اکنون یک پوشه جدید به نام Renderers روی پروژه اندروید ایجاد میکنیم و درون آن رندر کننده خود را که EntryWithCustomKeyboardRenderer نام دارد و از EntryRenderer بسط یافته و اینترفیس IOnKeyboardActionListener را پیادهسازی میکند تعریف میکنیم. همچنین درون رندر کننده سفارشی یک کلاس خصوصی به نام NullListener ایجاد میکنیم که قرار است از Java.Lang.Object بسط یابد و اینترفیس IOnKeyboardActionListener را پیادهسازی کند که در رندر کننده خود مورد استفاده قرار میدهیم تا از استثناهای null جلوگیری کنیم.
در نهایت به پروژه Xamarin Forms باز میگردیم و کیبورد خاص خود را پیادهسازی میکنیم:
فایل MainPage.xaml
همچنین در کد قبلی خود EnterCommand را که پیشتر ساختیم پیادهسازی میکنیم. بدین ترتیب اکشنی که میخواهیم هنگام فشردن کلید اینتر کیبورد سفارشی انجام یابد را تعریف میکنیم:
فایل MainPage.cs
نتیجه نهایی به صورت زیر است:

بدین ترتیب به پایان راهنما میرسیم. برای مشاهده کد کامل این پروژه به این ریپوی گیتهاب (+) مراجعه کنید.
اگر این مطلب برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای پروژهمحور برنامهنویسی اندروید
- مجموعه آموزشهای برنامهنویسی
- آموزش برنامهنویسی اندروید (Android) – پیشرفته
- روشهای اجرای اپلیکیشنهای اندروید در ویندوز — راهنمای کاربردی
- نکات کلیدی اندروید ۱۰ برای توسعهدهندگان — راهنمای کاربردی
==













درود استاد
بنده یکم گیج شدم اگه میشه لطف کنید فیلم همین کارو بذارین که راحت تر بتونم بفهممش…
مورد ضروری دمتون گرم لطفاً کمک کنید🙏🏻
سلام
آموزش ساخت کیبورد واقعا خیلی خوب بود ممنون
خیلی زیبا آموزش دادین ، خیلی ممنون برای این آموزشتون
دمتون گرم عالی
سلام لطفا اگر کسی برنانکه نویسی کیبورد سفارشی بلده بسازه به ایمیل من پیام بده بهم یاد بده خیلی ازش ممنون میشم