изменить раскладку клавиатуры после нажатия кнопки - PullRequest
4 голосов
/ 28 февраля 2012

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

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

Когда отмечен RadioButton A, я хочу изменить раскладку клавиатуры, чтобы отобразить ее с помощью кнопки Готово, Когда отмечен 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();
    }   
}

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

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

Ответы [ 4 ]

9 голосов
/ 08 марта 2012

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

РЕДАКТИРОВАТЬ: Хорошо, я понял это. После небольшого поиска в Google (см. эта проблема ) и кодирования я обнаружил, что 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.

image image

Наконец, имейте в виду, что многие популярные реализации клавиатуры не имеют значения, на что вы установили imeOptions, поэтому не полагайтесь на эту функцию в своем приложении. Swype например;

image

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

0 голосов
/ 19 августа 2014

Основываясь на том, чтобы стоять на плечах гигантов, вот что я придумал. Благодаря @ 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 возвращает курсор к началу.

0 голосов
/ 05 марта 2012

попробуйте использовать обработчик класса для динамического обновления представлений.

от: Изменить текст кнопки на Android

0 голосов
/ 05 марта 2012

попробуйте 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
    }
});
...