Как поддерживать колонку во время Focus Traversal LazyverticalGrid на телевидении ⇐ Android
Как поддерживать колонку во время Focus Traversal LazyverticalGrid на телевидении
Я заметил проблему, которая последовательно происходит при объединении 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
Я заметил проблему, которая последовательно происходит при объединении 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
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как поддерживать колонку во время Focus Traversal LazyverticalGrid на телевидении
Anonymous » » в форуме Android - 0 Ответы
- 17 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Как поддерживать колонку во время Focus Traversal LazyverticalGrid на телевидении
Anonymous » » в форуме Android - 0 Ответы
- 18 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Android Recyclerview Gain Focus Focus до того, как его элементы получат фокус
Anonymous » » в форуме Android - 0 Ответы
- 19 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Android Recyclerview Gain Focus Focus до того, как его элементы получат фокус
Anonymous » » в форуме Android - 0 Ответы
- 21 Просмотры
-
Последнее сообщение Anonymous
-