我将为您提供创建没有使用任何已弃用API的方法的详细指南。首先,让我们从
InputMethodService
实现开始,您可以使用
onCreateInputView()
方法显示主键盘布局。它需要您返回一个
View
,该视图在服务启动时显示在屏幕上。因此,您可以在
res/layout/keyboard_view.xml
中创建一个键盘布局:
public class ControlBoard extends InputMethodService {
View mainKeyboardView;
boolean shiftPressed = false;
int metaState = 0;
@Override
public View onCreateInputView() {
mainKeyboardView = getLayoutInflater().inflate(R.layout.keyboard_view, null);
return mainKeyboardView;
}
.....
为了创建布局,您可以使用任何您想要的方式,但我将向您展示如何使用
LinearLayout
进行操作。您可以使用一个
orientation:vertical
的LinearLayout作为根元素,然后嵌套更多
orientation:horizontal
的LinearLayout来创建行,并使用
Button
。为了存储按键代码,您可以在按钮中使用
android:tag
属性。对于样式,您可以将
theme
应用于根元素或将
style
应用于每个按钮。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/keyboard_view"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:background="@drawable/keyboard_bg"
>
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="48dp"
>
<Button style="@style/NormalKeyStyles" android:tag="SHIFT" android:text="SHFT" />
<Button style="@style/NormalKeyStyles" android:tag="G" android:text="g" />
<Button style="@style/NormalKeyStyles" android:tag="3" android:text="3" />
<Button style="@style/NormalKeyStyles" android:tag="APOSTROPHE" android:text="\'" />
<Button style="@style/NormalKeyStyles" android:tag="DEL" android:text="<\-" />
<Button style="@style/NormalKeyStyles" android:tag="ENTER" android:text="<\-\|" />
</LinearLayout>
</LinearLayout>
参考:KeyEvent.KEYCODE_
res/values/styles.xml
:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="NormalKeyStyles" parent="TextAppearance.AppCompat">
<item name="android:layout_width">0dp</item>
<item name="android:layout_weight">1</item>
<item name="android:layout_height">match_parent</item>
<item name="android:background">@color/key_bg_selector</item>
<item name="android:textColor">@color/white</item>
<item name="android:textSize">24sp</item>
<item name="android:textAllCaps">false</item>
<item name="android:onClick">onKeyClick</item>
</style>
</resources>
正如你所看到的,onKeyClick()
方法通过 NormalKeyStyles
绑定在每个 Button
上,它将处理点击事件。现在让我们看看如何处理它们。
我们可以使用 View.getTag()
方法从 XML 文件中提取我们分配给按键的键码。然后,我们可以使用 InputConnection.sendKeyEvent()
将事件发送给客户端。
public void onKeyClick(View pressedKey) {
InputConnection inputConnection = getCurrentInputConnection();
if (inputConnection == null) return;
long now = System.currentTimeMillis();
String keyType = (String) pressedKey.getTag();
}
switch(keyType) {
case "SHIFT":
shiftPressed = !shiftPressed;
default:
if (shiftPressed) {
metaState = KeyCode.META_SHIFT_MASK;
} else {
metaState = 0;
}
try {
int keycode = KeyEvent.class.getField("KEYCODE_" + keyType).getInt(null), 0, metaState);
inputConnection.sendKeyEvent(new KeyEvent(now, now, KeyEvent.ACTION_DOWN, keycode);
} catch (IllegalAccessException | NoSuchFieldException e) {
}
}
}
}
现在你已经可以使用了,但我想添加一些可能对你有帮助的注释:
你可以使用 setInputView()
在初始化后更改布局,所以你可以添加一个标签为 "CHANGE_LAYOUT" 的按键,并在 onKeyClick()
方法中添加一个 case 语句来切换不同的键盘。
如果你想在布局中添加额外的符号,这些符号没有直接的 KeyEvent
keycode 字段,比如 $ 符号、表情符号或其他 Unicode 字符,你可以在那里使用 SHIFT
掩码(如果有的话,比如 SHIFT + 4
会产生 $ 符号),或者你可以使用 commitText()
进行输入。
要添加键预览弹出窗口,你可以使用一个 PopupWindow
,带有一个 TextView
,并在触摸开始时在键上方显示它,在触摸结束时将其关闭,并使用 setText()
更改 PopupWindow
文本。
对于更复杂的实现,你可以查看我的 GitHub 上的 Control Board 源代码。