我正在使用
Android的自定义键盘,我遇到一个问题,键盘似乎在右边留下了一个白线/空格,而不是填充父视图…(不要介意图标,现在只是占位符图形)
下面你可以看到我的布局…
<Keyboard xmlns:android="http://schemas.android.com/apk/res/android" android:keyWidth="14%p" android:horizontalGap="0px" android:verticalGap="0px" android:keyHeight="60dp" > <Row> <Key android:codes="49" android:keyIcon="@drawable/rsz_emoji" android:horizontalGap="1%p" android:keyEdgeFlags="left"/> <Key android:codes="50" android:keyIcon="@drawable/rsz_emoji"/> <Key android:codes="51" android:keyIcon="@drawable/rsz_emoji"/> <Key android:codes="52" android:keyIcon="@drawable/rsz_emoji"/> <Key android:codes="53" android:keyIcon="@drawable/rsz_emoji"/> <Key android:codes="54" android:keyIcon="@drawable/rsz_emoji"/> <Key android:codes="48" android:keyIcon="@drawable/rsz_emoji" android:keyEdgeFlags="right"/> </Row> <Row> <Key android:codes="113" android:keyIcon="@drawable/rsz_emoji" android:horizontalGap="8%p" android:keyEdgeFlags="left"/> <Key android:codes="114" android:keyIcon="@drawable/rsz_emoji"/> <Key android:codes="116" android:keyIcon="@drawable/rsz_emoji"/> <Key android:codes="121" android:keyIcon="@drawable/rsz_emoji"/> <Key android:codes="111" android:keyIcon="@drawable/rsz_emoji"/> <Key android:codes="112" android:keyIcon="@drawable/rsz_emoji" android:keyEdgeFlags="right"/> </Row> <Row> <Key android:codes="1" android:keyIcon="@drawable/rsz_emoji" android:keyWidth="28%p" android:horizontalGap="8%p" android:keyEdgeFlags="left"/> <Key android:codes="46" android:keyIcon="@drawable/rsz_emoji" android:keyWidth="28%p"/> <Key android:codes="58" android:keyIcon="@drawable/rsz_emoji" android:keyWidth="28%p" android:keyEdgeFlags="right"/> </Row> <Row android:rowEdgeFlags="bottom"> <Key android:codes="44" android:keyIcon="@drawable/globe" android:horizontalGap="8%p" android:keyEdgeFlags="left"/> <Key android:codes="47" android:keyIcon="@drawable/rsz_emoji"/> <Key android:codes="32" android:keyIcon="@drawable/rsz_emoji" android:keyWidth="28%p"/> <Key android:codes="1" android:keyIcon="@drawable/rsz_emoji"/> <Key android:codes="-5" android:keyIcon="@drawable/backspace" android:keyEdgeFlags="right"/> </Row> </Keyboard>
据我所见,这是一个1%的问题…但是我有点不确定如何填补它,而不会弄乱我的排列…例如将第一行的差距改为2将修复它,但会弄乱对齐.
我的类扩展InputMethodService:
private KeyboardView kv; private Keyboard keyboard; @Override public View onCreateInputView() { kv = (KeyboardView)getLayoutInflater().inflate(R.layout.keyboard,null); keyboard = new Keyboard(this,R.xml.custom_keyboard); kv.setPreviewEnabled(false); kv.setKeyboard(keyboard); kv.setOnKeyboardActionListener(this); return kv; } @Override public void onPress(int primaryCode) { } @Override public void onRelease(int primaryCode) { } @Override public void onKey(int primaryCode,int[] keyCodes) { InputConnection ic = getCurrentInputConnection(); if (primaryCode == Keyboard.KEYCODE_DELETE) { ic.deleteSurroundingText(1,0); } else { Drawable mDrawable = ResourcesCompat.getDrawable(getResources(),R.drawable.rsz_emoji,null); Bitmap mBitmap = ((BitmapDrawable)mDrawable).getBitmap(); String path = MediaStore.Images.Media.insertImage(getContentResolver(),mBitmap,"Emoticon",null); Uri fileUri = Uri.parse(path); Intent picMessageIntent = new Intent(Intent.ACTION_SEND); picMessageIntent.setPackage("com.android.mms"); picMessageIntent.putExtra(Intent.EXTRA_STREAM,fileUri); picMessageIntent.setType("image/png"); picMessageIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(picMessageIntent); } } @Override public void onText(CharSequence text) { } @Override public void swipeLeft() { } @Override public void swipeRight() { } @Override public void swipeDown() { } @Override public void swipeUp() { }
我的Keyboard.xml
<?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" />
Styles.xml
<resources> <!-- Base application theme. --> <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- Customize your theme here. --> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> </style> </resources>
表现:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="CENSORED" > <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name" android:theme="@style/AppTheme.NoActionBar" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <!-- Declares the input method service --> <service android:name=".CENSORED" android:label="@string/keyboard_name" android:permission="android.permission.BIND_INPUT_METHOD"> <intent-filter> <action android:name="android.view.InputMethod" /> </intent-filter> <Meta-data android:name="android.view.im" android:resource="@xml/method" /> </service> </application> <uses-permission android:name="android.permission.INTERNET" /> </manifest>
解决方法
我无法重现错误,我提供了一个屏幕截图,一个浅色的背景应用程序和我所有的相关代码.我不知道你在哪里出错,没有看到整个项目和目录,所以我已经发布了相关的xml.还有一个服务类,我没有包括(因为你显然有它的工作).
<键盘>在资源/ xml文件夹中的代码是名为qwerty.xml的文件,其中有一个名为method.xml的文件:
我使用了qwerty.xml中的所有键盘尺寸,但我更换了图像.
method.xml
<?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
<?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
<?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:background="#ffff00" android:gravity="center" android:textSize="30sp android:textStyle="bold"> </TextView>
样式:
<resources> <!-- Base application theme. --> <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- Customize your theme here. --> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> </style> </resources>
在清单中,在申请内:
<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>
http://code.tutsplus.com/tutorials/create-a-custom-keyboard-on-android–cms-22615
编辑1
在评论中讨论之后,我建议您检查您的背景风格,因为有问题/更改,默认背景颜色可能会显示为键盘窗口.在这个答案https://stackoverflow.com/a/33052648/3956566中详细讨论了这个问题.我不会重申细节,因为链接不太可能腐烂,成为一个激进的SO职位.
编辑2
Ok添加输入法服务的区别:
@Override public void onKey(int primaryCode,int[] keyCodes) { InputConnection ic = getCurrentInputConnection(); 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); } }
编辑3
创建一个空白项目,没有活动的键盘,测试和运行它作为一个单独的应用程序.您正在使用android:theme =“@ style / AppTheme.NoActionBar”在您的启动器活动中,可能是背景不透明度和Windows /视图的问题.