Necesito crear una interfaz como Google Newsstand, que es una especie de ViewPager (desplazamiento horizontal) sobre un encabezado que se contrae (desplazamiento vertical). Uno de mis requisitos es utilizar la nueva biblioteca de soporte de diseño presentada en Google IO 2015. ( http://android-developers.blogspot.ca/2015/05/android-design-support-library.html )
Basado en la muestra creada por Chris Banes ( https://github.com/chrisbanes/cheesesquare ) he llegado al punto en que puedo hacer el comportamiento de colapso pero con un LinearLayout básico (sin desplazamiento horizontal).
Intenté reemplazar LinearLayout por un ViewPager y me salió una pantalla en blanco. Jugué con: ancho, peso y todo tipo de grupos de vista, pero ... todavía una pantalla en blanco. Parece que ViewPager y NestedScrollView no se gustan entre sí.
Probé una solución alternativa utilizando HorizontalScrollView: funciona pero pierdo el beneficio de la función PagerTitleStrip y el enfoque en un solo panel (puedo detener el horizontal entre 2 paneles).
Ahora no tengo más ideas, si alguien me puede llevar a una solución ...
Gracias
Aquí está mi último archivo de diseño:
<?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
interiorLinearLayout
? Solo tengo curiosidad por saber si eso representaríaViewPager
correctamente.ViewPager
interiorNestedScrollView
como los únicos diseños; parecía funcionar bien. También pude entrar conDrawerLayout
éxito en un . Quizás haya otro aspecto de su código que impida la funcionalidad que desea. ¿Le gustaría compartir más de su fuente?ViewPager
. Puedo desplazar las vistas hacia arriba y hacia abajo, así como desplazarme hacia laViewPager
izquierda / derecha.Respuestas:
Encuentro este problema, lo resuelvo por
setFillViewport (true)
en actividad
fuente
android:fillViewport="true"
alNestedScrollView
objeto. La documentación describe este atributo comoDefines whether the scrollview should stretch its content to fill the viewport.
.android:fillViewport="true"
enNestedScrollView
y dentro delfragment
Tengo un lugarlistView
donde me sentéandroid:nestedScrollingEnabled="true"
. Se solucionó el problema de desplazamientoBien, hice una pequeña demostración con
ViewPager
yNestedScrollView
. El problema que enfrenté fue con la alturaViewPager
y elListView
. Así que hice una pequeña modificación enListView
yViewPager's
de medición de altura.Si alguien desea ver el código, aquí está el enlace: https://github.com/TheLittleNaruto/SupportDesignExample/
Salida:
fuente
NestedScrollView
y usando unLinearLayout
. ¿Cuáles serían los beneficios de tener unNestedScrollView
over aLinearLayout
si todo el propósito es desplazar el contenido dentro de ViewPager? Por favor corrígeme si estoy equivocado. : x GraciasAgregue
android:fillViewport="true"
suNestedScrollView
. período.fuente
En lugar de colocar ViewPager dentro de NestedScrollView, hágalo al revés.
Coloque el NestedScrollView en las Vistas secundarias dentro del ViewPager que, en esencia, es el diseño del Fragmento. También es muy probable que ni siquiera necesite usar NestedScrollView si el diseño de la lista de su Fragmento es muy simple.
Diseños de ejemplo
Diseño de la actividad:
Si no necesita TabLayout, puede deshacerse del LinearLayout y hacer que ViewPager sea independiente. Pero asegúrese de usar
app:layout_behavior="@string/appbar_scrolling_view_behavior"
en los atributos de ViewPager.Diseño de fragmento simple:
Disposición del fragmento complejo:
Aplicación de ejemplo: CollapsingToolbarPoc
fuente
Tuvo los mismos problemas.
Al colocar NestedScrollView alrededor de ViewPager, no funcionaría.
Sin embargo, lo que sí funcionó es poner NestedScrollView dentro del diseño del fragmento que estoy cargando dentro de ViewPager.
fuente
puede intentar así, viewpager funciona bien, pero la altura del viewpager es fija.
todavía estoy encontrando la mejor solución ..., así que por favor avíseme cualquier punto puede hacerlo mejor, gracias
fuente
Tuve el mismo problema y lo solucioné con algunos cambios.
ViewPager
no funciona dentro deNestedScrollView
. Simplemente ponga suViewPager
como un hijo directo de suCoordinatorLayout
. Luego , debe incluirseNestedScrollView
el contenido de cada Fragmento de ViewPager . Eso es.fuente
No es necesario utilizar NestedScrollView para tener los efectos de paralaje. prueba algo como esto:
fuente
ViewPager
fragmentos sean éterRecyclerView
oNestedScrollView
. Si no lo son (por ejemploListView
), entonces una solución para Lollipop y por encima es llamarlistView.setNestedScrollingEnabled(true)
Tenía un diseño con una barra de herramientas de la aplicación con NestedScrollView debajo, luego dentro de la barra de herramientas anidada había un LinearLayout, debajo del LinearLayout había un paginador de vistas. La idea era que el LinearLayout dentro de NestedScrollView se solucionó: se podía deslizar hacia la izquierda o hacia la derecha entre las vistas del paginador de vista, pero este contenido no se movía, al menos horizontalmente . Aún debería poder desplazar todo el contenido verticalmente debido a la vista de desplazamiento anidada. Esa fue la idea. Así que configuré la altura anidada de NestedScrollView en match_parent, llenar la ventana gráfica y luego todos los diseños secundarios / ViewPager en wrap_content.
En mi cabeza eso era correcto. Pero no funcionó: ViewPager me permitió ir a la izquierda / derecha, pero sin desplazamiento vertical, ya sea que el contenido de la página del visor esté debajo de la parte inferior de la pantalla actual o no. Resulta que fue básicamente porque ViewPager no respeta wrap_content en sus diversas páginas.
Resolví esto subclasificando el ViewPager para que cambiara la altura dependiendo del elemento seleccionado actual, forzándolo a comportarse como layout_height = "wrap_content":
La solución se inspiró en esta respuesta . ¡Trabajó para mi!
fuente
simplemente ponga esta línea en NestedScrollView
fuente
Quité NestedScrollView del diseño principal y se inserta como un Padre en todas mis Fragmento diseños que se supone que la carga en ViewPager solucionado este problema para mí.
fuente
Utilice la siguiente clase personalizada para resolver su problema. No olvide llamar al método onRefresh () en pagechangelistener.
fuente
Estaba teniendo un problema similar (pero sin
CollapsingToolbarLayout
, solo un simpleToolbar
+TabLayout
dentro deAppBarLayout
). Quería que la barra de herramientas se desplazara fuera de la vista cuando se desplaza hacia abajo por el contenido deViewPager
dentro deNestedScrollView
.Mi diseño fue algo como esto:
Este diseño no funcionaba como se esperaba, pero lo resolví simplemente deshaciéndome del
NestedScrollView
y usando unLinearLayout
. Me funcionó de inmediato en la biblioteca de soporte de Android v23.1.0. Así es como terminó el diseño:PD: Estos eran en realidad dos archivos de diseño en mi proyecto. Los copié y pegué aquí e intenté estructurarlos como se vería en un solo archivo. Lo siento si cometí un error mientras copiaba y pegaba, pero avíseme si ese es el caso para que pueda solucionarlo.
fuente
Lo siguiente debería garantizar la altura adecuada del buscapersonas de vista. El fragmento es el primer fragmento proporcionado por el paginador de vistas.
fuente
Tengo el mismo deseo, anidar un
ViewPager
interior aNestedScrollView
. Pero tampoco me funciona. En mi caso, elViewPager
está dentro de unaFragment
para que pueda cambiar el contenido según las interacciones con el cajón. Por supuesto, AppBar, collapse, etc. y todas las funciones nuevas de la biblioteca de soporte deben funcionar.Si un usuario se desplaza verticalmente por una página en el localizador, quiero que otras páginas se desplacen de la misma manera, para darle al usuario la impresión general de que el propio localizador se desplazó.
Lo que hice, que funciona, es que ya no incrusto el
ViewPager
interior de aNestedScrollView
, sino que incrusto el contenido de los fragmentos contenidos dentro de unNestedScrollView
.Luego, en el caso de un desplazamiento en un fragmento, informo al contenedor de la nueva posición de desplazamiento, que lo almacena.
Finalmente, en un deslizamiento hacia la izquierda o hacia la derecha detectado desde el buscapersonas (usando la
addOnPageChangeListener
búsqueda de estados de arrastre), le informo al fragmento de la izquierda o la derecha del objetivo dónde debe desplazarse (según el conocimiento del contenedor) para alinearse con el fragmento del que vengo.fuente
Conozco una solución de trabajo: usa Activity, con CoordinatorLayout y usa FrameLayout, container. Luego. use el administrador de fragmentos para poner el fragmento en el contenedor. Por ejemplo mi código:
Y fragmento:
Entonces usa FragmentManager
fuente
LinearLayout
diseño dentro del Fragmento es innecesario aquí. Vea mi respuesta, utilicé a enLinearLayout
lugar de aFrameLayout
en el diseño de mi actividad, y la raíz de mi fragmento es un ViewPager (sin diseño de envoltura).Después de pasar horas probando todas las sugerencias anteriores, finalmente lo hice funcionar. La clave es poner
NestedScrollView
en el interiorPageViewer
, y ajustelayout_behavior
a'@string/appbar_scrolling_view_behavior'
para AMBOS vistas. El diseño final es comofuente
acaba de eliminar el NestedScrollView en su xml y agrega este código en su clase
yourGridView.setNestedScrollingEnabled(true);
fuente
En realidad, NestedScrollView no necesita ser hermano directo de CollapsingToolbarLayout en CoordinatorLayout. He logrado algo realmente extraño. Appbar_scrolling_view_behavior funciona en 2 fragmentos anidados.
Diseño de mi actividad:
En el "contenedor" frameLayout he inflado este fragmento:
Y los fragmentos dentro de ese ViewPager se ven así:
El hecho de que NestedScrollView pueda estar tan profundo en la jerarquía de niños de CoordinatorLayout y los comportamientos de desplazamiento todavía funcionan me sorprendió.
fuente