码字辛苦!转载请注明出处!
0、前言
最近在做个远程终端,需要远程输入文字,但因为网络传输原因,经常发生点击变成长按,双击等等问题……
于是产品提出了需求,做一个远程的输入法,我想着安卓十年,区区输入法应该早就资料一抓一把了吧——
——没想到啊没想到,安卓官方输入法文档写的稀烂,相关资料也是对着官方文档抄,根本没法用!!!
气抖冷的我于是决定,自己写一篇真正意义上的文档了,哼!
1、创建服务
先创建一个继承InputMethodService的class
public class FastInputIME extends InputMethodService{
}
然后声明服务
<service android:name="FastInputIME"
android:label="牛逼哄哄的输入法"
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>
最后使用万能键(Alt+Enter)创建缺失的@xml/method文件,写入以下内容
<?xml version="1.0" encoding="utf-8"?>
<input-method xmlns:android="http://schemas.android.com/apk/res/android"
android:settingsActivity="com.package.SettingsActivity"
android:supportsSwitchingToNextInputMethod="true">
</input-method>
此时,已经可以在设置中看到牛逼轰轰的输入法了:
2.创建键盘布局
为了简单好读,写个非常非常简单的数字键盘,注意,标签名是Keyboard,而不是语法提示中的KeyboardView:
<?xml version="1.0" encoding="utf-8"?>
<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Row>
<Key android:codes="1" android:keyLabel="1" />
<Key android:codes="2" android:keyLabel="2" />
<Key android:codes="3" android:keyLabel="3" />
<Key android:codes="4" android:keyLabel="4" />
<Key android:codes="5" android:keyLabel="5" />
<Key android:codes="6" android:keyLabel="6" />
<Key android:codes="7" android:keyLabel="7" />
<Key android:codes="8" android:keyLabel="8" />
<Key android:codes="9" android:keyLabel="9" />
<Key android:codes="0" android:keyLabel="0" />
</Row>
</Keyboard>
其中,keyLabel是显示在按键上的文字,codes就是等会儿监听要使用的keycode了~
3.创建回调,绑定键盘,添加输入事件
因为很简单,大家看我写了注释的部分就可以啦~
package com.eternity.lab;
import android.inputmethodservice.InputMethodService;
import android.inputmethodservice.Keyboard;
import android.inputmethodservice.KeyboardView;
import android.view.View;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputConnection;
public class FastInputIME extends InputMethodService implements KeyboardView.OnKeyboardActionListener {
private InputConnection ic;
@Override
public View onCreateInputView() {
KeyboardView keyboardView = new KeyboardView(getApplicationContext(), null);
//在此处导入键盘布局
Keyboard keyboard = new Keyboard(getApplicationContext(), R.layout.keyboard);
keyboardView.setKeyboard(keyboard);
keyboardView.setOnKeyboardActionListener(this);
return keyboardView;
}
@Override
public void onWindowShown() {
super.onWindowShown();
/** 进入此回调时,用户将开始输入
在此时保存InputConnection,用于后续的输入操作 **/
ic = getCurrentInputConnection();
}
@Override
public void onWindowHidden() {
super.onWindowHidden();
/** 进入此回调时,用户已结束输入
在此时清理InputConnection **/
ic = null;
}
@Override
public void onPress(int primaryCode) {
/** 此处的primaryCode,即键盘布局中的code属性,可以根据code来commit需要输入的文字
第二个参数是输入的位置,注意是从右往左,0代表向右边插入一个字符 **/
ic.commitText("" + primaryCode, 0);
}
@Override
public void onRelease(int primaryCode) {
}
@Override
public void onKey(int primaryCode, int[] keyCodes) {
}
@Override
public void onText(CharSequence text) {
}
@Override
public void swipeLeft() {
}
@Override
public void swipeRight() {
}
@Override
public void swipeDown() {
}
@Override
public void swipeUp() {
}
}
至此,一个简易的自定义输入法就完成了~
剩下的复杂功能,就可以看文档一一实现了:
https://developer.android.google.cn/guide/topics/text/creating-input-method
最后是惯例讨钱: