希望从一个View上调用输入法和接收输入法传过来的字符串,可以通过调用EditText这个widget。但是,如果要做出很炫很个性的输入法,就必须自己去和EditText一样连接输入法,介绍如下:
首先,定义一个继承自BaseInputConnection的类。输入法是通过commitText来提交选中字符。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public class MyBaseInputConnection extends BaseInputConnection{ public MyBaseInputConnection(View targetView, boolean fullEditor) { super(targetView, fullEditor); } public static String tx=""; //输入法程序就是通过调用这个方法把最终结果输出来的 @Override public boolean commitText(CharSequence text, int newCursorPosition) { tx = text.toString(); return true; } } |
BaseInputConnection相当于一个InputMethodService和View之间的一个通道。每当 InputMethodService产生一个结果时,都会调用BaseInputConnection的commitText方法,把结果传递出来。
之后,采用如下方式,呼出输入法,并且把自定义的BaseInputConnection通道传递给InputMethodService。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public class MyView extends XXView ...{ //得到InputMethodManager InputMethodManager input = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); //在你想呼出输入法的时候,调用这一句 input.toggleSoftInput(0, 0); @Override //这个方法继承自View。把自定义的BaseInputConnection通道传递给InputMethodService public InputConnection onCreateInputConnection(EditorInfo outAttrs) { return new MyBaseInputConnection(this, false); } } |
低级界面上面,自己调用输入法并接收输入法的输出结果,就是这样的。