Как можно безопасно запросить showDropDown для FocusChange, для API менее 19? - PullRequest
1 голос
/ 01 июня 2019

У меня происходит сбой приложения 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>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...