Android Question Immersive mode in Android 16

yo3ggx

Active Member
Licensed User
Longtime User
Hello,

I'm using the following code to set Immersive mode.
B4X:
Sub Activity_WindowFocusChanged(HasFocus As Boolean)
    If HasFocus Then
        HideMenuBar
    End If
End Sub

Sub HideMenuBar
    Dim jo As JavaObject
    jo.InitializeContext

'    Dim NativeMe As JavaObject
'    NativeMe.InitializeStatic("anywheresoftware.b4a.ImmersiveHelper")

    Dim window As JavaObject = jo.RunMethodJO("getWindow", Null)
    Dim decorView As JavaObject = window.RunMethodJO("getDecorView", Null)
    NativeMe.RunMethod("consumeInsets", Array(decorView))

    If SDKver >= 30 Then
        ' Android 11+ (including Android 16)
        NativeMe.RunMethod("setDecorFitsSystemWindows", Array(window, False))
        window.RunMethod("addFlags", Array(0x80000000)) ' FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS
        window.RunMethod("setNavigationBarColor", Array(0)) ' Transparent

        Dim wic As JavaObject = NativeMe.RunMethodJO("getInsetsController", Array(window, decorView))
        If wic.IsInitialized Then
            wic.RunMethod("setSystemBarsBehavior", Array(2)) ' BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
            Dim types As JavaObject = NativeMe.RunMethod("getSystemBarsType", Null)
            wic.RunMethod("hide", Array(types))
            decorView.RunMethod("setSystemUiVisibility", Array(5894)) ' HIDE_NAV + FULLSCREEN + IMMERSIVE_STICKY
        End If
    Else
        ' Android 5–10
        Dim immersiveFlags As Int = 5894 ' SYSTEM_UI_FLAG_HIDE_NAVIGATION + SYSTEM_UI_FLAG_FULLSCREEN + SYSTEM_UI_FLAG_IMMERSIVE_STICKY
        decorView.RunMethod("setSystemUiVisibility", Array(immersiveFlags))
    End If
End Sub
#If Java

import android.view.Window;
import android.view.View;
import androidx.core.view.WindowCompat;
import androidx.core.view.WindowInsetsControllerCompat;
import androidx.core.view.WindowInsetsCompat;
import androidx.core.view.ViewCompat;
import androidx.core.view.OnApplyWindowInsetsListener;


    public static void setDecorFitsSystemWindows(Window window, boolean fits) {
        WindowCompat.setDecorFitsSystemWindows(window, fits);
    }

    public static WindowInsetsControllerCompat getInsetsController(Window window, View decorView) {
        return WindowCompat.getInsetsController(window, decorView);
    }

    public static int getSystemBarsType() {
        return WindowInsetsCompat.Type.systemBars();
    }

    public static void consumeInsets(View view) {
        ViewCompat.setOnApplyWindowInsetsListener(view, new OnApplyWindowInsetsListener() {
            @Override
            public WindowInsetsCompat onApplyWindowInsets(View v, WindowInsetsCompat insets) {
                return WindowInsetsCompat.CONSUMED;
            }
        });
    }
#End If

It works from Android 5 to 15, but don't work on Android 16.
Any suggestions?

Thank you
 
Top