首页 > 解决方案 > 在方向更改时保持虚拟键盘的更清洁方法

问题描述

我的 XML 中有以下 EditText:

<EditText
  android:id="@+id/searchField"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:hint="What do you want to eat?"
  android:imeOptions="actionSearch"
  android:inputType="text"
  android:maxLines="1"
  ... />

在方向更改时,我将记录 EditText 的焦点状态,searchField. override fun onSaveInstanceState(...)我使用如下方式记录此状态:

override fun onSaveInstanceState(outState: Bundle) {
    super.onSaveInstanceState(outState)
    outState.putBoolean("SEARCH_FOCUSED", searchField.hasFocus())
}

如果searchField.hasFocus()等于true,我希望在设备方向改变时显示虚拟键盘。为此,我将其设置为override fun onRestoreInstaceState(...)如下:

override fun onRestoreInstanceState(savedInstanceState: Bundle) {
    super.onRestoreInstanceState(savedInstanceState)
    val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    val searchFocused = savedInstanceState.getBoolean("SEARCH_FOCUSED")
    if (searchFocused) {
        searchField.requestFocus()
        searchField.postDelayed({ imm.showSoftInput(searchField,
            SHOW_FORCED)
        }, 200)
    }
}

以上作品

关注#1

但是,上述方式并不理想。我必须设置一个postDelayed(Runnable, time)以使虚拟键盘出现,这对我来说似乎不是最好的解决方案。理想情况下,我希望能够简单地执行以下操作。但是,以下代码的问题是键盘在方向更改时根本不显示。

override fun onRestoreInstanceState(savedInstanceState: Bundle) {
    super.onRestoreInstanceState(savedInstanceState)
    val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    val searchFocused = savedInstanceState.getBoolean("SEARCH_FOCUSED")
    if (searchFocused) {
        searchField.requestFocus()
        imm.showSoftInput(searchField, SHOW_FORCED)
    }
}

关注#2

此外,请注意我使用SHOW_FORCED而不是SHOW_IMPLICIT. 这真的很糟糕,因为当我点击我的主页按钮(Activity现在onStop())时,键盘仍然可见。我知道这是因为SHOW_FORCED表明键盘必须由用户自己显式隐藏。理想情况下,我想使用SHOW_IMPLICIT. 使用的问题SHOW_IMPLICIT是键盘没有出现在横向,但确实出现在纵向。

所以,我的问题是:

标签: androidkotlinandroid-softkeyboardandroid-input-methodandroid-savedstate

解决方案


我已在其他线程上阅读过有关此问题的信息。

这是我认为值得一试的建议:

(这将在 java 中,因为我不会说 kotlin,抱歉)

editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
    if (hasFocus) {
    getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
    }else{
    getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);}
    }
});

这样,只要将焦点授予edittext,就应该显示输入法。不过,您可能必须确保您的 edittext 不专注于活动创建。让我知道它是否有效,如果它解决了您的两个(或任何一个)问题。


推荐阅读