单击按钮后更改键盘布局

时间:2012-02-28 10:18:51

标签: android android-edittext android-softkeyboard keyboard-layout

我正在开发一个Android应用,我有EditText和两个RadioButtons A B ),

我要做的是:

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

我试图像这样更改IMEOptions的{​​{1}},但它仍然不起作用:

注意:键盘已经可见,我想要做的只是在两个{{1}的每种情况下使用完成按钮修改按钮搜索 }

EditText

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

提前致谢。

4 个答案:

答案 0 :(得分:9)

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

编辑:好的,我已经弄清楚了。经过一些谷歌搜索(见this issue)和编码后,我发现imeOptions似乎被高速缓存/绑定到输入法。我不确定这是一个错误还是故意的功能。要在用户点击任一单选按钮时切换键盘,请先确保为EditText(android:inputType="text")设置了inputType,然后在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);
    }
});

注意输入类型的归零和重新设置。

最后,请注意,许多流行的键盘实现并没有给出设置imeOptions的内容,所以不要在应用中依赖此功能。例如,Swype;

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

答案 1 :(得分: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
    }
});

答案 2 :(得分:0)

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

来自:Change Button Text on Android

答案 3 :(得分:0)

基于站在巨人的肩膀上,这就是我想出的。感谢@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,因为我是在TextWatcher内调用它,所以你可能不需要它。如果不跟踪selectionStart,Android会将光标带回到开头。