1

我开发了一个 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();
        }

    }
4

0 回答 0