Как мне изменить метод ввода программно?
У меня есть требование замены клавиатуры в зависимости от языка.
Я провел небольшое исследование и обнаружил, что это можно сделать с помощью этих API
- InputMethodManager setInputMethod (android.os.IBinder, java.lang.String)
- InputMethodService switchInputMethod (java.lang.String)
Для первого API мне нужен токен IBinder, который можно взять из экземпляра InputMethodService, вызвав
mInputMethodService.getWindow(). GetWindow (). GetAttributes(). лексема
или если у меня есть ссылка на объект InputMethodService, я могу просто вызвать
mInputMethodService.switchInputMethod(ID)
изменить метод ввода.
Реальная проблема заключается в том, как мне получить ссылку на объект InputMethodService.
PS: я не хочу использовать showInputMethodPicker() InputMethodManager, потому что для моего требования я хочу изменить его из моего существующего диалога, который имеет список языков.
Я знаю, что это невозможно для пользовательского приложения, но не уверен, что это также невозможно для системного приложения или нет.
1 ответ
!!! преуспели
Единственный способ изменить текущий IME - это настроить его.
Для моего соотв. Проблема Я должен изменить клавиатуру на китайский, если я изменю язык системы на китайский из своего приложения пользовательских настроек.
Подход, обсужденный ниже, был использован для пользовательского приложения LatinIME.
Каждый IME имеет класс, который расширяет класс InputMethodService. В этом классе мы можем переопределить метод с именем onInitializeInterface. Этот метод вызывается каждый раз, когда изменяется конфигурация, т.е. когда вы меняете локаль системы, он будет вызываться.
Здесь мы можем проверить, поддерживается ли текущий выбранный языковой стандарт текущим IME или нет. Если нет, то мы можем загрузить соответствующий IME, вызвав метод switchInputMethod (id).
Чтобы получить идентификатор, мы можем запросить через inputMethodManager и получить список доступных идентификаторов.
String pinyinId = "";
InputMethodManager inputMethodManager = (InputMethodManager) getApplicationContext()
.getSystemService(INPUT_METHOD_SERVICE);
List<InputMethodInfo> inputMethodInfos = inputMethodManager.getInputMethodList();
for (InputMethodInfo inputMethodInfo : inputMethodInfos) {
if (inputMethodInfo.getId().contains("pinyin")) {
pinyinId = inputMethodInfo.getId();
}
}
После получения идентификатора мы можем вызвать switchInputMethod (pinyinId), и он изменит IME.
Это старый вопрос, но я был направлен сюда из Google в 2019 году. Я столкнулся с той же проблемой, и вот мое решение:
ПРИМЕЧАНИЕ. Вам необходимо установить приложение как системное приложение ИЛИ подписать ключ платформы.
Добавьте разрешение на настройку безопасности записи в AndroidManifest.xml:
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />
Используйте InputMethodService switchInputMethod(String inputMethodId), где это применимо. Пример:
switchInputMethod("com.google.android.inputmethod.latin/com.android.inputmethod.latin.LatinIME");