我正在开发一个Android应用,我有EditText
和两个RadioButtons
( A 和 B ),
我要做的是:
当选中RadioButton
A时,我想更改键盘布局以使用完成按钮显示它,
选中RadioButton
B时,我想更改键盘布局以使用搜索按钮显示它。
我试图像这样更改IMEOptions
的{{1}},但它仍然不起作用:
注意:键盘已经可见,我想要做的只是在两个{{1}的每种情况下使用完成按钮修改按钮搜索 }
EditText
关于如何做到这一点的任何想法?
提前致谢。
答案 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)
尝试使用类处理程序动态更新视图。
答案 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会将光标带回到开头。