Takže tento kód funguje mi funguje. Doporučuji to použít a dát to třebas i na uživatelské nastavení ať si každý vybere co je libo (pokud nevybere nic, necháte jak máte teď, bez jakéhokoliv volání kódu):
private void setLightNavBar() {
// bílý podklad + tmavé ikony
setNavBarColor(Color.WHITE, true);
}
private void setDarkNavBar() {
// černý podklad + světlé ikony
setNavBarColor(Color.BLACK, false);
}
private void setTransparentNavBar() {
Window w = getWindow();
// 1) Musíme povolit "draw behind" (obsah sahá pod navigaci)
View decor = w.getDecorView();
int vis = decor.getSystemUiVisibility();
vis |= View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
// zrušíme flag pro světlé ikony (většinou na průhledném chceme světlé ikony)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
vis &= ~View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR;
}
decor.setSystemUiVisibility(vis);
// 2) Ujistíme se, že systém kreslí barvy
w.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
w.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
// 3) Transparentní bar
w.setNavigationBarColor(Color.TRANSPARENT);
// 4) API 30+: nastavíme appearance přes platformní WindowInsetsController
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
WindowInsetsController ic = w.getInsetsController();
if (ic != null) {
// zde 0 = tmavé ikony NE, tedy světlé ikony (často lepší na průhledném)
ic.setSystemBarsAppearance(0, WindowInsetsController.APPEARANCE_LIGHT_NAVIGATION_BARS);
}
}
}
// ----------------------
// pomocné metody
// ----------------------
private void setNavBarColor(int color, boolean useLightIcons) {
Window w = getWindow();
View decor = w.getDecorView();
// 1) Odebereme "draw-behind" layout flags (pokud byly)
int vis = decor.getSystemUiVisibility();
vis &= ~View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION;
vis &= ~View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
// 2) Správně nastavíme flag pro světlé ikony (API 26+)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
if (useLightIcons) {
vis |= View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR;
} else {
vis &= ~View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR;
}
}
decor.setSystemUiVisibility(vis);
// 3) Ujistíme se že systém kreslí barvy (ne translucent)
w.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
w.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
// 4) Nastavíme barvu navigační lišty
w.setNavigationBarColor(color);
// 5) API 30+: preferuj platformní API pro appearance (spolehlivější)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
WindowInsetsController ic = w.getInsetsController();
if (ic != null) {
int appearance = useLightIcons ? WindowInsetsController.APPEARANCE_LIGHT_NAVIGATION_BARS : 0;
ic.setSystemBarsAppearance(appearance, WindowInsetsController.APPEARANCE_LIGHT_NAVIGATION_BARS);
}
}
}