标签: android-jetpack-compose-tv

如何在 Android jetpack Compose 中设置默认焦点项

我的屏幕上有几个可聚焦的电视小部件。

在此输入图像描述 每次我都必须点击方向键才能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))
    }
}
Run Code Online (Sandbox Code Playgroud)

android kotlin android-tv android-jetpack-compose android-jetpack-compose-tv

6
推荐指数
1
解决办法
3362
查看次数

Android Jetpack Compose TV 焦点恢复

我在 TvLazyColumn 中有 TvLazyRows。当我导航到所有列表的末尾(位置 [20,20])导航到下一个屏幕并返回时,焦点将恢复到第一个可见位置 [15,1],而不是我之前所在的位置 [20,20] ]。如何将焦点恢复到某个特定位置?

在此输入图像描述

class MainActivity : ComponentActivity() {

    private val rowItems = (0..20).toList()
    private val rows = (0..20).toList()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            val navController = rememberNavController()
            MyAppNavHost(navController = navController)
        }
    }

    @Composable
    fun List(navController: NavController) {
        val fr = remember {
            FocusRequester()
        }
        TvLazyColumn( modifier = Modifier
            .focusRequester(fr)
            .fillMaxSize()
            ,
            verticalArrangement = Arrangement.spacedBy(16.dp),
            pivotOffsets = PivotOffsets(parentFraction = 0.05f),
        ) {
            items(rows.size) { rowPos ->
                Column() {
                    Text(text = "Row $rowPos")
                    TvLazyRow( …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-tv android-jetpack-compose android-jetpack-compose-tv

5
推荐指数
1
解决办法
1846
查看次数

导航 popBackStack 的焦点恢复和使用状态修饰符的焦点恢复

JetStream tv 应用程序示例中,它有一个createInitialFocusRestorerModifiers()函数充当其子级 TvLazyRow/Column 的焦点恢复器。

正如该函数的 KDoc 中所述:

返回一组修饰符 [FocusRequesterModifiers],可用于恢复焦点并指定最初聚焦的项目。

其用法:

  LazyRow(modifier.then(modifiers.parentModifier) {
   item1(modifier.then(modifiers.childModifier) {...}
   item2 {...}
   item3 {...}
   ...
  }
Run Code Online (Sandbox Code Playgroud)

NestedLazyList 可组合项 正确的行为应该如下图所示。向下按 DPad 应聚焦到第一个项目,向上按应将焦点带到最后保存的状态焦点子项。

不过,这里的问题是它不能恢复对导航的关注[ popBackStack()],所以我尝试将上述功能与这个答案集成。

当前代码:

        // var anItemHasBeenFocused: Boolean = false
        // var lastFocusedItem: Pair<Int, Int> = ...

        TvLazyRow(
            modifier = focusRestorerModifiers.parentModifier,
            pivotOffsets = PivotOffsets(parentFraction = 0F)
        ) {
            itemsIndexed(items = items) { columnIndex, item ->
                val focusRequester = remember { FocusRequester() }
                
                RowItem(
                    modifier = Modifier
                        .focusRequester(focusRequester)
                        .ifElse(
                            condition = columnIndex …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-jetpack-compose android-jetpack-compose-tv

4
推荐指数
1
解决办法
710
查看次数

如何在关注 TVLazyRow 的同时始终关注第一项?

我正在尝试实现一个 TVLazyRow,当我们关注该行上方其他可组合项的行时,它必须始终首先关注第一个项目。目前,按下时,焦点将转到行中位于上面可组合项正下方的项目。我怎样才能实现这种行为?

这是我的代码以获取更多上下文:

val tvListState = rememberTvLazyListState()
val coScope = rememberCoroutineScope()

TvLazyRow(
        horizontalArrangement = Arrangement.spacedBy(15.dp),
        state = tvListState,
        modifier = modifier
            .fillMaxHeight()
            .padding(end = 5.dp)
            .onFocusChanged {
                if (it.isFocused) {
                    coScope.launch {
                        tvListState.scrollToItem(0)
                    }
                }
            }, pivotOffsets = PivotOffsets(0f)
) { *items* }
Run Code Online (Sandbox Code Playgroud)

android-tv android-jetpack android-jetpack-compose android-jetpack-compose-tv

4
推荐指数
1
解决办法
1423
查看次数

修复 Jetpack Compose 的 TvLazyRow/TvLazyColumn 中给定枢轴处的项目

我正在使用jetpack compose for tv 库TvLazyRow中的可组合项,并使用PivotOffsets将焦点项目定位在行中的固定位置。

当我将行滚动到最后时,不遵守固定位置值,并且可聚焦的项目会转到最后。

即使滚动到末尾或开头,如何保持位置固定?

观察到的行为:

期望的行为:

android-tv android-jetpack-compose android-jetpack-compose-tv

3
推荐指数
1
解决办法
548
查看次数

使用 Jetpack Compose 在 Android TV 上启用系统声音

你好 Stack Overflow 社区,

我目前正在使用 Jetpack Compose 开发 Android TV 应用程序,但遇到了一个我似乎无法找到解决方案的问题。

在传统的 Android 开发中,我可以轻松地使用 AudioManager 类来处理系统声音。然而,随着过渡到 Jetpack Compose,我不知道如何做同样的事情。

这是我在传统视图系统中使用的典型方法:

AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
audioManager.playSoundEffect(Sounds.DISMISS);
Run Code Online (Sandbox Code Playgroud)

如何在 Jetpack Compose 中实现同等功能?任何帮助将不胜感激。如果需要任何其他信息,我非常乐意提供。

先感谢您。

(它不起作用:)

<resources>
    <style name="Theme.xxx" parent="android:Theme.Material.Light.NoActionBar">
        <item name="android:soundEffectsEnabled">true</item>
    </style>
</resources>
Run Code Online (Sandbox Code Playgroud)

android android-tv android-jetpack android-jetpack-compose android-jetpack-compose-tv

3
推荐指数
1
解决办法
324
查看次数

ComposeView 抢走了 AndroidTV 内容的焦点

我正在尝试在现有的 AndroidTV 应用程序中使用 Jetpack Compose。我需要制作一个带有麦克风图标的按钮,如果它聚焦,它的颜色就会改变。像这样^

不专心

在此输入图像描述

专注

在此输入图像描述

这是我的 ComposeView

<androidx.compose.ui.platform.ComposeView
    android:id="@+id/micBtn"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>
Run Code Online (Sandbox Code Playgroud)

这是我的片段中的代码

binding.micBtn.setContent {
    var buttonResId by remember { mutableStateOf(R.drawable.speech_recognition_button_unfocused) }
    IconButton(
        modifier = Modifier
            .size(60.dp)
            .onFocusChanged {
                buttonResId = if (it.isFocused) {
                    R.drawable.speech_recognition_button_focused
                } else {
                    R.drawable.speech_recognition_button_unfocused
                }
            },
        onClick = onClick,
    ) {
        Icon(
            painter = painterResource(id = buttonResId),
            contentDescription = null,
            tint = Color.Unspecified,
        )
    }
}
Run Code Online (Sandbox Code Playgroud)

看起来不错,对吧?问题是,当我尝试关注此按钮时,焦点首先转到AndroidComposeView项目(根据我的GlobalFocusListener)。只有我的第二个操作(单击、方向键导航)才能使我的内容集中。

所以,出于某种原因,内部AndroidComposeView窃取了我的注意力Content

有什么办法可以防止这种行为吗?我只需要关注我的内容,而不是AndroidComposeView包装。

android android-tv android-jetpack-compose android-jetpack-compose-tv

3
推荐指数
1
解决办法
542
查看次数

如何使用 jetpack compose 设置按钮的焦点状态?

compose_version = '1.0.0-beta02'。

我可以通过 FocusRequester 设置焦点状态 TextField,但 Button 不能。

        val requester1 = FocusRequester()
       
        TextField(value = text1,
            { newValue ->
                text1 = newValue
            },
            modifier = Modifier
                .focusable(true)
                .focusRequester(requester1)
                .background(focusedColor1)
                .onFocusChanged {
                    focusedColor1 = if (it.isFocused) {
                        text1 = "TextField1 focused"
                        Color.Red
                    } else {
                        text1 = "TextField1 unfocused"
                        Color.Green
                    }
                }

        )
Run Code Online (Sandbox Code Playgroud)

将调用 TextField 的“onFocusChanged”方法。

        val requester3 = FocusRequester()
        Button(
            onClick = {
                requester3.requestFocus()

            },
            modifier = Modifier
                .focusModifier()
                .focusable(true)
                .focusRequester(requester3)
                .onFocusEvent {
                    Toast
                        .makeText(
                            context,
                            "Button onFocusEvent it.isFocused:${it.isFocused}. ${it.name}", …
Run Code Online (Sandbox Code Playgroud)

android android-tv android-jetpack-compose android-compose-button android-jetpack-compose-tv

2
推荐指数
1
解决办法
2387
查看次数