You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android软键盘空格键触发Google翻译API功能实现求助

解决点击软键盘空格键触发翻译的问题

嘿,我看了你的代码,你现在的逻辑是监听IME_ACTION_NEXT(软键盘的"下一步"按钮)来触发翻译,但这和你想要的"点击空格键触发"完全不匹配。咱们来调整一下代码,实现你要的功能:

问题分析

当前代码监听的是编辑器动作(比如软键盘右下角的"下一步"),而不是空格键的按下事件。要捕获空格键,我们需要改用OnKeyListener来监听按键事件,或者在onEditorAction中判断空格键的keyCode

修改后的代码实现

1. 基础版:监听空格键触发翻译

替换你原来的setOnEditorActionListenerOnKeyListener,这样就能直接捕获空格键的按下事件:

editText.setOnKeyListener(new View.OnKeyListener() {
    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        // 只处理空格键的按下动作(避免重复触发)
        if (event.getAction() == KeyEvent.ACTION_DOWN && keyCode == KeyEvent.KEYCODE_SPACE) {
            String inputText = editText.getText().toString().trim();
            if (!inputText.isEmpty()) {
                // 注意:这里直接调用Translate API会阻塞主线程,后面会给出异步处理方案
                TranslateOptions options = TranslateOptions.newBuilder().setApiKey(API_KEY).build();
                Translate translate = options.getService();
                Translation translation = translate.translate(inputText, Translate.TranslateOption.targetLanguage("hi"));
                
                // 如果你想保留空格,可以改成:translation.getTranslatedText() + " "
                editText.setText(translation.getTranslatedText());
                // 将光标移到文本末尾
                editText.setSelection(editText.getText().length());
                Log.e("trans", "翻译结果: " + editText.getText().toString());
            }
            
            // 返回true表示消费这个事件(不会输入空格),返回false则会保留空格
            return true;
        }
        return false;
    }
});

2. 优化版:异步处理避免ANR

Google Translate API的调用是同步网络请求,如果直接在主线程执行会导致应用无响应(ANR)。所以必须把翻译逻辑放到异步线程中,这里用Java的AsyncTask示例:

首先定义异步任务类:

private class TranslateTask extends AsyncTask<String, Void, String> {
    @Override
    protected String doInBackground(String... params) {
        try {
            TranslateOptions options = TranslateOptions.newBuilder().setApiKey(API_KEY).build();
            Translate translate = options.getService();
            return translate.translate(params[0], Translate.TranslateOption.targetLanguage("hi")).getTranslatedText();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    @Override
    protected void onPostExecute(String translatedText) {
        if (translatedText != null) {
            // 保留空格的话就加上" "
            editText.setText(translatedText);
            editText.setSelection(editText.getText().length());
        }
    }
}

然后修改按键监听逻辑:

editText.setOnKeyListener(new View.OnKeyListener() {
    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        if (event.getAction() == KeyEvent.ACTION_DOWN && keyCode == KeyEvent.KEYCODE_SPACE) {
            String inputText = editText.getText().toString().trim();
            if (!inputText.isEmpty()) {
                // 执行异步翻译任务
                new TranslateTask().execute(inputText);
            }
            
            // 如果需要保留空格,返回false;否则返回true
            return false;
        }
        return false;
    }
});

重要注意事项

  • 网络权限:确保在AndroidManifest.xml中添加网络权限:
    <uses-permission android:name="android.permission.INTERNET" />
    
  • API_KEY安全:不要把Google API密钥硬编码到代码中,建议通过gradle.properties或者本地配置文件引用,避免密钥泄露。
  • 软键盘兼容性:部分第三方软键盘可能不会触发OnKeyListener,如果遇到这种情况,可以考虑结合TextWatcher监听文本变化,判断是否是空格输入后触发翻译,但这种方式需要额外处理重复触发的问题。

内容的提问来源于stack exchange,提问作者baduga biz

火山引擎 最新活动