How do I maintain the Immersive Mode in Spinner?

后端 未结 2 1539
眼角桃花
眼角桃花 2020-12-09 22:32

I use immersive-sticky mode to hide the navigation bar and action bar:

@TargetApi(19)
private void setImmersiveMode() {
    if (Build.VERSION.SDK_INT >= 1         


        
相关标签:
2条回答
  • 2020-12-09 23:14

    I know this is super late, but I finally found a solution to this here:

    Just call this on your spinner before using it:

    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()
        }
    }
    
    0 讨论(0)
  • 2020-12-09 23:30

    For everyone who, like me, will start rewriting solution pasted by @Quinn from Kotlin to Java and later they will find out that on the linked git repo is the solution in Java also, I am pasting it here:

    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();
        }
    }
    
    0 讨论(0)
提交回复
热议问题