Интерактивное представление в Compose LazyColumn использует событие прокрутки

#android #android-jetpack-compose

#Android #android-jetpack-compose

Вопрос:

У меня есть композиция LazyColumn , которая содержит AndroidView s, каждая из которых содержит интерактивные и некликабельные представления. При прокрутке некликабельной области ( TextView представления) LazyColumn ее можно прокручивать. Однако при попытке прокрутки, начиная нажимать вниз из области, доступной для просмотра ( Button представления), прокручивать LazyColumn нельзя, как если Button бы оно потребляло событие, не сообщая LazyColumn . Есть ли обходной путь для этого?

Это происходит только при использовании Android View в Compose. Однако, когда элементы являются составными, а не View, он работает так, как ожидалось. То же самое происходит, когда внутри a используется интерактивный составной элемент, RecyclerView который не мешает RecyclerView прокрутке.

Это простая версия того, о чем я говорю:

 LazyColumn {
    items(100) { idx ->
        AndroidView(
            factory = { ctx ->
                LinearLayout(ctx).apply {
                    orientation = LinearLayout.VERTICAL
                    addView(TextView(ctx).apply {
                        text = "Non-clickable view $idx"
                    })
                    addView(android.widget.Button(ctx).apply {
                        text = "Clickable view $idx"
                        setOnClickListener {}
                    })
                }
            }
        )
    }
}
 

Версия Compose: 1.0.5
Версия Kotlin: 1.5.31

Комментарии:

1. Я предлагаю вам сообщить об этом в Compose issue tracker

2. @PhilipDukhov хорошо

3. Когда в списке всего 10 элементов, состоящих только из кнопок, на телефоне среднего размера недостаточно элементов, чтобы добраться до нижней части экрана, чтобы включить прокрутку. Увеличьте число до большего количества, и вы увидите, что прокрутка работает. Если это все еще не работает, вы, должно быть, используете более старую версию Compose. Это было протестировано на 1.1.0-beta03.

4. @Johann спасибо за комментарий, я увеличил число до 100, чтобы сделать вопрос более понятным. Кстати, это всего лишь пример кода, который можно попробовать дома (может быть воспроизведен читателями), в моем фактическом коде больше элементов, каждый элемент выше, чем этот образец.

5. Вы пробовали код, который я опубликовал? Работает ли это на вашем устройстве? Какую версию Compose вы используете?

Ответ №1:

У вас есть две проблемы. Во-первых, у вас недостаточно элементов в списке. В вашем примере кода отображается только 10 элементов. Если вы запустите это на телефоне среднего размера, на экране недостаточно элементов для прокрутки.

Даже после добавления дополнительных элементов вы также должны установить ширину / высоту LazyColumn. Установите для него значение fillMaxSize , в противном случае по умолчанию выполняется перенос на ширину содержимого, которая в вашем случае равна ширине кнопки. Если вы не заполняете ширину и у вас есть только кнопки в списке, вы не сможете прокручивать при прокрутке за пределами кнопок:

 class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        startActivity(intent)

        setContent {
            LazyColumn(modifier = Modifier.fillMaxSize()) {
                items(20) { idx ->
                    AndroidView(
                        factory = { ctx ->
                            LinearLayout(ctx).apply {
                                orientation = LinearLayout.VERTICAL
                                addView(TextView(ctx).apply { text = "Item $idx" })
                                addView(android.widget.Button(ctx).apply { text = "Button"; setOnClickListener {} })
                            }
                        }
                    )
                }
            }
        }
    }
}
 

Комментарии:

1. здесь вы не решаете проблему автора. Речь идет не о LazyColumn том, чтобы не прокручивать правую часть экрана. Речь идет о том, что он не прокручивается, когда начальная точка прокрутки находится на android.widget.Button

2. Я только попытался запустить содержимое setContent вашего кода. В первую очередь вы не должны включать часть activity в свои ответы, поскольку это излишне. В любом случае ваш полный код вообще не компилируется из-за того, что ComponentActivity can only be called from within the same library group prefix после его обновления он AppCompatActivity не решает проблему с автором, как вы можете видеть в этом видео

3. Или, если вы считаете, что для вашего ответа необходимо использовать какой-то определенный тип действия, вы должны объяснить, почему и что требуется для его работы, поскольку на моей машине он не компилируется.

4. Спасибо @PhilipDukhov за доказательство видео, ты потрясающий. @ Johann Кстати, я попробовал новый проект и скопировал-вставил этот код, он волшебным образом работает, не знаю почему, в настоящее время я пытаюсь выяснить, в чем разница между новым проектом и моим существующим проектом, поскольку он не работает в моем существующем проекте.

5. Какую версию Compose вы используете?