Android: переключиться на другой IME программно

http://developer.android.com/guide/topics/text/creating-input-method.html#GeneralDesign гласит:

Поскольку на устройстве могут быть установлены несколько IME, предоставьте пользователю возможность переключиться на другой IME непосредственно из пользовательского интерфейса ввода.

Предположим, что у меня есть источник двух методов ввода и могу его модифицировать. Я хочу, чтобы пользователь быстро переключался между ними и готов зарезервировать для этого кнопку. Как "переключиться на другой IME непосредственно из интерфейса ввода?"?

Ответ 1

Переключение на предыдущий метод ввода с текущего метода ввода:

//final String LATIN = "com.android.inputmethod.latin/.LatinIME";
// 'this' is an InputMethodService
try {
    InputMethodManager imm = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
    final IBinder token = this.getWindow().getWindow().getAttributes().token;
    //imm.setInputMethod(token, LATIN);
    imm.switchToLastInputMethod(token);
} catch (Throwable t) { // java.lang.NoSuchMethodError if API_level<11
    Log.e(TAG,"cannot set the previous input method:");
    t.printStackTrace();
}

Если вы хотите переключиться на определенный метод ввода, идентификатор которого вы знаете, вы можете сделать это, как показывают строки с комментариями.

EDIT @pRaNaY предложил один .getWindow() в бесшумном редактировании (нажмите "отредактировано" ниже, чтобы просмотреть историю). Я помню, что он не работал для Android 2.3; если вы обратитесь к документам, вы увидите, что первый вызов InputMethodService.getWindow() возвращает Dialog (который не является подклассом Window), а второй вызов Dialog.getWindow() возвращает Window. Нет Dialog.getAttributes(), поэтому с одним .getWindow() он даже не будет компилироваться.

Ответ 2

Вы не можете изменить текущий активный IME пользователя с помощью кода из соображений безопасности, извините.

Однако вы можете показать диалоговое окно, предоставленное системой, чтобы пользователь мог выбрать один из других активированных.

InputMethodManager imeManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); 
if (imeManager != null) {
    imeManager.showInputMethodPicker();
} else {
    Toast.makeText(context ,"Error", Toast.LENGTH_LONG).show();
}