Android Tv Jetpack Compose BackHandler не вызывается, когда какой-либо элемент находится в фокусеAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Android Tv Jetpack Compose BackHandler не вызывается, когда какой-либо элемент находится в фокусе

Сообщение Anonymous »

В моей функции @Composable при каждом добавлении фокусируемого компонента нажатие удаленной кнопки «Назад» не вызывает событие BackHandler. В этот момент фокусируемый компонент очищает свой фокус, и только после повторного нажатия кнопки «Назад» событие BackHandler срабатывает.
Я хочу, чтобы событие 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()
})
}
}
}
MainContentScreen.kt

Код: Выделить всё

@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 для нажатия по центру Dpad

Код: Выделить всё

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
}
})
}
SettingsScreen.kt

Код: Выделить всё

@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()
}
}
MPButton.kt

Код: Выделить всё

@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
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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