3

我正在尝试以全屏(沉浸式模式)打开下拉微调器,但问题是当下拉菜单打开时,它会在底部显示半透明的导航栏。选择选项时导航栏会隐藏,但只要下拉菜单可见,导航栏就会保持可见。我能够在对话框片段中删除此行为,因为我有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()在父级中使用侦听器实现,但仍然没有运气。

这个问题的任何解决方案。

4

2 回答 2

3

对于 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

于 2018-12-11T17:58:34.163 回答
0

试试这个代码:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
于 2017-08-22T12:12:10.470 回答