Android:在软键盘上保留所选语言

时间:2017-04-15 09:05:52

标签: android locale android-softkeyboard ime

我的应用程序是一种测验:用户应该正确地在文本字段(EditText)中键入单词,用户可以用任何一种语言键入它,具体取决于他选择的语言(使用"空格键)在软键盘上滑动")。软键盘在之前显示,并在用户输入后隐藏。但是当下次出现软键盘时,它的输入语言会切换到系统的默认值,不会保持不变,用户最后一次使用过。

详细

我有一个EditText字段:

<EditText
    android:id="@+id/textInput"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:inputType="textNoSuggestions|textVisiblePassword"
/>

选择这些输入类型以避免IME显示单词建议。 (不知何故textNoSuggestions只是不够。但这不是问题)

当用户需要输入单词时,我强制软键盘显示如下:

void showSoftKeyboard() {
    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.showSoftInput(mTextInput, InputMethodManager.SHOW_FORCED);
}

用户完成输入后,我使用此方法强制键盘消失(不再占用屏幕):

void hideSoftKeyboard() {
    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(mTextInput.getWindowToken(), 0);
}

问题

下次出现软键盘时,语言是系统的默认语言。 我怎么能避免这个?

  • 我可以以某种方式强制软键盘恢复它的最后状态吗?
  • 或者可以在键盘隐藏时确定所选语言,并在键盘显示时恢复它?
  • 或者你能建议其他解决方案吗?

我试图做什么

我尝试使用switchToLastInputMethod强制键盘恢复它的状态:

void showSoftKeyboard() {
    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.showSoftInput(mTextInput, InputMethodManager.SHOW_FORCED);
    final IBinder token = mTextInput.getWindowToken();
    if (token != null) imm.switchToLastInputMethod(token);
}

徒劳的。该语言仍在切换到系统默认值。

注意:输入之间不会重新创建输入字段。它们仍然是相同的,只是隐藏。

另外,我试图记住InputMethodSubtype,并强制它恢复:

InputMethodSubtype mInputMethodSubtype;

void hideSoftKeyboard() {
    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
    mInputMethodSubtype = imm.getCurrentInputMethodSubtype();
    imm.hideSoftInputFromWindow(mTextInput.getWindowToken(), 0);
}

void showSoftKeyboard() {
    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.showSoftInput(mTextInput, InputMethodManager.SHOW_FORCED);
    if (mInputMethodSubtype != null) {
        imm.setCurrentInputMethodSubtype(mInputMethodSubtype);
    }
}

但这需要WRITE_SECURE_SETTINGS权限,并且仅允许系统应用。所以,它不适用。

谢谢

0 个答案:

没有答案