Как изменить цвет навигационной панели Android System API 35+Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Как изменить цвет навигационной панели Android System API 35+

Сообщение Anonymous »

Я не могу изменить цвет системной навигационной панели. В темном режиме он появляется как прозрачный, и это нормально (в идеале я бы хотел, чтобы он был таким же цветом, что и нижняя навигационная панель), но для режима света он просто прямой белый. Я знаю, что начиная с Android 35, на нем есть какой -то защитный слой, но когда он будет прозрачным, он должен позволить мне изменить свой цвет или, по крайней мере, быть прозрачным. Кто -нибудь удалось заставить его работать?
Я не проверял, как он ведет себя на API> 35. Навигационные полосы и столбцы состояния, но только в режиме Dark, в режиме света все еще белый.class MainActivity : AppCompatActivity() {
private val startupViewModel: StartupViewModel by viewModel()
private val inAppUpdateManager: InAppUpdateManager by inject()

override fun onCreate(savedInstanceState: Bundle?) {
installSplashScreen()
super.onCreate(savedInstanceState)

var themeSettings by mutableStateOf(
ThemeSettings(
darkTheme = false,
dynamicColor = false
)
)

inAppUpdateManager.check(this)

lifecycleScope.launch {
lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) {
combine(
isSystemInDarkTheme(),
startupViewModel.state
) { systemDark, uiState ->
ThemeSettings(
darkTheme = when (uiState.theme) {
Theme.SYSTEM -> systemDark
Theme.LIGHT -> false
Theme.DARK -> true
},
dynamicColor = uiState.dynamicColors
)
}.onEach { themeSettings = it }
.map { it.darkTheme }
.distinctUntilChanged()
.collect { darkTheme ->
enableEdgeToEdge(
statusBarStyle = SystemBarStyle.auto(
lightScrim = Color.TRANSPARENT,
darkScrim = Color.TRANSPARENT,
) { darkTheme },
navigationBarStyle = SystemBarStyle.auto(
lightScrim = Color.TRANSPARENT,
darkScrim = Color.TRANSPARENT,
) { darkTheme }
)
}
}
}

setContent {
Theme(
darkTheme = themeSettings.darkTheme,
dynamicColor = themeSettings.dynamicColor
) {
val state = startupViewModel.state.collectAsStateWithLifecycle()
Background {
if (state.value.isLoading) {
StartupScreen(
showSkip = { state.value.showSkip },
onSkip = { startupViewModel.skipFetching() }
)
} else {
NavigationRoot(startDestination = state.value.startDestination)
}
}
}
}
}

override fun onResume() {
super.onResume()
inAppUpdateManager.onResume(this)
}
}

private val lightScrim = Color.argb(0xe6, 0xFF, 0xFF, 0x00)
private val darkScrim = Color.argb(0xe6, 0xFF, 0xFF, 0x00)

@Immutable
private data class ThemeSettings(
val darkTheme: Boolean,
val dynamicColor: Boolean,
)

и вот где я установил свой фон:
@Composable
fun Background(
modifier: Modifier = Modifier,
content: @Composable () -> Unit,
) {
val primary = MaterialTheme.colorScheme.surface
val secondary = MaterialTheme.colorScheme.surfaceContainer

val gradient = remember(primary, secondary) {
Brush.verticalGradient(colors = listOf(primary, secondary))
}

Box(
modifier = modifier.fillMaxSize()
) {
Surface(
color = Color.Transparent,
modifier = Modifier
.matchParentSize()
.background(gradient)
) {
CompositionLocalProvider(LocalAbsoluteTonalElevation provides 0.dp) {
content()
}
}

if (Build.VERSION.SDK_INT >= 35) {
Box(
modifier = Modifier
.align(Alignment.BottomCenter)
.fillMaxWidth()
.zIndex(Float.MAX_VALUE)
.windowInsetsBottomHeight(WindowInsets.navigationBars)
.background(MaterialTheme.colorScheme.surfaceContainer)
)
}
}
}

@edit 29.07.2025
ниже-мое рабочее решение (спасибо mofe ejegi), которое дает фон кисти, а также изменяет цвет системной навигационной панели вместе с значками в них.
Unit,
) {
val primary = MaterialTheme.colorScheme.surface
val secondary = MaterialTheme.colorScheme.surfaceContainer

val gradient = remember(primary, secondary) {
Brush.verticalGradient(colors = listOf(primary, secondary))
}

Box(
modifier = modifier
.fillMaxSize()
) {
Surface(
color = Color.Transparent,
modifier = modifier
.fillMaxSize()
.background(gradient)
) {
CompositionLocalProvider(LocalAbsoluteTonalElevation provides 0.dp) {
content()
}
}
Box(
modifier = Modifier
.align(Alignment.BottomCenter)
.fillMaxWidth()
.windowInsetsBottomHeight(WindowInsets.navigationBars)
.background(MaterialTheme.colorScheme.surfaceContainer)
)
}
}
< /code>
class MainActivity : AppCompatActivity() {
private val startupViewModel: StartupViewModel by viewModel()
private val inAppUpdateManager: InAppUpdateManager by inject()

private lateinit var updateLauncher: ActivityResultLauncher

override fun onCreate(savedInstanceState: Bundle?) {
installSplashScreen()
super.onCreate(savedInstanceState)

var themeSettings by mutableStateOf(
ThemeSettings(
darkTheme = false,
dynamicColor = false
)
)

updateLauncher = registerForActivityResult(ActivityResultContracts.StartIntentSenderForResult()) { result ->
inAppUpdateManager.onUpdateResult(result, this)
}
inAppUpdateManager.setLauncher(updateLauncher, this)

inAppUpdateManager.check(this)

lifecycleScope.launch {
lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) {
combine(
isSystemInDarkTheme(),
startupViewModel.state
) { systemDark, uiState ->
ThemeSettings(
darkTheme = when (uiState.theme) {
Theme.SYSTEM -> systemDark
Theme.LIGHT -> false
Theme.DARK -> true
},
dynamicColor = uiState.dynamicColors
)
}.onEach { themeSettings = it }
.map { it.darkTheme }
.distinctUntilChanged()
.collect { darkTheme ->
enableEdgeToEdge(
navigationBarStyle = if (darkTheme) {
SystemBarStyle.dark(
scrim = Color.TRANSPARENT
)
} else {
SystemBarStyle.light(
scrim = Color.TRANSPARENT,
darkScrim = Color.TRANSPARENT
)
}
)
}
}
}

setContent {
Theme(
darkTheme = themeSettings.darkTheme,
dynamicColor = themeSettings.dynamicColor
) {
val state = startupViewModel.state.collectAsStateWithLifecycle()
Background {
if (state.value.isLoading) {
StartupScreen(
showSkip = { state.value.showSkip },
onSkip = { startupViewModel.skipFetching() }
)
} else {
NavigationRoot(startDestination = state.value.startDestination)
}
}
}
}
}

override fun onResume() {
super.onResume()
inAppUpdateManager.onResume(this)
}
}

@Immutable
private data class ThemeSettings(
val darkTheme: Boolean,
val dynamicColor: Boolean,
)


Подробнее здесь: https://stackoverflow.com/questions/797 ... bar-api-35
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»