Я хочу, чтобы событие BackHandler запускалось каждый раз, независимо от того, присутствует или нет фокусируемый элемент.
Видео проблемы
Вот мой код:
App.kt
Код: Выделить всё
@Composable
fun App() {
val navController = rememberNavController()
val context = LocalContext.current
NavHost(navController = navController, startDestination = Splash) {
composable {
SplashScreen {
navController.navigate(MainContent) {
popUpTo(Splash) { inclusive = true }
}
}
}
composable {
DownloadScreen {
navController.navigate(MainContent) {
popUpTo(Download) { inclusive = true }
}
}
}
composable {
MainContentScreen(onBackClick = {
(context as? ComponentActivity)?.finish()
})
}
}
}
Код: Выделить всё
@Composable
fun MainContentScreen(onBackClick: () -> Unit) {
val focusRequester = remember { FocusRequester() }
val isSettingOpen = remember { mutableStateOf(false) }
BackHandler {
Log.e("TAG", "MainContentScreen: BackHandler")
if (isSettingOpen.value) {
isSettingOpen.value = false
} else {
onBackClick()
}
}
Box(
modifier = Modifier
.fillMaxSize()
.focusRequester(focusRequester = focusRequester)
.onDpadCenterClick {
Log.e("TAG", "MainContentScreen: onDpadCenterClick")
isSettingOpen.value = true
}, contentAlignment = Alignment.Center
) {
Text("MainContent Screen")
}
if (isSettingOpen.value) {
SettingsScreen(onBackClick = {
isSettingOpen.value = false
})
}
LaunchedEffect(Unit) {
focusRequester.requestFocus()
}
}
Код: Выделить всё
fun Modifier.onDpadCenterClick(onDpadCenterClick: () -> Unit): Modifier {
return this.then(Modifier
.focusable()
.onKeyEvent { keyEvent ->
if (keyEvent.nativeKeyEvent.action == KeyEvent.ACTION_UP) {
when (keyEvent.nativeKeyEvent.keyCode) {
KeyEvent.KEYCODE_DPAD_CENTER -> {
onDpadCenterClick()
true // Consume the event
}
else -> false
}
} else {
false
}
})
}
Код: Выделить всё
@Composable
fun SettingsScreen(onBackClick: () -> Unit) {
val focusRequester = remember { FocusRequester() }
BackHandler {
Log.e("TAG", "SettingsScreen: BackHandler Called Close")
onBackClick()
}
Box(
modifier = Modifier
.fillMaxSize()
.background(color = SettingsBG)
.focusable()
.focusRequester(focusRequester = focusRequester)
) {
Column {
MPButton(text = "Text 1") {
Log.e("TAG", "SettingsScreen: text 1 click")
}
MPButton(text = "Text 2") {
Log.e("TAG", "SettingsScreen: text 2 click")
}
}
}
LaunchedEffect(Unit) {
focusRequester.requestFocus()
}
}
Код: Выделить всё
@Composable
fun MPButton(text: String, onClick: () -> Unit) {
Card(
modifier = Modifier.padding(all = 10.dp), onClick = onClick
) {
Text(text = text)
}
}
На MainContentScreen при нажатии центральной кнопки D-pad должен открыться SettingsScreen. Внутри SettingsScreen есть две кнопки MPButton, помеченные как text1 и text2, с первоначальным фокусом на text1. Я хочу обрабатывать событие BackHandler в зависимости от того, находится ли фокус на text1 или text2.
Видео проблемы
Подробнее здесь: https://stackoverflow.com/questions/793 ... ll-focused