我开发了一个 CustomKeyboard,用于 Android 的任何应用程序,一个键的压力打开一个正在运行的 Activity 识别。
在识别结束时,活动关闭,我需要在打开键盘的 EditText 中写入已识别的文本(任何 EditText,如 Sms App),但我不能,因为它可能不再处于活动状态。
如何获得对打开键盘的活动 EditText 的引用,然后稍后使用它来编写识别的文本?
编辑:对不起......代码如下
public class SoftKeyboard extends InputMethodService implements KeyboardView.OnKeyboardActionListener{
private KeyboardView _kv;
private Keyboard _keyboard;
private InputMethodManager _inputMethodManager;
@Override
public View onCreateInputView() {
_kv = (KeyboardView)getLayoutInflater().inflate(R.layout.keyboard, null);
_kv.setKeyboard(_keyboard);
_kv.setOnKeyboardActionListener(this);
registerReceiver(receiver, new IntentFilter(Const.NOTIFICATION));
return _kv;
}
@Override
public void onKey(int primaryCode, int[] keyCodes) {
InputConnection ic = getCurrentInputConnection();
switch(primaryCode){
case 1010:
// starts View for Barcode scanning
_lastEditorInfo = getCurrentInputEditorInfo();
_lastBarcode = null;
BarcodeActivity mainactivity = new BarcodeActivity();
Intent dialogIntent = new Intent(SoftKeyboard.this, BarcodeActivity.class);
dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(dialogIntent);
Log.i("Key","Open BarCode Activity");
//ic.commitText(String.valueOf(_lastBarcode),1);
new WaitForBarcode(ic, _inputMethodManager).execute("");
break;
...
}
}
private class WaitForBarcode extends AsyncTask<String, Void, String> {
private InputConnection _icn;
private InputMethodManager _inputMethodManager;
public WaitForBarcode(InputConnection icn, InputMethodManager inputMethodManager) {
_icn = icn;
_inputMethodManager = inputMethodManager;
}
@Override
protected void onPostExecute(String result) {
// might want to change "executed" for the returned string passed
// into onPostExecute() but that is upto you
_inputMethodManager.showSoftInputFromInputMethod(getToken(), InputMethodManager.SHOW_IMPLICIT);
_inputMethodManager.restartInput(_kv);
_kv.setActivated(true);
Log.i("Barcode-last", _lastBarcode);
_icn = getCurrentInputConnection();
_icn.commitText(String.valueOf(_lastBarcode),1);
}
};
在 onKey() 中,我启动了 BarcodeActivity,这项工作非常完美。
在 onPostExecute 我在 _lastBarcode 字段中有正确的条形码,但是当我尝试在 EditText 上发布时不存在;(
已解决在doInBackground 上延迟 1 秒(只是为了给系统时间来关闭以前的活动)并强制重新打开键盘,commitText 工作。
代码是:
private class WaitForBarcode extends AsyncTask<String, Void, String> {
private InputConnection _icn;
private InputMethodManager _inputMethodManager;
public WaitForBarcode(InputConnection icn, InputMethodManager inputMethodManager) {
_icn = icn;
_inputMethodManager = inputMethodManager;
}
@Override
protected String doInBackground(String... params) {
while (_lastBarcode == null) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
Thread.interrupted();
}
}
return _lastBarcode;
}
@Override
protected void onPostExecute(String result) {
// might want to change "executed" for the returned string passed
// into onPostExecute() but that is upto you
_inputMethodManager.showSoftInputFromInputMethod(getToken(), InputMethodManager.SHOW_IMPLICIT);
_inputMethodManager.restartInput(_kv);
getInputView().setActivated(true);
Log.i("Barcode-last", _lastBarcode);
final InputConnection ic = getCurrentInputConnection();
if (ic != null && _lastBarcode != null) {
ic.beginBatchEdit();
ic.commitText(_lastBarcode, 0);
ic.endBatchEdit();
}
}