我使用Android服务创建了泰米尔语键盘。
它在谷歌应用程序中运行良好。在所有其他应用程序中,键入3到10个字符后崩溃。 如果我从谷歌应用程序复制字符并粘贴到其他应用程序中,即使我再次键入相同的字符串也不会崩溃。再次删除时,它会到达该点并崩溃。
我尝试输入字符串"தமிழுக்குகு்ஏது"。在打字时总是崩溃"ஏ"有时会在"நி,க,ர்"
崩溃在whatsapp中,我试图输入泰米尔语。给空间后,如果我开始输入一个新单词,前一个单词的最后一个单词会自动从字母中分割出来。附上截图。 在谷歌应用程序中它没有发生(不分裂)。
该应用只能运行服务。我无法启用调试器来查找崩溃。 我打印了键入后传递的代码。代码正常运行并打印出来。即使是最后按下的代码也会在崩溃之前进行。
如果有人遇到同样的问题并且你们已经修好了,请分享你的经验。
代码: qwerty xml:
<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
android:keyWidth="10%p"
android:horizontalGap="0px"
android:verticalGap="0px"
android:keyHeight="40dp"
>
....<!--above rows-->
<Row>
<Key android:codes="2946" android:keyLabel="்" android:keyWidth="9%p" android:keyEdgeFlags="left"/>
<Key android:codes="3006" android:keyLabel="ா"/>
<Key android:codes="3007" android:keyLabel="ி" android:keyWidth="9%p"/>
<Key android:codes="3008" android:keyLabel="ீ" android:keyWidth="9%p"/>
<Key android:codes="3009" android:keyLabel="ு" android:keyWidth="9%p"/>
<Key android:codes="3010" android:keyLabel="ூ" android:keyWidth="9%p"/>
<Key android:codes="3014" android:keyLabel="ெ" android:keyWidth="11%p"/>
<Key android:codes="3015" android:keyLabel="ே" android:keyWidth="11%p"/>
<Key android:codes="3016" android:keyLabel="ை" android:keyWidth="11%p"/>
<Key android:codes="2964" android:keyLabel="ஔ" android:keyWidth="12%p" android:keyEdgeFlags="right" />
....<!--bottom rows-->
</Row>
</Keyboard>
方法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>
layout 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"/>
Java类文件:
public class SimpleIME extends InputMethodService
implements KeyboardView.OnKeyboardActionListener {
private KeyboardView kv;
private Keyboard keyboard;
private boolean caps = false;
@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;
}
private void playClick(int keyCode){
AudioManager am = (AudioManager)getSystemService(AUDIO_SERVICE);
switch(keyCode){
case 32:
am.playSoundEffect(AudioManager.FX_KEYPRESS_SPACEBAR);
break;
case Keyboard.KEYCODE_DONE:
case 10:
am.playSoundEffect(AudioManager.FX_KEYPRESS_RETURN);
break;
case Keyboard.KEYCODE_DELETE:
am.playSoundEffect(AudioManager.FX_KEYPRESS_DELETE);
break;
default: am.playSoundEffect(AudioManager.FX_KEYPRESS_STANDARD);
}
}
@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);
}
}
}