我正在开发安卓键盘。现在我想将键盘从字母更改为符号,然后用户按“123”按钮。 我的问题是,调用
keyboardView.setKeyboard()
后键盘溢出。
我尝试过的: 我记录了键盘的宽度。正常宽度是720,设置新键盘后,宽度是800多。 我还尝试打电话给
keyboardView.invalidate()
和invalidateAllKEeys()
。两者都没有效果。
我复制粘贴了键盘 XML 布局以排除由布局引起的问题。
我该如何解决这个问题?
谢谢你帮助我。
这是我的输入服务类
package com.luxaaa.keyboardtest.services;
@SuppressWarnings("deprecation")
public class MyInputMethodService extends InputMethodService implements
KeyboardView.OnKeyboardActionListener {
private KeyboardView keyboardView;
private Keyboard keyboard, keyBoardSymbolic;
private boolean caps = false;
Vibrator vibrator;
VibrationEffect vEffect;
public MyInputMethodService() {
super();
}
@Override
public View onCreateInputView() {
LinearLayout layout =new LinearLayout(this);
layout.setOrientation(LinearLayout.VERTICAL);
View view = getLayoutInflater().inflate(R.layout.keyboard_bar, null);
// Keyboards
keyboard =new Keyboard(this, R.xml.keys_layout);
keyBoardSymbolic =new Keyboard(this, R.xml.keys_layout);
keyboardView = (KeyboardView) getLayoutInflater().inflate(R.layout.keyboard_view, null);
keyboardView.setKeyboard(keyBoardSymbolic);
keyboardView.setOnKeyboardActionListener(this);
keyboardView.setPreviewEnabled(false);
layout.addView(view);
layout.addView(keyboardView);
vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
return layout;
}
@Override
public void onPress(int primaryCode) {
if(primaryCode != KeyEvent.KEYCODE_SPACE) {
keyboardView.setPreviewEnabled(true);
}
// key feedback
vibrator.vibrate(50);
// set shift keys pressed if caps
if(primaryCode == Keyboard.KEYCODE_SHIFT) {
List<Keyboard.Key> keys = keyboard.getKeys();
List<Keyboard.Key> keysSymbolic = keyBoardSymbolic.getKeys();
for(Keyboard.Key key : keys) {
if(key.codes[0] == primaryCode) {
key.pressed = !caps;
}
}
for(Keyboard.Key key : keysSymbolic) {
if(key.codes[0] == primaryCode) {
key.pressed = !caps;
}
}
}
}
@Override
public void onRelease(int primaryCode) {
keyboardView.setPreviewEnabled(false);
}
@Override
public void onKey(int primaryCode, int[] keyCodes) {
InputConnection inputConnection = getCurrentInputConnection();
if (inputConnection != null) {
switch (primaryCode) {
case Keyboard.KEYCODE_DELETE :
CharSequence selectedText = inputConnection.getSelectedText(0);
if(TextUtils.isEmpty(selectedText)) {
inputConnection.deleteSurroundingText(1,0);
} else {
inputConnection.commitText("", 1);
}
break;
case Keyboard.KEYCODE_SHIFT :
caps = !caps;
keyboard.setShifted(caps);
keyboardView.invalidateAllKeys();
break;
case Keyboard.KEYCODE_DONE :
inputConnection.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_ENTER));
break;
case -10 :
keyboardView.setKeyboard(keyboard);
break;
default:
char code = (char) primaryCode;
if(Character.isLetter(code) && caps) {
code = Character.toUpperCase(code);
}
inputConnection.commitText(String.valueOf(code), 1);
break;
}
}
}
@Override
public void onText(CharSequence text) {
}
@Override
public void swipeLeft() {
}
@Override
public void swipeRight() {
}
@Override
public void swipeDown() {
}
@Override
public void swipeUp() {
}
}
我遇到了同样的问题,我尝试将horizontalGap和verticalGap调整为较小的值,并且成功了。