快速实现安卓输入法!

码字辛苦!转载请注明出处!

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

最后是惯例讨钱:

猜你喜欢

转载自blog.csdn.net/u014653815/article/details/107695834