public class MyEditText extends EditText {
private InputMethodManager input;
public MyEditText(Context context) {
this(context, null);
}
public MyEditText(Context context, AttributeSet attrs, int defStyle) {
this(context, attrs);
}
public MyEditText(Context context, AttributeSet attrs) {
super(context, attrs);
input = (InputMethodManager) this.getContext().getSystemService(
Context.INPUT_METHOD_SERVICE);
}
@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {//此处返回自定义的输入法连接对象
return new InputConn(this, false);
}
@Override
public boolean onTouchEvent(MotionEvent event) {//触摸弹出输入框
setFocusableInTouchMode(true);
requestFocus(); // 每次都要获取焦点
// setInputType(InputType.TYPE_CLASS_TEXT);
input.showSoftInput(this, 0);
return true;
}
private class InputConn extends BaseInputConnection {
private Editable editable;
public InputConn(View targetView, boolean fullEditor) {
super(targetView, fullEditor);
}
@Override
public boolean commitText(CharSequence text, int newCursorPosition) {
// TODO 提交输入的字符到指定view
if (delBefore) {
Editable e = getText();
if (e.length() > 0) {
e.delete(getSelectionStart() - 1, getSelectionStart());
}
delBefore = false;
}
return super.commitText(text.toString().toUpperCase(),
newCursorPosition);// 该项目中为转为大写输出
}
@Override
public Editable getEditable() {// 得到可编辑文本
if (editable == null) {
editable = Editable.Factory.getInstance().newEditable("");
Selection.setSelection(editable, 0);
}
return editable;
}
private boolean delBefore;
private CharSequence text;
@Override
public boolean setComposingText(CharSequence text, int newCursorPosition) {// 设置组装字符,输入法首先调用该方法,(全键盘时不会调用)
this.text = text.toString().toUpperCase();
if (delBefore) {
Editable e = getText();
if (e.length() > 0) {
e.delete(getSelectionStart() - 1, getSelectionStart());
}
}
setComposingRegion(0, newCursorPosition);
return super.setComposingText(text, newCursorPosition);
}
@Override
public boolean setComposingRegion(final int start, final int end) {
editable = getEditable();
if (editable.length() > 0)
editable.replace(0, editable.length(), text);
else
editable.append(text);
delBefore = true;
return super.setComposingRegion(start, end);// 默认实现为将组装字符显示到绑定view中,一段时间无操作则调用commitText()方法,此时该方法中显示的字符依然存在
}
}
}
参照API和网上搜索的提示试写出来的一个输入法连接接口实现,有些小BUG,记录备忘