Android:全屏微调下拉菜单

标签 android android-spinner android-immersive android-navigation-bar

我试图在全屏(沉浸式模式)下打开下拉微调器,但问题是当下拉打开时它会在底部显示半透明的导航栏。选择一个选项时,导航栏会隐藏,但只要下拉菜单可见,导航栏就会保持可见。 我能够在对话框 fragment 中删除此行为,因为我有 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() 中,但仍然没有成功。

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

最佳答案

为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()
}
}

您需要在 OnCreate 方法中从您的 spinner 调用该方法,或者当您的 Spinner 充气时或在使用它之前的任何时间.

spinner.avoidSpinnerDropdownFocus()

感谢 kakajika GitHub 用户 kakajika https://gist.github.com/kakajika/a236ba721a5c0ad3c1446e16a7423a63

关于Android:全屏微调下拉菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45817144/

相关文章:

android - 沉浸式模式 Activity 转换

android - 如何在android中使用google play services 4.3的地址api获取用户地址?

android - 如何将删除项目选项添加到 Spinner 下拉列表

android - 如果未选择或跳过微调器,如何显示对话框

java - 如何在微调器之间传递选定的微调器项目?

android - 显示空白的沉浸式模式

Android 隐藏导航栏/单击按钮时保持沉浸模式

Android Studio Bumblebee 2021.1.1 Canary 4 Emulator 无法在 m1 上运行

java - Android 无法更新 ArrayAdapter,因为 "Non-Static method ' notifyDataSetChanged( )' cannot be referenced from a static context"

php - android webview cookies 不工作