希望从一个View上调用输入法和接收输入法传过来的字符串,可以通过调用EditText这个widget。但是,如果要做出很炫很个性的输入法,就必须自己去和EditText一样连接输入法,介绍如下:
首先,定义一个继承自BaseInputConnection的类。输入法是通过commitText来提交选中字符。
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;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
publicclassMyBaseInputConnectionextendsBaseInputConnection{
publicMyBaseInputConnection(ViewtargetView,booleanfullEditor){
super(targetView,fullEditor);
}
publicstaticStringtx="";
//输入法程序就是通过调用这个方法把最终结果输出来的
@Override
publicbooleancommitText(CharSequencetext,intnewCursorPosition){
tx=text.toString();
returntrue;
}
}
BaseInputConnection相当于一个InputMethodService和View之间的一个通道。每当 InputMethodService产生一个结果时,都会调用BaseInputConnection的commitText方法,把结果传递出来。
之后,采用如下方式,呼出输入法,并且把自定义的BaseInputConnection通道传递给InputMethodService。
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);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
publicclassMyViewextendsXXView...{
//得到InputMethodManager
InputMethodManagerinput=(InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE);
//在你想呼出输入法的时候,调用这一句
input.toggleSoftInput(0,0);
@Override
//这个方法继承自View。把自定义的BaseInputConnection通道传递给InputMethodService
publicInputConnectiononCreateInputConnection(EditorInfooutAttrs){
returnnewMyBaseInputConnection(this,false);
}
}
低级界面上面,自己调用输入法并接收输入法的输出结果,就是这样的。