java - 为什么设置新键盘后我的 Android 自定义 KeyboardView 会溢出?
问题描述
我正在为安卓开发一个键盘。现在我想将我的键盘从字母更改为符号,然后用户按下“ 123 ”按钮。我的问题是,调用后键盘溢出keyboardView.setKeyboard()
。
我尝试了什么:我记录了键盘的宽度。正常宽度是720,设置新键盘后超过800。我也试过打电话keyboardView.invalidate()
和i nvalidateAllKEeys()
。两者都没有效果。我复制粘贴了键盘 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() {
}
}
解决方案
推荐阅读
- angular - Viewchild 使用多个选择器获取元素引用
- javascript - 想要 3 个按钮,第一个用于左旋转,第二个用于图像右旋转,3 个用于停止
- c++ - 调用方法时的 C++ Cout。不知道我做错了什么
- swift - 从 Swift 中的另一个类声明 AppDelegate 推送通知委托?
- reactjs - Font Awesome 图标不会出现在 DOM 中
- javascript - 以不可变的方式更新子组件中父级的状态
- html - 如何将 2 列 div 中的标题和无序列表与 css 对齐
- google-sheets - 在行之间连接具有相同字符的列
- javascript - 在 React 中与 Amplify JS 和 Cognito 集成
- r - 您如何在 Windows 上以差异方式安装软件包?