安卓InputConnection


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,记录备忘


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值