キーを押すと実行中のアクティビティ認識が開く、Android 用のあらゆるアプリケーションで使用できる CustomKeyboard を開発しました。
認識の最後にアクティビティが閉じ、認識されたテキストをキーボードを開いた EditText (Sms App などの任意の EditText) に書き込む必要がありますが、おそらくアクティブではないため、できません。
キーボードを開いたアクティブな 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();
}
}