آموزش ساخت کیبورد سفارشی در برنامه نویسی اندروید
سلام دوستان در این سری از آموزش برنامه نویسی اندروید به آموزش ساخت کیبورد سفارشی در برنامه نویسی اندروید می پردازیم برنامه های که در اینترنت می بینید از همین کد ها استفاده کرده اند و فقط بخش های از آن را سفارشی سازی کرده اند پس در ادامه می توانید پیش نمایشی از آن را مشاهده کنید با ما همراه باشید.
در ابتدای کار وارد فایل string.xml شده (در مسیر res/values قرار دارد) سپس string های زیر را در آن قرار دهید.
1 2 3 4 5 | <resources> <string name="app_name">Programchi KeyBoard</string> <string name="simple_ime">Simple IME</string> <string name="subtype_en_US">English (US)</string> </resources> |
در ابتدای کار شما باید یک پوشه در ریشه res خود به نام xml ایجاد کنید سپس در آن یک فایل به نام qwerty.xml ایجاد کرده و کد های زیر را در آن قرار دهید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | <Keyboard xmlns:android="http://schemas.android.com/apk/res/android" android:keyWidth="10%p" android:horizontalGap="0px" android:verticalGap="0px" android:keyHeight="60dp" > <Row> <Key android:codes="49" android:keyLabel="1" android:keyEdgeFlags="left"/> <Key android:codes="50" android:keyLabel="2"/> <Key android:codes="51" android:keyLabel="3"/> <Key android:codes="52" android:keyLabel="4"/> <Key android:codes="53" android:keyLabel="5"/> <Key android:codes="54" android:keyLabel="6"/> <Key android:codes="55" android:keyLabel="7"/> <Key android:codes="56" android:keyLabel="8"/> <Key android:codes="57" android:keyLabel="9"/> <Key android:codes="48" android:keyLabel="0" android:keyEdgeFlags="right"/> </Row> <Row> <Key android:codes="113" android:keyLabel="q" android:keyEdgeFlags="left"/> <Key android:codes="119" android:keyLabel="w"/> <Key android:codes="101" android:keyLabel="e"/> <Key android:codes="114" android:keyLabel="r"/> <Key android:codes="116" android:keyLabel="t"/> <Key android:codes="121" android:keyLabel="y"/> <Key android:codes="117" android:keyLabel="u"/> <Key android:codes="105" android:keyLabel="i"/> <Key android:codes="111" android:keyLabel="o"/> <Key android:codes="112" android:keyLabel="p" android:keyEdgeFlags="right"/> </Row> <Row> <Key android:codes="97" android:keyLabel="a" android:keyEdgeFlags="left"/> <Key android:codes="115" android:keyLabel="s"/> <Key android:codes="100" android:keyLabel="d"/> <Key android:codes="102" android:keyLabel="f"/> <Key android:codes="103" android:keyLabel="g"/> <Key android:codes="104" android:keyLabel="h"/> <Key android:codes="106" android:keyLabel="j"/> <Key android:codes="107" android:keyLabel="k"/> <Key android:codes="108" android:keyLabel="l"/> <Key android:codes="35,64" android:keyLabel="\# \@" android:keyEdgeFlags="right"/> </Row> <Row> <Key android:codes="-1" android:keyLabel="CAPS" android:keyEdgeFlags="left"/> <Key android:codes="122" android:keyLabel="z"/> <Key android:codes="120" android:keyLabel="x"/> <Key android:codes="99" android:keyLabel="c"/> <Key android:codes="118" android:keyLabel="v"/> <Key android:codes="98" android:keyLabel="b"/> <Key android:codes="110" android:keyLabel="n"/> <Key android:codes="109" android:keyLabel="m"/> <Key android:codes="46" android:keyLabel="."/> <Key android:codes="63,33,58" android:keyLabel="\? ! :" android:keyEdgeFlags="right"/> </Row> <Row android:rowEdgeFlags="bottom"> <Key android:codes="44" android:keyLabel="," android:keyWidth="10%p" android:keyEdgeFlags="left"/> <Key android:codes="47" android:keyLabel="/" android:keyWidth="10%p" /> <Key android:codes="32" android:keyLabel="SPACE" android:keyWidth="40%p" android:isRepeatable="true"/> <Key android:codes="-5" android:keyLabel="DEL" android:keyWidth="20%p" android:isRepeatable="true"/> <Key android:codes="-4" android:keyLabel="DONE" android:keyWidth="20%p" android:keyEdgeFlags="right"/> </Row> </Keyboard> |
کد بالا شکل ظاهری کیبور ما را ایجا می کند هر کیبور یک کدی دارد این کد ها از بخش developer گوگل برداشته شده است.
در همان پوشه یک فایل دیگر به نام method.xml ایجاد کرده و کد زیر را در آن قرار دهید.
1 2 3 4 5 6 7 | <?xml version="1.0" encoding="utf-8"?> <input-method xmlns:android="http://schemas.android.com/apk/res/android"> <subtype android:label="@string/subtype_en_US" android:imeSubtypeLocale="en_US" android:imeSubtypeMode="keyboard" /> </input-method> |
یک فایل به نام keyboard.xml ایجاد کرده (در مسیر res/layout) و کد های زیرا را در آن قرار دهید.
1 2 3 4 5 6 7 8 9 | <?xml version="1.0" encoding="UTF-8"?> <android.inputmethodservice.KeyboardView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/keyboard" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:keyPreviewLayout ="@layout/preview" /> |
در کد بالا خطا دارید ادامه آموزش را دنبال کنیدو
یک فایل دیگر به نام preview.xml ایجاد کرده و کد های زیر را در آن قرار دهید.
1 2 3 4 5 6 7 8 9 10 | <?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:background="#ffff00" android:textStyle="bold" android:textSize="30sp" > </TextView> |
یک فایل به نام SimpleIME.java ایجاد کرده این کلاس از نوع سرویس است و کدهای زیر را در آن قرار دهید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | public class SimpleIME extends InputMethodService implements OnKeyboardActionListener{ private KeyboardView kv; private Keyboard keyboard; private boolean caps = false; @Override public void onKey(int primaryCode, int[] keyCodes) { InputConnection ic = getCurrentInputConnection(); playClick(primaryCode); switch(primaryCode){ case Keyboard.KEYCODE_DELETE : ic.deleteSurroundingText(1, 0); break; case Keyboard.KEYCODE_SHIFT: caps = !caps; keyboard.setShifted(caps); kv.invalidateAllKeys(); break; case Keyboard.KEYCODE_DONE: ic.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_ENTER)); break; default: char code = (char)primaryCode; if(Character.isLetter(code) && caps){ code = Character.toUpperCase(code); } ic.commitText(String.valueOf(code),1); } } @Override public void onPress(int primaryCode) { } @Override public View onCreateInputView() { kv = (KeyboardView)getLayoutInflater().inflate(R.layout.keyboard, null); keyboard = new Keyboard(this, R.xml.qwerty); kv.setKeyboard(keyboard); kv.setOnKeyboardActionListener(this); return kv; } @Override public void onRelease(int primaryCode) { } @Override public void onText(CharSequence text) { } @Override public void swipeDown() { } @Override public void swipeLeft() { } @Override public void swipeRight() { } @Override public void swipeUp() { } } |
سپس وارد AndroidManifest.xml شده و کد زیر را قرار دهید.
1 2 3 4 5 6 7 8 9 | <service android:name=".SimpleIME" android:label="@string/simple_ime" android:permission="android.permission.BIND_INPUT_METHOD" > <meta-data android:name="android.view.im" android:resource="@xml/method"/> <intent-filter> <action android:name="android.view.InputMethod" /> </intent-filter> </service> |
این آموزش هم به پایان رسید.
موفق و موید باشید.
سلام این کجاش سفترشیه؟ خیلی خلاصه بود حداقل توضیح می دادید چجوری تم سفارشی اضافه کنیم یا تغییر در شکل و شمایل کیبورد…
خسته نباشید . میشه به این کیبورد ، کیبورد اموجی هم اضافه کنید ممنون
سلام ممنون.اموزش اموجی قبلا در سایت قرار گرفته
https://programchi.ir/2017/05/15/%d8%a7%d8%b6%d8%a7%d9%81%d9%87-%da%a9%d8%b1%d8%af%d9%86-emoji-%d8%a8%d9%87-%d8%a7%d9%be%d9%84%db%8c%da%a9%db%8c%d8%b4%d9%86-%d8%a7%d9%86%d8%af%d8%b1%d9%88%db%8c%d8%af/
سلام . وقت بخیر . ممنون از این آموزش.من کامل این کد هارو وارد کردم ولی در زمان اجرا همون کیبورد گوشی اجرا میشه
سلام . خوب این انجام شد . حالا چطور فارسی کنیم
با سلام چگونه زبان فارسی را اضافه کنم و دیگر زبانها لطفا با ایمیل جوابم را بدید ممنون میشم
آقا الان همون اول کجا بریم که string.xml و .. باشه
سلام و خسته نباشید
الان این کد ها رو تو چه محیطی بنویسیم و چطوری کیبورد خشابی بسازیم ایا بلدید؟
در مرحله اول کجا باید بریم که.string.xml باشه
چطوری یه تم واسه این نوع کیبورد بزارم
سلام
میشه بگید همون اول کار پوشه resرو از کجا اوردید و بعد فایلارو توش قرار دادید؟
من با اپو ادیتور فایلایه یه برنامه رو پاک کردم و فایلایه شمارو جایگزین کردم ولی ارور داد
سلام.میشه بگید همون اول کار پوشه resرو از کجا اوردید؟
من نفهمیدم برا همین با اپک ادیتور یه برنامه رو ویرایش کردم همه فایل هاشو پاک کردم و فایلاییو که شما گفتیدو جایگزین کردم ولی ارور داد
اگه میشه یه برنامه خام بزارید تویه سایت تا اونو دانلود کنیم و فایلایه شمارو با اپک ادیتور تویه اون برنامه بزاریم
حاجی اینارو کجا بزنبم
public class SimpleIME extends InputMethodService
implements OnKeyboardActionListener{
private KeyboardView kv;
private Keyboard keyboard;
private boolean caps = false;
@Override
public void onKey(int primaryCode, int[] keyCodes) {
InputConnection ic = getCurrentInputConnection();
playClick(primaryCode);
switch(primaryCode){
case Keyboard.KEYCODE_DELETE :
ic.deleteSurroundingText(1, 0);
break;
case Keyboard.KEYCODE_SHIFT:
caps = !caps;
keyboard.setShifted(caps);
kv.invalidateAllKeys();
break;
case Keyboard.KEYCODE_DONE:
ic.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_ENTER));
break;
default:
char code = (char)primaryCode;
if(Character.isLetter(code) && caps){
code = Character.toUpperCase(code);
}
ic.commitText(String.valueOf(code),1);
}
}
@Override
public void onPress(int primaryCode) {
}
@Override
public View onCreateInputView() {
kv = (KeyboardView)getLayoutInflater().inflate(R.layout.keyboard, null);
keyboard = new Keyboard(this, R.xml.qwerty);
kv.setKeyboard(keyboard);
kv.setOnKeyboardActionListener(this);
return kv;
}
@Override
public void onRelease(int primaryCode) {
}
@Override
public void onText(CharSequence text) {
}
@Override
public void swipeDown() {
}
@Override
public void swipeLeft() {
}
@Override
public void swipeRight() {
}
@Override
public void swipeUp() {
}
}
من توی این کد یکم مشکل دارم میشه کمکم کنید ممنون?
میشه بگید با چه برنامه ای درستش کنیم ولینک دانلود برنامه رو بزارید چون من هر چی گشتم ندیدم برنامشو
میشه یک فیلم اموزشی تهیه کنید
با برنامه AIDE
سلام.ممنون از سایت خوبتون و آموزشای عالیتون.
من تو اکتیویتی SimpleIME خط playClick(primaryCode); رو مشکل دارم.میگه که تابع playClick وجود نداره.
ممنون میشم زودتر جواب سوالمو بدین بدجور لنگم.بازم ممنون