系统键盘
此答案告诉您如何制作可在用户安装在手机上的任何应用程序中使用的自定义系统键盘。如果您想制作一个仅在您自己的应用程序中使用的键盘,那么看我的另一个答案.
下面的例子看起来像这样。您可以针对任何键盘布局修改它。
以下步骤展示了如何创建可用的自定义系统键盘。我尽可能地尝试删除任何不必要的代码。如果您还需要其他功能,我在最后提供了更多帮助的链接。
1. 启动一个新的Android项目
我将我的项目命名为“自定义键盘”。随便你怎么称呼它。这里没有什么特别的。我会离开MainActivity
和“你好世界!”布局原样。
2.添加布局文件
将以下两个文件添加到您的应用程序中res/layout
folder:
键盘视图.xml
这个视图就像一个容纳我们键盘的容器。在此示例中,只有一个键盘,但您可以添加其他键盘并将它们换入或换出此键盘KeyboardView.
<?xml version="1.0" encoding="utf-8"?>
<android.inputmethodservice.KeyboardView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/keyboard_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:keyPreviewLayout="@layout/key_preview"
android:layout_alignParentBottom="true">
</android.inputmethodservice.KeyboardView>
key_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:gravity="center"
android:background="@android:color/white"
android:textColor="@android:color/black"
android:textSize="30sp">
</TextView>
3.添加支持的xml文件
创建一个xml
文件夹在你的res
文件夹。 (右键点击res
并选择新建 > 目录.)
然后将以下两个xml文件添加到其中。 (右键单击xml
文件夹并选择新建 > XML 资源文件.)
number_pad.xml
这就是事情开始变得更有趣的地方。这Keyboard定义了布局keys.
<?xml version="1.0" encoding="utf-8"?>
<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
android:keyWidth="20%p"
android:horizontalGap="5dp"
android:verticalGap="5dp"
android:keyHeight="60dp">
<Row>
<Key android:codes="49" android:keyLabel="1" android:keyEdgeFlags="left"/>
<Key android:codes="50" android:keyLabel="2"/>
<Key android:codes="51" android:keyLabel="3"/>
<Key android:codes="52" android:keyLabel="4"/>
<Key android:codes="53" android:keyLabel="5" android:keyEdgeFlags="right"/>
</Row>
<Row>
<Key android:codes="54" android:keyLabel="6" android:keyEdgeFlags="left"/>
<Key android:codes="55" android:keyLabel="7"/>
<Key android:codes="56" android:keyLabel="8"/>
<Key android:codes="57" android:keyLabel="9"/>
<Key android:codes="48" android:keyLabel="0" android:keyEdgeFlags="right"/>
</Row>
<Row>
<Key android:codes="-5"
android:keyLabel="DELETE"
android:keyWidth="40%p"
android:keyEdgeFlags="left"
android:isRepeatable="true"/>
<Key android:codes="10"
android:keyLabel="ENTER"
android:keyWidth="60%p"
android:keyEdgeFlags="right"/>
</Row>
</Keyboard>
以下是一些需要注意的事项:
-
keyWidth:这是每个键的默认宽度。这
20%p
表示每个键应占据宽度的 20%p不。不过,它可以被各个键覆盖,正如您在第三行中的删除和 Enter 键所看到的那样。
-
keyHeight:这里是硬编码的,但你可以使用类似的东西
@dimen/key_height
针对不同的屏幕尺寸动态设置它。
-
Gap:水平和垂直间隙表示按键之间留有多少空间。即使您将其设置为
0px
仍有一个小差距。
-
codes:这可以是 Unicode 或自定义代码值,用于确定按下该键时会发生什么或输入什么。看keyOutputText如果你想输入更长的 Unicode 字符串。
-
keyLabel:这是按键上显示的文本。
-
keyEdgeFlags:这指示键应与哪条边对齐。
-
isRepeatable:如果按住该键,它将不断重复输入。
方法.xml
该文件告诉系统可用的输入法子类型。我在这里只包含一个最小版本。
<?xml version="1.0" encoding="utf-8"?>
<input-method
xmlns:android="http://schemas.android.com/apk/res/android">
<subtype
android:imeSubtypeMode="keyboard"/>
</input-method>
4. 添加Java代码来处理按键输入
创建一个新的 Java 文件。我们就这样称呼它吧MyInputMethodService
。该文件将所有内容联系在一起。它处理从键盘接收的输入并将其发送到接收它的任何视图(EditText
, 例如)。
public class MyInputMethodService extends InputMethodService implements KeyboardView.OnKeyboardActionListener {
@Override
public View onCreateInputView() {
// get the KeyboardView and add our Keyboard layout to it
KeyboardView keyboardView = (KeyboardView) getLayoutInflater().inflate(R.layout.keyboard_view, null);
Keyboard keyboard = new Keyboard(this, R.xml.number_pad);
keyboardView.setKeyboard(keyboard);
keyboardView.setOnKeyboardActionListener(this);
return keyboardView;
}
@Override
public void onKey(int primaryCode, int[] keyCodes) {
InputConnection ic = getCurrentInputConnection();
if (ic == null) return;
switch (primaryCode) {
case Keyboard.KEYCODE_DELETE:
CharSequence selectedText = ic.getSelectedText(0);
if (TextUtils.isEmpty(selectedText)) {
// no selection, so delete previous character
ic.deleteSurroundingText(1, 0);
} else {
// delete the selection
ic.commitText("", 1);
}
break;
default:
char code = (char) primaryCode;
ic.commitText(String.valueOf(code), 1);
}
}
@Override
public void onPress(int primaryCode) { }
@Override
public void onRelease(int primaryCode) { }
@Override
public void onText(CharSequence text) { }
@Override
public void swipeLeft() { }
@Override
public void swipeRight() { }
@Override
public void swipeDown() { }
@Override
public void swipeUp() { }
}
Notes:
- The
OnKeyboardActionListener
监听键盘输入。它还需要本示例中的所有这些空方法。
- The
InputConnection
用于将输入发送到另一个视图,例如EditText
.
5. 更新清单
我把它放在最后而不是放在前面,因为它引用了我们上面已经添加的文件。要将自定义键盘注册为系统键盘,您需要添加service部分到你的AndroidManifest.xml文件。将其放入application
之后的部分activity
.
<manifest ...>
<application ... >
<activity ... >
...
</activity>
<service
android:name=".MyInputMethodService"
android:label="Keyboard Display 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>
</manifest>
就是这样!您现在应该可以运行您的应用程序了。但是,在设置中启用键盘之前,您不会看到太多内容。
6. 在“设置”中启用键盘
每个想要使用键盘的用户都必须在 Android 设置中启用它。有关如何执行此操作的详细说明,请参阅以下链接:
总结如下:
- 转至 Android 设置 > 语言和输入 > 当前键盘 > 选择键盘。
- 您应该在列表中看到您的自定义键盘。启用它。
- 返回并再次选择当前键盘。您应该在列表中看到您的自定义键盘。选择它。
现在您应该可以在任何可以在 Android 中输入内容的地方使用键盘了。
进一步研究
上面的键盘是可用的,但要创建其他人想要使用的键盘,您可能需要添加更多功能。研究下面的链接以了解操作方法。
-
创建输入法(安卓文档)
-
软键盘(来自 Android 的演示自定义键盘的源代码)
-
构建自定义 Android 键盘(教程) (源代码)
-
在 Android 上创建自定义键盘(啧啧加教程)
-
如何为 Android 创建自定义键盘(YouTube 视频:它是无声的,但我第一次学会了如何做到这一点。)
Going On
不喜欢标准KeyboardView
外表和行为?我当然不这么认为。从Android 2.0开始好像就没有更新过。 Play 商店中的所有自定义键盘怎么样?它们看起来一点也不像上面那个丑陋的键盘。
好消息是您可以完全自定义自己的键盘的外观和行为。您需要执行以下操作:
- 创建您自己的自定义键盘视图的子类
ViewGroup
。你可以用它来填充Button
甚至可以创建您自己的自定义关键视图来进行子类化View
。如果您使用弹出视图,那么请注意这一点.
- Add a 自定义事件监听器键盘上的接口。调用它的方法来进行类似的事情
onKeyClicked(String text)
or onBackspace()
.
- 您不需要添加
keyboard_view.xml
, key_preview.xml
, or number_pad.xml
在上述说明中进行了描述,因为这些都是针对标准的KeyboardView
。您将在自定义视图中处理所有这些 UI 方面。
- In your
MyInputMethodService
类,实现您在键盘类中定义的自定义键盘侦听器。这是代替KeyboardView.OnKeyboardActionListener
,不再需要。
- In your
MyInputMethodService
班级的onCreateInputView()
方法,创建并返回自定义键盘的实例。不要忘记将键盘的自定义监听器设置为this
.