Android: Spinner выпадающий в полноэкранном режиме

Я пытаюсь открыть выпадающий спиннер в полноэкранном режиме (режим погружения), но проблема в том, что при открытии выпадающего меню появляется полупрозрачная панель навигации внизу. Панели навигации скрываются при выборе параметра, но остаются видимыми, пока отображается выпадающий список. Я смог удалить это поведение во фрагменте диалога, так как у меня есть show(FragmentManager manager, String tag) метод переопределить и добавить это

getDialog().getWindow().getDecorView().setSystemUiVisibility(getActivity()
.getWindow().getDecorView().getSystemUiVisibility());

// Make the dialogs window focusable
 again.getDialog().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);

но никакой метод, подобный этому, не доступен в счетчике. Я пытался поставить этот метод в performClick() используя реализацию слушателя в родителе, но все равно не повезло.

Любое решение этой проблемы.

1 ответ

Для пользователей Java создать этот статический класс

import android.widget.ListPopupWindow;
import android.widget.PopupWindow;
import android.widget.Spinner;

public static void avoidSpinnerDropdownFocus(Spinner spinner) {
    try {
        Field listPopupField = Spinner.class.getDeclaredField("mPopup");
        listPopupField.setAccessible(true);
        Object listPopup = listPopupField.get(spinner);
        if (listPopup instanceof ListPopupWindow) {
            Field popupField = ListPopupWindow.class.getDeclaredField("mPopup");
            popupField.setAccessible(true);
            Object popup = popupField.get((ListPopupWindow) listPopup);
            if (popup instanceof PopupWindow) {
                ((PopupWindow) popup).setFocusable(false);
            }
        }
    } catch (NoSuchFieldException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }
}

Для пользователя Kotlin используйте эту функцию расширения

import android.widget.ListPopupWindow
import android.widget.PopupWindow
import android.widget.Spinner

fun Spinner.avoidDropdownFocus() {
try {
    val listPopup = Spinner::class.java
            .getDeclaredField("mPopup")
            .apply { isAccessible = true }
            .get(this)
    if (listPopup is ListPopupWindow) {
        val popup = ListPopupWindow::class.java
                .getDeclaredField("mPopup")
                .apply { isAccessible = true }
                .get(listPopup)
        if (popup is PopupWindow) {
            popup.isFocusable = false
        }
    }
} catch (e: Exception) {
    e.printStackTrace()
}
}

Вам нужно вызвать этот метод из вашего spinner в вашем OnCreate метод или когда ваш Spinner надувается или в любое время перед его использованием.

spinner.avoidSpinnerDropdownFocus()

Кредиты для пользователя kakajika GitHub kakajika https://gist.github.com/kakajika/a236ba721a5c0ad3c1446e16a7423a63

Попробуйте этот код:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
Другие вопросы по тегам