Как вернуть фокус на предыдущий вид (нажатие пульта)Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Как вернуть фокус на предыдущий вид (нажатие пульта)

Сообщение Anonymous »

Есть такой экран (Android TV)
Изображение

Мне нужно реализовать следующее:
  • При открытии экрана фокус должен быть на первом просмотр на левой панели (левая панель: 0).
  • Пользователь может перемещаться (с помощью пульта дистанционного управления) по элементам левой панели вверх и вниз.
  • Если пользователь нажимает кнопку вправо, фокус перемещается на первое представление на правой панели (Правая панель: 0).
  • Пользователь может свободно перемещать фокус между элементами в правая панель.
  • Если пользователь находится на правой панели и нажимает кнопку «Влево», фокус должен вернуться к элементу на левой панели, из которого пользователь перешел на правую панель. То есть, если пользователь находился на третьем элементе левой панели и нажал вправо, то при возврате с правой панели на левую фокус должен вернуться к третьему элементу, где он был раньше.
Все работает как надо кроме 5-го пункта.
Вот код:

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

class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
Test_delete_itTheme {
Surface(
modifier = Modifier.fillMaxSize(),
shape = RectangleShape
) {
Greeting()
}
}
}
}
}

@Composable
fun Greeting() {
val leftPanelFocusRequester: FocusRequester = remember { FocusRequester() }
val rightPanelFocusRequester: FocusRequester = remember { FocusRequester() }

Row(modifier = Modifier
.fillMaxSize()
) {
LeftPanel(
focusRequester = leftPanelFocusRequester,
onRightDirectionClicked = {
rightPanelFocusRequester.requestFocus()
}
)
RightPanel(focusRequester = rightPanelFocusRequester)
}
}

@Composable
fun RowScope.LeftPanel(
focusRequester: FocusRequester,
onRightDirectionClicked: () -> Unit
) {
LaunchedEffect(Unit) {
this.coroutineContext.job.invokeOnCompletion {
focusRequester.requestFocus()
}
}

Column(
modifier = Modifier
.background(Color.Blue.copy(alpha = 0.1f))
.fillMaxHeight()
.weight(1f)
.onKeyEvent {
if (it.key == Key.DirectionRight) {
onRightDirectionClicked()
true
} else {
false
}
},
verticalArrangement = Arrangement.spacedBy(8.dp),
horizontalAlignment = Alignment.CenterHorizontally
) {
repeat(5) {
Button(
modifier = Modifier
.let { modifier ->
if (it == 0) {
modifier.focusRequester(focusRequester)
} else {
modifier
}
},
onClick = { }
) {
Text(text = "Left Panel: $it")
}
}
}
}

@Composable
fun RowScope.RightPanel(focusRequester: FocusRequester) {
Column(
modifier = Modifier
.background(Color.Green.copy(alpha = 0.1f))
.fillMaxHeight()
.weight(1f),
verticalArrangement = Arrangement.spacedBy(8.dp),
horizontalAlignment = Alignment.CenterHorizontally
) {
val buttons by rememberSaveable { mutableStateOf(List(10) { "Button ${it + 1}" }) }

LazyVerticalGrid(
columns = GridCells.Fixed(2),
modifier = Modifier.padding(16.dp),
verticalArrangement = Arrangement.spacedBy(8.dp)
) {
itemsIndexed(
items = buttons,
key = { idx, _ -> idx }
) { idx, _ ->
Button(
modifier = Modifier
.padding(8.dp)
.let {
if (idx == 0) {
it.focusRequester(focusRequester)
} else {
it
}
}
,
onClick = { }
) {
Text(text = "Right Panel: $idx")
}
}
}
}
}
Вот перевод:

Насколько я понимаю, необходимо запомнить индекс, из которого пользователь переместился на правую панель (скажем, кнопку 3) и отслеживает, когда пользователь нажимает влево. Когда пользователь нажимает влево, запрашивается фокус на сохраненном индексе (в нашем примере 3). Но у меня два вопроса:
  • Как отличить правый клик по элементам в правой панели (например, Правая панель 3 -> Правая панель 2 клик) от нужного клика (например, Правая панель: 6 -> Левая панель 3)?
  • Мне кажется, что такое решение выглядит слишком громоздко, и как-то это должно работать проще.
Любые идеи приветствуются :)

Подробнее здесь: https://stackoverflow.com/questions/786 ... trol-click
Ответить

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

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

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

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

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