6

我正在开发一个 android 应用程序,我有一个EditText和一个两个RadioButtonsAB),

我想做的是:

检查A时RadioButton,我想更改键盘布局以使用完成按钮显示它,当RadioButton检查B时,我想更改键盘布局以使用搜索按钮显示。

我试图改变IMEOptionsEditText这样的,但它仍然不起作用:

注意:键盘已经可见,我想要做的只是修改按钮Search与按钮Done在这两种情况下radioButtons

@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
    if(btnA.isChecked() ) { 
        txtSearch.setImeOptions(EditorInfo.IME_ACTION_DONE);
//      txtSearch.invalidate(); 
    }
    else {
        txtSearch.setImeOptions(EditorInfo.IME_ACTION_SEARCH);
//      txtSearch.invalidate();
    }   
}

关于如何做到这一点的任何想法?

提前致谢。

4

4 回答 4

11

你的目标是什么安卓版本?我无法发表评论抱歉(新帐户),但目前正在做一个测试用例来回答你的问题。

编辑:好的,我已经想通了。经过一番谷歌搜索(见这个问题)和编码,我发现 imeOptions 似乎被缓存/绑定到输入法。我不确定这是错误还是故意的功能。要在用户点击任一单选按钮时切换键盘,首先确保为您的 EditText ( ) 设置了 inputType ,然后在您的方法android:inputType="text"中使用以下内容:onCreate

final RadioGroup btn_group = (RadioGroup) findViewById(R.id.btn_group);
final RadioButton btnA = (RadioButton) findViewById(R.id.btnA);
final RadioButton btnB = (RadioButton) findViewById(R.id.btnB);

btn_group.setOnCheckedChangeListener(new OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(RadioGroup group, int checkedId) {
        final EditText txtSearch = (EditText) findViewById(R.id.edit_text);

        txtSearch.setInputType(InputType.TYPE_NULL);

        if(btnA.isChecked()) {
            txtSearch.setImeOptions(EditorInfo.IME_ACTION_DONE);
        } else {
            txtSearch.setImeOptions(EditorInfo.IME_ACTION_SEARCH);
        }

        txtSearch.setInputType(InputType.TYPE_CLASS_TEXT);
    }
});

注意 InputType 的清零和重新设置。

最后,请注意,许多流行的键盘实现并不在乎你的设置imeOptions,所以不要在你的应用程序中依赖这个功能。例如,扫一扫;

总之(看看我在那里做了什么?),不甘示弱,我已经捆绑了我的测试程序。你可以在这里找到它:http: //dl.dropbox.com/u/52276321/ChangeKeyboardTest.zip

于 2012-03-08T08:15:10.073 回答
1

基于站在巨人的肩膀上,这就是我想出的。感谢@aaronsnoswell。

private void imeSetup(boolean isDoneOk){
    if (isDoneOk!=lastIsDoneOk) {
        int inputType = editText.getInputType();
        int selectionStart = editText.getSelectionStart();
        editText.setInputType(InputType.TYPE_NULL);
        if (isDoneOk)
            editText.setImeOptions(EditorInfo.IME_ACTION_DONE);
        else
            editText.setImeOptions(EditorInfo.IME_ACTION_NEXT);
        editText.setInputType(inputType);
        editText.setSelection(selectionStart);
        lastIsDoneOk = isDoneOk;
    }
}

没有lastIsDoneOk恶作剧,我陷入了无限循环。YMMV,因为我在 a 中调用它TextWatcher,所以你可能不需要它。在不跟踪 的情况下selectionStart,Android 将光标带回起点。

于 2014-08-18T22:34:27.967 回答
0

尝试使用类处理程序动态更新视图。

来自:在 Android 上更改按钮文本

于 2012-03-05T19:37:26.447 回答
0

试试这个RadioGroup。它肯定会起作用。或使用链接

https://gist.github.com/475320

// This will get the radiogroup
RadioGroup rGroup = (RadioGroup)findViewById(r.id.radioGroup1);
// This will get the radiobutton in the radiogroup that is checked
RadioButton checkedRadioButton = (RadioButton)rGroup.findViewById(rGroup.getCheckedRadioButtonId());


// This overrides the radiogroup onCheckListener
rGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener()
{
    public void onCheckedChanged(RadioGroup rGroup, int checkedId)
    {

    switch(checkedId){
        case R.id.btnA:
            txtSearch.setImeOptions(EditorInfo.IME_ACTION_DONE);
            break;
        case R.id.btnB:
             txtSearch.setImeOptions(EditorInfo.IME_ACTION_SEARCH);
            break;enter code here
        default:
            break;
    }
       txtSearch.setCloseImeOnDone(true); // close the IME when done is pressed
    }
});
于 2012-03-05T12:38:26.003 回答