Nestedscrollview vs scrollview android

android: ScrollView vs NestedScrollView

в чем разница между ScrollView и NestedScrollView на самом деле ? Я использовал их обоих. Оба они, extend FrameLayout . Я хочу знать подробно плюсы и минусы обоих из них. Если кто-нибудь может мне помочь. Спасибо.

4 ответов:

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

вот тут NestedScrollView приходит.

NestedScrollView это просто как представление ScrollView, но он поддерживает исполняющий обязанности оба вложенных прокрутки родителя и ребенка на новых и старых версиях из Андроида. Вложенная прокрутка включена по умолчанию.

ScrollView

контейнер макета для просмотра иерархия, которую можно прокрутить с помощью пользователь, что позволяет ему быть больше, чем физический дисплей. Один ScrollView-это FrameLayout, то есть вы должны поместить в него одного ребенка содержащий все содержимое для прокрутки; этот ребенок может быть менеджер компоновки со сложной иерархией объектов

в дополнение к вложенные прокрутки NestedScrollView добавлена одна основная функциональность, которая может даже сделать его интересным вне вложенных контекстов: он имеет встроенную поддержку OnScrollChangeListener . Добавление OnScrollChangeListener в оригинале ScrollView ниже API 23 требуются подклассы ScrollView или возиться с ViewTreeObserver на ScrollView что часто означает даже больше работы, чем подклассы. С NestedScrollView Это можно сделать с помощью строить-в сеттер.

помимо преимуществ, перечисленных в приведенных ответах, еще одним преимуществом NestedScrollView над ScrollView является его совместимость с CoordinatorLayout. ScrollView не взаимодействует с CoordinatorLayout. Вы должны использовать NestedScrollView, чтобы получить «прокрутку вне экрана» поведение для панели инструментов.

Источник

Android: ScrollView vs NestedScrollView

В чем разница между ScrollView и NestedScrollView ? Я использовал их оба. Оба они расширяют FrameLayout . Я хочу подробно узнать о них обоих и обойтись. Если кто-нибудь может мне помочь. Благодарю.

NestedScrollView как следует из названия, используется, когда существует необходимость просмотра прокрутки в другом прокручиваемом представлении. Обычно это было бы сложно выполнить, поскольку система не смогла бы решить, какой вид прокрутки.

Здесь находится NestedScrollView .

Проверьте этот пример.

NestedScrollView

NestedScrollView похож на ScrollView, но он поддерживает как родительский, так и дочерний вложенные прокрутки на обеих новых и старых версиях Android. Вложенная прокрутка включена по умолчанию.

ScrollView

Контейнер компоновки для иерархии представлений, которая может быть прокручена пользователем, что позволяет ей быть больше физического дисплея. ScrollView – это FrameLayout, что означает, что вы должны поместить в него одного ребенка, содержащего все содержимое для прокрутки; Этот ребенок сам может быть менеджером компоновки со сложной иерархией объектов

В дополнение к вложенной прокрутке NestedScrollView добавлена ​​одна из основных функций, которая может даже сделать ее интересной вне вложенных контекстов: она имеет встроенную поддержку OnScrollChangeListener . Добавление OnScrollChangeListener в исходный ScrollView ниже API 23 требует подкласса ScrollView или ScrollView с ViewTreeObserver ScrollView что часто означает еще большую работу, чем подклассы. С помощью NestedScrollView это можно сделать с помощью встроенного setter .

Читайте также:  Гитар про для андроид с табами

Источник

Tutorialwing

Hello Readers! In this post, we are going to learn about how to use android nestedScrollView widget in any android application. We will also go through different attributes of nestedScrollView widget that can be used to customise it.

Output

Tutorialwing Android NestedScrollView Output

Tutorialwing Android NestedScrollView Output

Getting Started

NestedScrollView widget can be defined as below –

As the Name suggests, NestedScrollView is a widget that are used when we want to implement scrollable view inside another scrollable view.

Normally, it is difficult to implement scrollable view inside another scrollable view because system would be unable to decide which view to scroll. This is where NestedScrollView comes in.

Attributes of Android NestedScrollView Widget

Attributes of nestedScrollView is same as scrollView. It is a support v4 widget that runs on old version of android as well. It is added in api 22.

Example of Android NestedScrollView Widget

At first, we will create android application. Then, we will use nestedScrollView widget in this application.

1. Creating New Project

Follow steps below to create new project. Please ignore the steps if you have already created a new application.

Step Description
1. Open Android Studio.
2. Go to File => New => New Project. Write application name as NestedScrollView. Then, click next button.
3. Select minimum SDK you need. However, we have selected 17 as minimum SDK. Then, click next button
4. Then, select Empty Activity => click next => click finish.
5. If you have followed above process correctly, you will get a newly created project successfully. However, you can also visit post to create a new project to know steps in detail.

Now, we will modify xml and java file to use nestedScrollView widget in the application.

2. Modify Values folder

Open res/values/strings.xml file. Then, add below code into it.

3. Download Drawable Resources Needed

You will need some images, stored in res/drawable folder, to be used in the application. These drawable images will be used by views inside nestedScrollView widget in the application.

4. Use NestedScrollView Widget in xml file

Open res/layout/activity_main.xml file. Then, add below code into it.

In activity_main.xml file, we have defined nestedScrollView inside scrollView. Using nestedScrollView, we have defined scrollable view inside another scrollable view. It is used same as scrollView i.e. It can contain only one direct child. Note that we have defined linearLayout inside nestedScrollView as a direct child. Then, we have defined view to be scrolled inside it. All the imageViews have been defined inside scrollView.

5. Access NestedScrollView Widget in java file

Open src/main/java/com.tutorialwing.nestedscrollview/MainActivity.java file. Then, add below code into it.

We have changed nothing in MainActivity. So, it is as it was after creating project.

Since AndroidManifest.xml file is very important in any android application, we are also going to see the content inside this file.

AndroidManifest.xml

Code inside src/main/AndroidManifest.xml file is as below –

When we run the program, we will get output as shown above.

Читайте также:  Ассасин крид ревелейшен для андроид

That’s end of tutorial on Android NestedScrollView widget.

Источник

На SDK надейся и сам не плошай: Проблема вложенных скроллов в BottomSheetBehavior

Наверное, каждый, любуясь красивыми и магически плавно съезжающими в разные стороны окошками, тулбарами и остальными вьюхами, задумывался как это работает, наверное, даже что-то читал про CoordianatorLayout, про различные Behaivor, которые позволяют создавать буквально волшебство на андроидовских вьюхах. Конечно, можно писать кастомные вьюхи, с нужным поведением, которое может быть ограничено только твоим воображением или твоими знаниями в Android разработке. Но помимо этого, есть ещё одно ограничение — время, не будешь же ты писать кастомную вьюху на хакатоне, в горящем по срокам проекте, а написанные заранее решения с кастомными вьюхами могут быть освоены не за самый короткий срок членами команды. Именно тогда приходит самое простое и самое логичное решение проблемы — не выпендриваться, использовать стандартные инструменты Android, там же смышлённые ребята сидят, всё будет в шоколаде (ну или в других сладостях андроида).

Но не всё так просто, тут и начинается моё близкое знакомство с магией таких ребят, как CoordinatorLayout, BottomSheetBehavior, а точнее с багом, который выпустили из виду разработчики, когда их писали. В статье будет описан процесс выявления бага, связанного с вложенной прокруткой внутри view-компонентов с поведением BottomSheetBehavior, а также способы его решения.

Первая встреча

Передо мной стояла задача сделать несложный функционал с вложенной прокруткой, состоящей из горизонтального RecyclerView, ScrollView и CoordinatorLayout, именно он позволяет, ориентируясь на Behavior-ы вложенных вьюх, вытворять такие фигуры высшего пилотажа, как плавные произвольные сдвиги различных вью.

Разложим по полочкам: делаем корневой CoordinatorLayout, внутри которого, находится RecyclerView, с прописанным поведением из библиотеки android.material BottomSheetBehavior, что позволит нашему ресайклеру, выезжать снизу корневого вью или обратно туда сворачиваться. Внутри item-ов каждого, находится TextView — заголовок item-а, и NestedScrollView, с различным наполнением (допустим тот же TextView).

Почему NestedScrollView? Потому что он, согласно официальной документации Android, выполняет ту же функцию, что ScrollView, но помимо этого поддерживает вложенную прокрутку, как со стороны родительской, так и со стороны дочерней вьюхи, по умолчанию.

Накидали вьюхи на layout, написали своих наследников RecyclerView.Adapter и RecyclerView.ViewHolder, сделали модели данных, заглушки, кажется всё готово.

Итак, камера, мотор, и… Всё работает? Шторка выезжает и сворачивается, NestedScrollView крутится, в чём подвох? Перелистываем recycler на другой item, пробуем скроллить… Не работает… Прокрутим ещё на несколько item-ов дальше, снова работает, и так продолжается с точной периодичностью в несколько item-ов. Кто знаком с идеей работы RecyclerView, уже знает в чём дело — дело в грязных View, которые Recycler переиспользует, чтобы экономить ресурсы смартфона. Но это не совсем то, из-за чего может не скроллится NestedScrollView, начинаем расследование.

Пробуем отлавливать события

Первое что, пришло мне в голову — посмотреть какие события приходят в рабочем item-е и в нерабочем. Попробуем отлавливать события onScrollChange:

В первом item всё ок, а вот в остальных тишина… Тогда пробуем, кое-что поинтереснее, а именно перехватывать касания:

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

Читайте также:  The powder toy для андроид

Ищем перехватчика

Как мы знаем, все события поступают не сразу в дочернюю вьюху, а сначала проходят через все родительские. Что от нас требуется? Найти ту вьюху, в которой появляются пропадающие в NestedScrollView события OnTouch. Пробуем слушать события в корневой вьюхе item-а:

Без изменений. Идём выше, пробуем перехватить в самом recycler, картина не меняется, однозначно приходят не все события. Проверяем самого главного парня: CoordinatorLayout, и тут есть пробитие — события приходящие из работающего item-а, такие же как из неработающего.

Но как известно, сам по себе CoordinatorLayout, мало чего умеет, он может только отлавливать поведение дочерних компонентов, нет поведения — CoordinatorLayout, грубо говоря, равен FrameLayout. И тут мы вспоминаем, что как раз назначили RecyclerView поведение из библиотеки material — BottomSheetBehavior. Следовало быть, он тот, кого мы и искали.

BottomSheetBehavior

Что из себя представляет BottomSheetBehavior в двух словах — java класс, наследуемый от CoordinatorLayout.Behavior, предоставляющий инструкции по поведению дочерней вьюхи внутри родительской (CoordinatorLayout). Чтобы разобраться, что и как вызывается, было бы неплохо залогировать все методы этого класса. Как это сделать? Наследуем от BottomSheetBehavior собственный класс TestBehavior, переопределяем, все методы, оставляя внутри логи и вызовы методов супер-класса. Подставляем в RecyclerView новое поведение.

Запускаем и смотрим логи. В рабочем item-е приходят следующие события: onInterceptTouchEvent, onStartNestedScroll, onNestedPreScroll, onNestedScroll, onStopNestedScroll. В нерабочем: onInterceptTouchEvent, onStartNestedScroll, onNestedPreScroll, onStopNestedScroll. Судя по всему, именно в методе onNestedPreScroll происходит заглушение событий. Переходим к методу onNestedPreScroll в классе BottomSheetBehavior и ставим точку остановки, запускаем отладчик, и видим, что условие при котором происходит выход из метода:

Итак, что за переменная nestedScrollingChildRef? Слабая ссылка на дочерний View, соответственно в условии осуществляется проверка на соответствие View, которым управляет CoordinatorLayout и View, для которого поступило событие.

Смотрим инициализацию и понимаем, что объект инициализируется только при единственном вызове метода onLayoutChild:

И тут вспоминаем про Recycler, про то, что при каждом пролистывании обновляется просматриваемый item, следственно отображается другое View, а ссылка внутри BottomSheetBehavior, все ещё ссылается на первую вьюху, именно поэтому, когда первая View переиспользуется, то скролл происходит, когда используется другая — нет. Причина найдена, пробуем исправить проблему.

Исправление

Что нужно, чтобы всё начало работать? Нужно как-то обновлять ссылку на текущую view в Recycler-е, например сделать метод, который будет обновлять значение ссылки, но так как BottomSheetBehavior это класс, который недоступен для редактирования и поле является приватным, у нас есть два выбора: написать собственную реализацию этого класса (например: скопировав полностью класс, добавив свой метод) или использовать Java Reflection API. Оба варианта выглядят неочень, но выкручиваться надо.

Java Reflection API

Решение с Java Reflection API, через того же наследника TestBeahvior, получаем приватное поле в Runtime и меняем его значение, единственное, что надо учесть, менять поле лучше всего в методе onStartNestedScroll, перед проверкой в onNestedPreScroll.

Копипаст

Тут всё просто, копируем класс BottomSheetBehavior, дописываем private метод refreshNestedScrollingChildRef, который будет обновлять содержимое объекта ссылки, вызываем этот метод в методе onStartNestedScroll. Готово, всё работает.

Заключение

Разработчики системы Android предоставляют множество классных и хорошо работающих инструментов, однако это не значит, что все они будут работать идеально. Всегда можно найти кейс при котором, стандартный инструмент не будет работать, как и в моём случае.

Источник

Оцените статью