I'm developping an android app , and i have an EditText and a two RadioButtons (A and B ),
what i'm trying to do is :
When RadioButton A is checked , i want to change the keyboard layout to display it with the Done button ,
When the RadioButton B is checked, i want to change the keyboard layout to display it with the Search Button .
I've tried to change the IMEOptions of my EditText like this , but it still doesn't work :
NB : the keyboard is already visible, what i want to do is just modify the button Search with the button Done in each case of the two 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();
}
}
any ideas about how to do that ??
Thanks in advance.
What Android version are you targeting? I'm unable to post a comment sorry (new account), but am currently doing up a testcase to answer your question.
EDIT: Ok, I've figured it out. After a bit of googling (see this issue) and coding, I found that the imeOptions appear to be cached/tied to the input method. I'm not sure if this is a bug or intentional functionality. To switch the keyboard when the user taps either radio button, first make sure the inputType is set for your EditText (android:inputType="text"), then use the following in your onCreate method:
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);
}
});
Note the nulling out and re-setting of the InputType.


Finally, please be aware that many popular keyboard implementations don't give a damn what you set the imeOptions to, so don't rely on this functionality in your app. Swype for example;

In conclusion (see what I did there?), not to be outdone, I've bundled up my test program. You can find it here: http://dl.dropbox.com/u/52276321/ChangeKeyboardTest.zip
Based on standing on the shoulders of giants, here's what I came up with. Thanks to @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;
}
}
Without the lastIsDoneOk shenanigans I went into an infinite loop. YMMV because I'm calling this from within a TextWatcher, so you may not need it. Without keeping track of selectionStart, Android brings the cursor back to the start.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With