gpt4 book ai didi

android - 保持方向变化的虚拟键盘更干净的方法

转载 作者:行者123 更新时间:2023-12-02 13:32:32 24 4
gpt4 key购买 nike

我的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的问题是键盘没有以横向显示,而是以纵向显示。

因此,我的问题是:
  • 为什么不立即使用imm.showSoftInput(...)来显示虚拟键盘就不能立即设置postDelayed(...)?我是否在使用showSoftInput时缺少其他一些先决条件步骤?
  • 当 Activity 处于后台(SHOW_IMPLICIT / onPause())时,如何使用onStop()确保键盘自动隐藏?
  • 最佳答案

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

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

    (这将在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不会专注于 Activity 创建。让我知道这可行,并且能解决您的两个(或任何一个)问题。

    关于android - 保持方向变化的虚拟键盘更干净的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60586551/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com