#android #kotlin #android-jetpack-compose #android-tv
Вопрос:
У меня есть экран с несколькими фокусируемыми виджетами для телевизора.
Каждый раз, когда мне нужно нажать клавишу направления, а затем Box01
сосредоточиться.
Кто-нибудь знает, как установить Box01
фокусировку по умолчанию?
Мой Код:
@Composable
fun DefaultFocusSample(){
Row(Modifier.padding(100.dp)) {
FocusBox("Box01")
Spacer(modifier = Modifier.padding(10.dp))
FocusBox("Box02")
Spacer(modifier = Modifier.padding(10.dp))
FocusBox("Box03")
Spacer(modifier = Modifier.padding(10.dp))
FocusBox("Box04")
}
}
@Composable
fun FocusBox(text:String){
var color by remember { mutableStateOf(White) }
Box(
Modifier
.onFocusChanged {
color = if (it.isFocused) Green else White }
.focusable()
.border(2.dp,color)
){
Text(text = text,
modifier = Modifier.padding(10.dp))
}
}
Ответ №1:
Чтобы вручную перевести фокус в режим фокусировки, вы можете использовать FocusRequester
, например, это:
@Composable
fun FocusBox(text:String, requester: FocusRequester = FocusRequester()){
var color by remember { mutableStateOf(Color.White) }
Box(
Modifier
.focusRequester(requester)
.onFocusChanged {
color = if (it.isFocused) Color.Green else Color.White
}
.focusable()
.border(2.dp, color)
) {
Text(text = text,
modifier = Modifier.padding(10.dp))
}
}
Row(
Modifier
.background(Color.Yellow)
.padding(10.dp)
) {
val requester = FocusRequester()
FocusBox("Box01", requester)
LaunchedEffect(Unit) {
requester.requestFocus()
}
Spacer(modifier = Modifier.padding(10.dp))
FocusBox("Box02")
Spacer(modifier = Modifier.padding(10.dp))
FocusBox("Box03")
Spacer(modifier = Modifier.padding(10.dp))
FocusBox("Box04")
}
LaunchedEffect
это побочный эффект, он будет запущен только один раз, когда появится composable. Подробнее читайте в документации