Я не могу изменить цвет системной навигационной панели. В темном режиме он появляется как прозрачный, и это нормально (в идеале я бы хотел, чтобы он был таким же цветом, что и нижняя навигационная панель), но для режима света он просто прямой белый. Я знаю, что начиная с 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
Как изменить цвет навигационной панели Android System API 35+ ⇐ Android
Форум для тех, кто программирует под Android
-
Anonymous
1753778447
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,
)
[b] и вот где я установил свой фон: [/b]
@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)
)
}
}
}
[b] @edit 29.07.2025 [/b]
ниже-мое рабочее решение (спасибо 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,
)
Подробнее здесь: [url]https://stackoverflow.com/questions/79714957/how-do-i-change-color-of-android-system-navigation-bar-api-35[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия