gpt4 book ai didi

android - 如何在小于19的API上安全地请求FocusChange上的showDropDown?

转载 作者:行者123 更新时间:2023-12-03 16:04:27 24 4
gpt4 key购买 nike

当更改方向(旋转)时,我遇到了一个Android应用程序崩溃,因为焦点更改尝试在已经丢失其父窗口的AppCompatAutoCompleteTextView上呈现一个下拉列表(我想)。

Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running?



仅当方向改变时焦点已经在该 View 中时,才会发生这种情况。当在旋转设备(模拟器)时该 View 收到焦点更改事件时,我会有些惊讶。

有问题的 View 采用XML格式,如下所示:
<androidx.appcompat.widget.AppCompatAutoCompleteTextView
android:id="@+id/dropdown_view"
android:inputType="textAutoComplete"
android:selectAllOnFocus="true"/>

崩溃的 View 的onFocusChangeListener在androidx.fragment.app.Fragment()中的onViewCreated中声明:
   override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
...
dropdownView.setOnFocusChangeListener { view, hasFocus ->
if (hasFocus) {
editUnitView.showDropDown() //<<< Crash here on rotation, Caused by: android.view.WindowManager$BadTokenException:
// Unable to add window -- token null is not valid; is your activity running?
} else {
editUnitView.dismissDropDown()
}
}
...
}

如果我在onPause或onStop中将onFocusChangeListener设置为null,似乎并不能阻止上述监听器被调用!

无论如何,我发现一个似乎有效的修复程序:
dropdownView.setOnFocusChangeListener { view, hasFocus ->
if(view.isAttachedToWindow) { // Requires API 19
if (hasFocus) {
editUnitView.showDropDown()
} else {
editUnitView.dismissDropDown()
}
}
}

可悲的是,我的目标是API 15,我想保留这一点。

我的问题:
您是否有任何想法或建议,如何实施一种保护措施,以不要求将下拉菜单(或其他任何内容)呈现给已经消失的窗口?特别是API级别<19。

最佳答案

您可以将ViewCompat.isAttachedToWindow()用于与view.isAttachedToWindow相同的目的,但要使用API​​ <19

关于android - 如何在小于19的API上安全地请求FocusChange上的showDropDown?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56406375/

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