У меня происходит сбой приложения Android, когда меняется ориентация (повернуто), потому что изменение фокуса пытается отобразить раскрывающийся список в AppCompatAutoCompleteTextView, который уже потерял родительское окно (я полагаю).
Причина: android.view.WindowManager $ BadTokenException: Невозможно добавить
window - токен null недействителен; ваша деятельность работает?
Это происходит, только когда фокус уже находится в этом виде, когда ориентация меняется ... Я немного удивлен, что вид получает событие изменения фокуса при вращении устройства (эмулятора).
Соответствующее представление в формате XML выглядит следующим образом:
<androidx.appcompat.widget.AppCompatAutoCompleteTextView
android:id="@+id/dropdown_view"
android:inputType="textAutoComplete"
android:selectAllOnFocus="true"/>
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()
}
}
...
}
Если я установлю это onFocusChangeListener = null в onPause или onStop , это не помешает вызову вышеупомянутого слушателя!
Во всяком случае, я нашел одно исправление, которое, кажется, работает:
dropdownView.setOnFocusChangeListener { view, hasFocus ->
if(view.isAttachedToWindow) { // Requires API 19
if (hasFocus) {
editUnitView.showDropDown()
} else {
editUnitView.dismissDropDown()
}
}
}
К сожалению, я нацелился на API 15, и я хотел бы сохранить это.
Мой вопрос:
Не могли бы вы предложить какие-либо идеи или предложения, как реализовать меры предосторожности, чтобы не запрашивать отображение выпадающего меню (или чего-либо еще) в окне, которое уже исчезло? Особенно уровень API <19. </p>