Как поддерживать колонку во время Focus Traversal LazyverticalGrid на телевиденииAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Как поддерживать колонку во время Focus Traversal LazyverticalGrid на телевидении

Сообщение Anonymous »


Я заметил проблему, которая последовательно происходит при объединении LazyverticalGrid по умолчанию обработку фокуса по умолчанию с помощью плавной анимации прокрутки. Если я удерживаю кнопку вверх на пульте дистанционного управления, сетка начнет фокусироваться на элементе непосредственно над предыдущим элементом в том же столбце, а по мере скорости прокрутки он перепрыгнет до последнего столбца. < /P>
У меня есть предположение о том, почему это. Система не видит целевой элемент в макете, поэтому по умолчанию по умолчанию «ближайший» 1-мерный элемент индексирует целевую строку относительно предыдущего элемента, который всегда находится в последнем (крайнем правом) столбце.
Любая идея, как обходной запас и поддерживать колонку во время обхода фокусировки? Я попытался настроить пользовательский обход фокусировки с помощью модификатора .focusproperties {} , определяя направления вверх и вниз, но как только целевой элемент больше не выйдет в макет не установлен. Появляется, что это связано с LazyGrid , использующим тот же «BeyondBoundSlayout Modifier», что и Lazylist , который выглядит только на первом захороненном элементе, чтобы переместить фокус, а не всю строку.
Минимальный воспроизводимый пример (построение проблем? Вставьте в новый проект -> Television -> Пустой шаблон активности) < /p>
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

val colors = arrayOf(
Color.Red,
Color(255, 165, 0),
Color.Yellow,
Color.Green
)

setContent {
LazyVerticalGrid(
state = rememberLazyGridState(),
columns = GridCells.Fixed(4)
) {
for (i in 0 until 100) {
item {
ClassicCard(
modifier = Modifier.padding(10.dp),
image = {
Box(modifier = Modifier
.fillMaxWidth()
.aspectRatio(16/9f)
.background(colors[i % 4]))
},
title = {
Text("Item ${i + 1}")
},
onClick = {}
)
}
}
}
}
}
}
< /code>
Пример траверса на заказ (выбрасывает allodalstateException, если удерживается вверх или вниз) < /p>
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

val numItems = 100
val cols = 4

val colors = arrayOf(
Color.Red,
Color(255, 165, 0),
Color.Yellow,
Color.Green
)

val focusRequesters = Array(numItems) { FocusRequester() }

setContent {
LazyVerticalGrid(
state = rememberLazyGridState(),
columns = GridCells.Fixed(cols)
) {
for (i in 0 until numItems) {
val addUpFocus = i - cols in focusRequesters.indices
val addDownFocus = i + cols in focusRequesters.indices

val focusPropertiesMod = when {
addUpFocus && addDownFocus -> {
Modifier.focusProperties {
up = focusRequesters
down = focusRequesters[i + cols]
}
}
addUpFocus -> {
Modifier.focusProperties {
up = focusRequesters
}
}
addDownFocus -> {
Modifier.focusProperties {
down = focusRequesters[i + cols]
}
}
else -> {
Modifier
}
}

item {
ClassicCard(
modifier = Modifier
.padding(10.dp)
.focusRequester(focusRequesters)
.then(focusPropertiesMod),
image = {
Box(modifier = Modifier
.fillMaxWidth()
.aspectRatio(16/9f)
.background(colors[i % 4]))
},
title = {
Text("Item ${i + 1}")
},
onClick = {}
)
}
}
}
}
}
}
< /code>
зависимости < /p>
[versions]
agp = "8.6.0-alpha06"
kotlin = "1.9.0"
coreKtx = "1.15.0"
appcompat = "1.7.0"
composeBom = "2025.01.01"
tvFoundation = "1.0.0-alpha12"
tvMaterial = "1.0.0"
lifecycleRuntimeKtx = "2.8.7"
activityCompose = "1.10.0"

[libraries]
androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" }
androidx-appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" }
androidx-compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "composeBom" }
androidx-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview" }
androidx-ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling" }
androidx-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" }
androidx-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4" }
androidx-tv-foundation = { group = "androidx.tv", name = "tv-foundation", version.ref = "tvFoundation" }
androidx-tv-material = { group = "androidx.tv", name = "tv-material", version.ref = "tvMaterial" }
androidx-lifecycle-runtime-ktx = { group = "androidx.lifecycle", name = "lifecycle-runtime-ktx", version.ref = "lifecycleRuntimeKtx" }
androidx-activity-compose = { group = "androidx.activity", name = "activity-compose", version.ref = "activityCompose" }

[plugins]
android-application = { id = "com.android.application", version.ref = "agp" }
kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }


Подробнее здесь: https://stackoverflow.com/questions/794 ... grid-on-tv
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как поддерживать колонку во время Focus Traversal LazyverticalGrid на телевидении
    Anonymous » » в форуме Android
    0 Ответы
    17 Просмотры
    Последнее сообщение Anonymous
  • Как поддерживать колонку во время Focus Traversal LazyverticalGrid на телевидении
    Anonymous » » в форуме Android
    0 Ответы
    18 Просмотры
    Последнее сообщение Anonymous
  • В чем разница между :focus-within и :has(:focus)? [закрыто]
    Anonymous » » в форуме CSS
    0 Ответы
    38 Просмотры
    Последнее сообщение Anonymous
  • Android Recyclerview Gain Focus Focus до того, как его элементы получат фокус
    Anonymous » » в форуме Android
    0 Ответы
    19 Просмотры
    Последнее сообщение Anonymous
  • Android Recyclerview Gain Focus Focus до того, как его элементы получат фокус
    Anonymous » » в форуме Android
    0 Ответы
    21 Просмотры
    Последнее сообщение Anonymous

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