#android #kotlin #android-jetpack-compose
Вопрос:
Я пытаюсь установить некоторые различия в сенсорных взаимодействиях на одном экране в проекте создания jetpack. Однако установка pointerFilter
модификатора в контейнер главного экрана автоматически переопределяет любые другие кликабельные составные элементы внутри него. См. Код ниже для примера:
setContent {
val context = LocalContext.current //only to be used in toasts
Box(
modifier = Modifier
.background(Color.Gray)
.fillMaxSize()
.pointerInteropFilter {
if (it.action == MotionEvent.ACTION_UP) {
Toast
.makeText(context, "ENTIRE SCREEN RELEASED!", Toast.LENGTH_SHORT)
.show()
}
true
}
) {
Button(onClick = {
Toast.makeText(context, "BUTTON CLICKED!", Toast.LENGTH_SHORT).show()
}) {
Text(text = "BUTTON")
}
}
}
Выполнение этого в основном приводит к тому, что любая кликабельная композиция не работает, как в примере Button
. Кроме того, обратите внимание, что я рассматриваю Box
его как свой «экран», как только я настрою его на максимальный размер (это лучший способ обрабатывать щелчки по экрану в jetpack compose?).
Затем, как сделать даже весь экран ( Box
?) и его дочерние элементы кликабельными и обрабатывать его события?
Комментарии:
1. Возможно, вы сможете добиться того, чего хотите с
Modifier.pointerInput{}
помощью . Предполагается, что pointerInteropFilter используется для событий движения очень низкого уровня.2. Спасибо за понимание,
pointerInput
хорошо поработали!
Ответ №1:
Особая благодарность @Rafsanjani за его понимание использования модификатора.pointerInput{}.
Чтобы получить решение для обработки событий с несколькими составными элементами, я просто добавил модификаторы следующим образом:
setContent {
val context = LocalContext.current //only to be used in toasts
Box(
modifier = Modifier
.background(Color.Gray)
.fillMaxSize()
.pointerInput(key1 = "someStringKey?") {
detectTapGestures(onPress = {
if (tryAwaitRelease()) {
Toast.makeText(context, "MAIN SCREEN RELEASED!", Toast.LENGTH_SHORT).show()
}
})
}
) {
Button(onClick = {
Toast.makeText(context, "BUTTON CLICKED!", Toast.LENGTH_SHORT).show()
}) {
Text(text = "BUTTON")
}
}
}
Это в основном обрабатывает различные события для Box
(составного, который заполняет максимальный размер) и кнопки.