4

Я developping андроид приложение, и у меня есть EditText и два RadioButtons ( и B),изменить раскладку клавиатуры после нажатия кнопки

то, что я пытаюсь сделать, это :

Когда RadioButton А чек, я хочу, чтобы изменить раскладку клавиатуры, чтобы отобразить его с помощью кнопки Done, Когда RadioButton B установлен, я хочу, чтобы изменить раскладку клавиатуры, чтобы отобразить его с помощью кнопки поиска.

Я попытался изменить IMEOptions из моих EditText, как это, но он по-прежнему не работает:

NB: клавиатура уже видно, что я хочу сделать, это просто изменить кнопку Поиск с кнопкой Готово в каждом случае из двух 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(); 
    } 
} 

любые идеи о том, как это сделать ??

Заранее спасибо.

+0

любые идеи ????? – Houcine

ответ

9

Что Android версии вы таргетинг? Я не могу опубликовать комментарий извините (новая учетная запись), но в настоящее время я занимаюсь тестированием, чтобы ответить на ваш вопрос.

EDIT: Хорошо, я понял это. После небольшого количества поисковых запросов (см. this issue) и кодирования я обнаружил, что imeOptions, похоже, кэшируются/привязаны к методу ввода. Я не уверен, что это ошибка или преднамеренная функциональность. Для переключения клавиатуры, когда пользователь нажимает кнопку либо радио, сначала убедитесь, inputType установлен для EditText (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 к, так что не полагаться на эту функциональность в вашем приложении. Например, Swype;

В заключении (посмотреть, что я там делал?), Чтобы не отстать, я укутан мою тестовую программу.Вы можете найти его здесь: http://dl.dropbox.com/u/52276321/ChangeKeyboardTest.zip

+0

+1 для «фактически запущенного кода»? : P – aaronsnoswell

+0

спасибо aaronsnoswell за вашу помощь, я проведу вашу программу сейчас и скажу вам, если она работает для меня :) +1 – Houcine

+0

это работает, спасибо :) – Houcine

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 
    } 
}); 
+0

нет такого метода setCloseImeOnDone (true); какой уровень андроди sdk вы использовали? я использую api level 10 – Houcine

+0

лучший пример здесь, эта ссылка хотя бы один раз ... https: //gist.github.com/475320 –

0

обработчик использование попытки класса обновление вида динамически.

от: Change Button Text on Android

+0

мой код работает на uiThread, поэтому мне не нужно использовать обработчик для обновления UI-клавиатуры – Houcine

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 возвращает курсор к началу.

Смежные вопросы