我的另一个博客地址:https://my.oschina.net/hailongqiu/blog/1535494

Android 输入法详解_第1张图片
Android 输入法详解_第2张图片

onCreateInputView(创建键盘区视图)
onCreateCand
onStartInputView

Android 输入法详解_第3张图片

Android 输入法详解_第4张图片

避免输入法变成全屏
Android 输入法详解_第5张图片

@Override    public boolean onEvaluateFullscreenMode() {        return false;    }

设置后为 false后
Android 输入法详解_第6张图片

如何再onStartInputView切换对应的布局
EditText 的 android:inputType 来 如何切换输入法不同的键盘?

在Android 电视上的 搜狗TV输入法,就没有处理密码相关的,导致的BUG就是,在输入WIFI密码或者其它密码的等情况下,中/英 还可以切换,这里问题就很严重.

public void setXXXXXXXXXX(EditorInfo editorInfo) {int inputType = editorInfo.inputType & EditorInfo.TYPE_MASK_CLASS;switch (inputType) {case EditorInfo.TYPE_CLASS_NUMBER: // 数字键盘case EditorInfo.TYPE_CLASS_DATETIME: // 电话号码.case EditorInfo.TYPE_CLASS_PHONE: // 日期.break;case EditorInfo.TYPE_CLASS_TEXT:    int v = editorInfo.inputType & EditorInfo.TYPE_MASK_VARIATION;if (v == EditorInfo.TYPE_TEXT_VARIATION_EMAIL_ADDRESS|| v == EditorInfo.TYPE_TEXT_VARIATION_PASSWORD|| v == EditorInfo.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD|| v == EditorInfo.TYPE_TEXT_VARIATION_URI) {// 英文} else if (v == EditorInfo.TYPE_TEXT_VARIATION_SHORT_MESSAGE) {// }break;default:break;}}

** 如何去处理我们自定义的按键codes**

public View onCreateInputView() {        mInputView = (KeyboardView) getLayoutInflater().inflate(R.layout.main, null);        mInputView.setPreviewEnabled(false);        mInputView.setOnKeyboardActionListener(this);        return mInputView;}public void onKey(int primaryCode, int[] keyCodes) {if (primaryCode == 2250) {// .... ..}}

根据回车的状态更新对应的图标以及文字
android:imeOptions 来显示 下一步,完成,搜索 等等?
android:imeActionLabel 如何显示文字在输入法的完成键上的?

 /**     * 根据回车状态.     */    private void updateDoneState() {        EditorInfo editorInfo = getCurrentInputEditorInfo();        int action = editorInfo.imeOptions & (EditorInfo.IME_MASK_ACTION | EditorInfo.IME_FLAG_NO_ENTER_ACTION);        OPENLOG.D("updateDoneState action:" + action);        switch (action) {            case EditorInfo.IME_ACTION_GO:                break;            case EditorInfo.IME_ACTION_SEARCH: // 搜索                break;            case EditorInfo.IME_ACTION_SEND: // 发送                break;            case EditorInfo.IME_ACTION_NEXT: // 下一个                int f = editorInfo.inputType & EditorInfo.TYPE_MASK_FLAGS;                if (!isCenterMultiLine(editorInfo)) { //  TOGGLE_ENTER_NEXT                } else { // TOGGLE_ENTER_MULTI_LINE_DONE                }                break;            case EditorInfo.IME_ACTION_DONE:                if (!isCenterMultiLine(editorInfo)) { // TOGGLE_ENTER_DONE                } else { // TOGGLE_ENTER_MULTI_LINE_DONE                }            default: // 暂时定为多行. TOGGLE_ENTER_MULTI_LINE_DONE                break;        }    } /**     * 判断是否为多行文本 true 多行 false 反之     */    private boolean isCenterMultiLine(EditorInfo editorInfo) {        int f = editorInfo.inputType & EditorInfo.TYPE_MASK_FLAGS;        return (f == EditorInfo.TYPE_TEXT_FLAG_MULTI_LINE);    }    

发送字符串到编辑框

 /**     * 发送字符到编辑框(EditText)     */    public void commitResultText(String resultText) {        OPENLOG.D("commitResultText resultText:" + resultText);        InputConnection ic = getCurrentInputConnection();        if (null != ic && !TextUtils.isEmpty(resultText)) {            ic.commitText(resultText, 1);        }    }

发送回车,空格
sendKeyChar

如何实现删除的
这里需要注意,如果为中文,并且已经输入了一些字母,存在中文选择,优先删除中文.

// KeyEvent.KEYCODE_DELprivate void keyDownUp(int keyEventCode) {        if (null != getCurrentInputConnection()) {            getCurrentInputConnection().sendKeyEvent(                    new KeyEvent(KeyEvent.ACTION_DOWN, keyEventCode));            getCurrentInputConnection().sendKeyEvent(                    new KeyEvent(KeyEvent.ACTION_UP, keyEventCode));        }    }

输入法如何移动光标的
Android 输入法详解_第7张图片

 /**     * 输入框的光标向右移动.     */    public void setCursorRightMove() {        int cursorPos = getSelectionStart();        cursorPos++;        if (null != getCurrentInputConnection()) {            getCurrentInputConnection().setSelection(cursorPos, cursorPos);        }    }    /**     * 输入框的光标向左移动.     */    public void setCursorLeftMove() {        int cursorPos = getSelectionStart();        cursorPos--;        if (cursorPos < 0)            cursorPos = 0;        if (null != getCurrentInputConnection()) {            getCurrentInputConnection().setSelection(cursorPos, cursorPos);        }    }    private static final int MAX_INT = Integer.MAX_VALUE / 2 - 1;    private int getSelectionStart() {        if (null != getCurrentInputConnection()) {            return getCurrentInputConnection().getTextBeforeCursor(MAX_INT, 0).length();        }        return 0;    }

如何去发送表情
比如微信,QQ 等软件,是如何将表情发送出去的.
微信的表情发送有两种,一种是发送某个特定的字符串,比如 “/:basketb”,这个是一个篮球的表情. 第二种 就是发表情图片.

接入语音输入文字
我们已经知道,文本是可以单独去发送,那么这里就很简单啦,只需要将我们说的话,转换成文本,然后使用 commitText 发送这些文本就OK了.

如何使用拼音,注音,倉頡 等字库
其实这里很简单,只需要将相关的字母或者编码 传给 引擎,它就会返回 汉字的列表,然后显示在候选框就可以了.
在这里插入图片描述

安装好厚如何跳转
Android 输入法详解_第8张图片

还没有写完,需要时间慢慢更新… …

更多相关文章

  1. android 图片缩放抗锯齿
  2. Android实现购物车整体页面逻辑详解
  3. Android读取服务器图片的三种方法
  4. android制作圆角图片和图片倒影
  5. android 获取本地图片或音乐
  6. android短信管理器SmsManager实例详解
  7. android传递图片和图片与byte转换

随机推荐

  1. 分页控件1
  2. android ClassNotFoundException: Didn't
  3. 监听Bluetooth
  4. Android拷贝图片到指定文件路径
  5. Android——intent分享图片到微信好友、
  6. Android(安卓)MediaPlayer 简单综合应用
  7. 2011.07.11——— android 自定义toast
  8. android apk的安装
  9. android的ImageSwitcher和TextSwitcher
  10. android监听程序安装、卸载