Как объявить контекст страницы («Страница X из Y») в HorizontalPager в Jetpack Compose с помощью a11y?Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Как объявить контекст страницы («Страница X из Y») в HorizontalPager в Jetpack Compose с помощью a11y?

Сообщение Anonymous »

Я создаю собственный компонент селектора в Jetpack Compose. Он состоит из HorizontalPager, где каждая страница содержит LazyVerticalGrid выбираемых элементов (действующих как переключатели).
Проблема: когда слепой пользователь перемещается с помощью TalkBack, фокус переходит непосредственно на элементы внутри сетки (например, «Квадрат, Выбрано»). Пользователь не получает никакого контекста о том, что он находится внутри пейджера, и не знает, на какой странице он находится (например, «Страница 1 из 3»).
Кроме того, простое смахивание влево/вправо позволяет перемещаться между элементами сетки, из-за чего пользователю трудно понять, что он может провести двумя пальцами для переключения страниц.
Это мой текущий код:

Код: Выделить всё

Column(modifier = modifier.fillMaxWidth(), verticalArrangement = Arrangement.spacedBy(24.dp)) {
HorizontalPager(
state = pagerState,
modifier = Modifier.fillMaxWidth(),
contentPadding = PaddingValues(horizontal = horizontalPadding),
pageSpacing = horizontalPadding * 2,
verticalAlignment = Alignment.Top
) { pageIndex ->
val pageItems = pages[pageIndex]

LazyVerticalGrid(
userScrollEnabled = false,
columns = GridCells.Fixed(maxColumns),
verticalArrangement = Arrangement.spacedBy(spacingBetweenItems),
horizontalArrangement = Arrangement.spacedBy(spacingBetweenItems),
modifier = Modifier.fillMaxWidth()
) {
items(pageItems) { item ->
Box(modifier = Modifier.fillMaxWidth(), contentAlignment = Alignment.Center) {
Option(
isSelected = selectedItem == item,
iconRes = item.iconRes,
label = stringResource(item.labelRes),
onClick = { onItemClick(item) }
)
}
}
}
}

// Pager indicator
if (pages.size > 1) {
Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.spacedBy(
8.dp,
alignment = Alignment.CenterHorizontally
)
) {
repeat(pagerState.pageCount) {

val color = if(pagerState.currentPage == it) Color.Blue else Color.Gray

Box(
modifier = Modifier
.size(8.dp)
.clip(CircleShape)
.background(color)
)
}
}
}
}

Как я пробовал:
  • Невидимая семантика: я пытался добавить блок с размером 0.dp и семантикой heading() с contentDescription="Page 1 of 3". Похоже, TalkBack удаляет это из дерева доступности, потому что оно невидимо.
  • Семантика контейнера: я попробовал добавить семантику {stateDescription = "Page X of Y" } к модификатору LazyVerticalGrid. Он не всегда объявляет при входе в сетку.


Подробнее здесь: https://stackoverflow.com/questions/798 ... pack-compo
Ответить

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

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

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

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

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