Как мне сохранить иммерсивный режим в Spinner?

Я использую иммерсивно-липкий режим, чтобы скрыть панель навигации и панель действий:

@TargetApi(19)
private void setImmersiveMode() {
    if (Build.VERSION.SDK_INT >= 19) {
        View decorView = getWindow().getDecorView();
        int uiOptions = getImmersiveUiOptions(decorView);
        decorView.setSystemUiVisibility(uiOptions);
        ActionBar actionBar = getActionBar();
        if (null!=actionBar) {
            actionBar.hide();
        }
    }
}

При прикосновении к Spinner отображается navigationBar и режим погружения отключается.

Это решение работает для диалогов:

dialog.getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
dialog.show();
dialog.getWindow().getDecorView().setSystemUiVisibility(
context.getWindow().getDecorView().getSystemUiVisibility());
dialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);

Но Spinner не имеет метода show(), который я мог бы перезаписать.

Как я могу предотвратить отображение системного интерфейса при касании счетчика?

Редактировать: этот вопрос касается сохранения скрытой панели навигации (BackButton, HomeButton и RecentTasksButton). Уже пользуюсь FLAG_FULLSCREEN

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);   

Возможный дубликат setSystemUIVsibility отключает полный экран при использовании Spinner

Vishva Dave 28.03.2018 14:11
6
1
1 109
2

Ответы 2

Я знаю, что это очень поздно, но я наконец нашел решение этого здесь:

Просто вызовите это на своем счетчике перед его использованием:

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

fun Spinner.avoidDropdownFocus() {
    try {
        val isAppCompat = this is androidx.appcompat.widget.AppCompatSpinner
        val spinnerClass = if (isAppCompat) androidx.appcompat.widget.AppCompatSpinner::class.java else Spinner::class.java
        val popupWindowClass = if (isAppCompat) androidx.appcompat.widget.ListPopupWindow::class.java else android.widget.ListPopupWindow::class.java

        val listPopup = spinnerClass
                .getDeclaredField("mPopup")
                .apply { isAccessible = true }
                .get(this)
        if (popupWindowClass.isInstance(listPopup)) {
            val popup = popupWindowClass
                    .getDeclaredField("mPopup")
                    .apply { isAccessible = true }
                    .get(listPopup)
            if (popup is PopupWindow) {
                popup.isFocusable = false
            }
        }
    } catch (e: Exception) {
        e.printStackTrace()
    }
}

Для всех, кто, как и я, начнет переписывать решение, вставленное @Quinn, с Kotlin на Java, а позже они узнают, что на связанный репозиторий git есть решение и на 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();
    }
}

Ха-ха, извини за это!

Quinn 05.03.2020 15:15

Нет проблем :) Спасибо за ответ.

Andropogon 05.03.2020 15:43

У меня была проблема с этим на Android 9, которая была связана с использованием androidx.appcompat:appcompat версии 1.0.2. Обновление до 1.2.0 позволило избежать проблемы и снова заставило этот обходной путь работать.

Wim Deblauwe 05.10.2020 11:35

Другие вопросы по теме