Как установить элемент фокусировки по умолчанию в Android jetpack Compose

#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. Подробнее читайте в документации