Мне нужно создать интерфейс, подобный Google Newsstand, который является своего рода ViewPager (горизонтальная прокрутка) над сворачивающимся заголовком (вертикальная прокрутка). Одно из моих требований - использовать новую библиотеку поддержки дизайна, представленную на Google IO 2015. ( http://android-developers.blogspot.ca/2015/05/android-design-support-library.html )
Основываясь на образце, созданном Крисом Бэйнсом ( https://github.com/chrisbanes/cheesesquare ), я достиг точки, в которой я могу выполнять сворачивающееся поведение, но с базовым LinearLayout (без горизонтальной прокрутки).
Я попытался заменить LinearLayout ViewPager и получил пустой экран. Я играл с: шириной, весом и всеми видами групп просмотра, но ... все еще пустой экран. Похоже, ViewPager и NestedScrollView не нравятся друг другу.
Я попробовал обходной путь, используя HorizontalScrollView: он работает, но я теряю преимущества функции PagerTitleStrip и фокусировки на одной панели (я могу остановить горизонтальное перемещение между двумя панелями).
Теперь у меня нет больше идей, может ли кто-нибудь подвести меня к решению ...
Спасибо
Вот мой последний файл макета:
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="@dimen/header_height"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
<android.support.design.widget.CollapsingToolbarLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
app:contentScrim="?attr/colorPrimary"
app:expandedTitleMarginEnd="64dp"
app:expandedTitleMarginStart="48dp"
app:layout_scrollFlags="scroll|exitUntilCollapsed">
<include
layout="@layout/part_header"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_collapseMode="parallax"/>
<android.support.v7.widget.Toolbar
android:id="@+id/activity_main_toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:layout_collapseMode="pin"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>
</android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
<android.support.v4.widget.NestedScrollView
android:id="@+id/activity_main_nestedscrollview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<android.support.v4.view.ViewPager
android:id="@+id/activity_main_viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#FFA0"/>
</android.support.v4.widget.NestedScrollView>
</android.support.design.widget.CoordinatorLayout>
ViewPager
внутрьLinearLayout
? Просто любопытно,ViewPager
правильно ли это отобразит .ViewPager
внутренним элементом вNestedScrollView
качестве единственных макетов - похоже, все работает нормально. Я также смогDrawerLayout
успешно попасть в . Возможно, есть еще один аспект вашего кода, препятствующий желаемой функциональности. Хотите поделиться своими источниками?ViewPager
. Я могу прокручивать просмотры вверх и вниз, а такжеViewPager
влево / вправо.Ответы:
Я встречаюсь с этой проблемой, я решаю ее
setFillViewport (true)
в действии
источник
android:fillViewport="true"
кNestedScrollView
объекту. В документации этот атрибут описывается какDefines whether the scrollview should stretch its content to fill the viewport.
.android:fillViewport="true"
наNestedScrollView
и внутриfragment
у меня ,listView
где я сиделandroid:nestedScrollingEnabled="true"
.. Исправлен скроллинг вопросХорошо, я сделал небольшую демонстрацию с помощью
ViewPager
иNestedScrollView
. Проблема, с которой я столкнулся, заключалась в высотеViewPager
и высотеListView
. Поэтому я немного изменилListView
иViewPager's
измерил высоту.Если кто-то захочет изучить код, вот ссылка: https://github.com/TheLittleNaruto/SupportDesignExample/
Вывод:
источник
NestedScrollView
и используяLinearLayout
вместо него. Каковы были бы преимущества наличияNestedScrollView
более,LinearLayout
если вся цель - прокручивать содержимое в ViewPager? Пожалуйста, поправьте меня, если я ошибаюсь. : x СпасибоДобавьте
android:fillViewport="true"
в свойNestedScrollView
. период.источник
Вместо того, чтобы размещать ViewPager внутри NestedScrollView, сделайте это наоборот.
Поместите NestedScrollView в дочерние представления внутри ViewPager, который по сути является макетом фрагмента. Также очень вероятно, что вам даже не понадобится использовать NestedScrollView, если макет списка вашего фрагмента очень простой.
Примеры макетов
Схема деятельности:
Если вам не нужен TabLayout, вы можете отказаться от LinearLayout и сделать ViewPager автономным. Но обязательно используйте
app:layout_behavior="@string/appbar_scrolling_view_behavior"
атрибуты ViewPager.Макет простого фрагмента:
Макет сложного фрагмента:
Пример приложения: CollapsingToolbarPoc
источник
Были те же проблемы.
Если поместить NestedScrollView вокруг ViewPager, это не сработает.
Что DID работает, так это размещение NestedScrollView внутри макета фрагмента, который я загружаю внутри ViewPager.
источник
вы можете попробовать вот так, viewpager работает нормально, но высота viewpager фиксирована.
я все еще нахожу лучшее решение ... поэтому, пожалуйста, дайте мне знать, что любой момент может сделать это лучше, спасибо
источник
У меня была такая же проблема, и я исправил ее с некоторыми изменениями.
ViewPager
не работает внутриNestedScrollView
. Проще говоря, вашеViewPager
прямое детищеCoordinatorLayout
. Затем содержимое каждого фрагмента ViewPager должно быть заключено вNestedScrollView
. Вот и все.источник
Вам не нужно использовать NestedScrollView, чтобы иметь эффекты параллакса. попробуйте что-то вроде этого:
источник
ViewPager
фрагменты являются эфирнымиRecyclerView
илиNestedScrollView
. Если это не так (напримерListView
), то обходной путь для Lollipop и выше - позвонитьlistView.setNestedScrollingEnabled(true)
У меня был макет с панелью инструментов приложения с NestedScrollView под ним, затем внутри вложенной панели инструментов был LinearLayout, под LinearLayout был пейджер представления. Идея заключалась в том, что LinearLayout внутри NestedScrollView был исправлен - вы могли перемещаться влево / вправо между представлениями пейджера представлений, но это содержимое не перемещалось, по крайней мере , по горизонтали . Вы по-прежнему сможете прокручивать все содержимое по вертикали из-за вложенного представления прокрутки. Это была идея. Поэтому я установил высоту вложенного NestedScrollView на match_parent, заполнил область просмотра, а затем для всех дочерних макетов / ViewPager на wrap_content.
В моей голове это было правильно. Но это не сработало - ViewPager позволял мне перемещаться влево / вправо, но без вертикальной прокрутки, независимо от того, помещалось ли содержимое страницы просмотра под нижнюю часть текущего экрана или нет. Оказывается, это было в основном потому, что ViewPager не уважает wrap_content на своих различных страницах.
Я обошел это, создав подкласс ViewPager, чтобы он менял высоту в зависимости от текущего выбранного элемента, заставляя его вести себя как layout_height = "wrap_content":
Решение было вдохновлено этим ответом . Сработало у меня!
источник
просто поместите эту строку в NestedScrollView
источник
Я удалил NestedScrollView из основного макета и вставил его в качестве родительского элемента во все мои макеты фрагментов , которые должны были загружаться в ViewPager, и эта проблема была решена для меня.
источник
Используйте ниже настроенный класс, чтобы решить вашу проблему. Не забудьте вызвать метод onRefresh () на pagechangelistener.
источник
У меня была аналогичная проблема (но без
CollapsingToolbarLayout
простогоToolbar
+TabLayout
внутриAppBarLayout
). Я хотел, чтобы панель инструментов скрывалась из поля зрения при прокрутке содержимогоViewPager
внутриNestedScrollView
.Мой макет выглядел примерно так:
Этот макет работал не так, как задумано, но я решил это, просто избавившись от него
NestedScrollView
иLinearLayout
вместо этого используя. У меня это сработало сразу на Android Support Library v23.1.0. Вот как закончился макет:PS: На самом деле в моем проекте было два файла макета. Я скопировал и вставил их сюда и попытался структурировать их так, как это будет выглядеть в одном файле. Прошу прощения, если я облажался при копировании, но, пожалуйста, дайте мне знать, если это так, чтобы я мог это исправить.
источник
Следующее должно обеспечить правильную высоту пейджера просмотра. Фрагмент - это первый фрагмент, предоставленный пейджером просмотра.
источник
У меня такое же желание, вложить
ViewPager
внутрьNestedScrollView
. Но и у меня это не работает. В моем случае онViewPager
находится внутри,Fragment
поэтому я могу переключать контент в зависимости от взаимодействия с ящиком. Конечно, AppBar, сворачивание и т. Д. И все новые функции библиотеки поддержки должны работать.Если пользователь вертикально прокручивает страницу в пейджере, я хочу, чтобы другие страницы прокручивались так же, чтобы у пользователя было общее впечатление, будто прокручивается сам пейджер.
Что я сделал и что работает, так это то, что я больше не встраиваю
ViewPager
внутри aNestedScrollView
, вместо этого я встраиваю содержимое содержащихся фрагментов внутрьNestedScrollView
.Затем, в случае прокрутки в одном фрагменте, я сообщаю контейнеру новую позицию прокрутки, в которой он хранится.
Наконец, свайпом влево или вправо, обнаруженным с пейджера (с использованием
addOnPageChangeListener
поиска состояний перетаскивания), я сообщаю целевому левому или правому фрагменту, где он должен прокручиваться (на основе сведений о контейнере) для выравнивания из фрагмента, из которого я пришел.источник
Я знаю одно рабочее решение: вы используете Activity с CoordinatorLayout и используете FrameLayout, контейнер. Затем. используйте диспетчер фрагментов, чтобы поместить фрагмент в контейнер. Например, мой код:
И фрагмент:
Затем используйте FragmentManager
источник
LinearLayout
внутри макета фрагмента здесь нет необходимости. См. Мой ответ, я использовалLinearLayout
вместо aFrameLayout
в макете моей деятельности, а корнем моего фрагмента является ViewPager (без обертки макета).Проведя часы, пробуя все вышеперечисленные предложения, наконец, я заставил их работать. Ключ положить
NestedScrollView
внутрьPageViewer
, и установитьlayout_behavior
в'@string/appbar_scrolling_view_behavior'
течение ДВУХ взглядов. Окончательный макет похож наисточник
вы просто удалили NestedScrollView в своем xml и добавили этот код в свой класс
yourGridView.setNestedScrollingEnabled(true);
источник
На самом деле NestedScrollView не обязательно должен быть прямым родственником CollapsingToolbarLayout в CoordinatorLayout. Я добился чего-то действительно причудливого. Appbar_scrolling_view_behavior работает в двух вложенных фрагментах.
Схема моей деятельности:
В "контейнере" frameLayout я раздул этот фрагмент:
И фрагменты внутри этого ViewPager выглядят так:
Тот факт, что NestedScrollView может быть настолько глубоко в иерархии дочерних элементов CoordinatorLayout, и поведение прокрутки, которое все еще работает, меня удивило.
источник