我的屏幕上有几个可聚焦的电视小部件。
我的代码:
@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
我在 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
在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)
正确的行为应该如下图所示。向下按 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
我正在尝试实现一个 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
我正在使用jetpack compose for tv 库TvLazyRow
中的可组合项,并使用PivotOffsets将焦点项目定位在行中的固定位置。
当我将行滚动到最后时,不遵守固定位置值,并且可聚焦的项目会转到最后。
即使滚动到末尾或开头,如何保持位置固定?
观察到的行为:
期望的行为:
android-tv android-jetpack-compose android-jetpack-compose-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
我正在尝试在现有的 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
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