ViewPager en un NestedScrollView

111

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>
Kyso84
fuente
¿Ha intentado envolver su ViewPagerinterior LinearLayout? Solo tengo curiosidad por saber si eso representaría ViewPagercorrectamente.
CzarMatt
Sí, lo intenté pero sigue siendo el mismo resultado. Hice muchas pruebas con muchos componentes, pero ViewPager nunca se representa en NestedScrollView sin importar la jerarquía
Kyso84
Acabo de crear una aplicación de prueba con un ViewPagerinterior NestedScrollViewcomo los únicos diseños; parecía funcionar bien. También pude entrar con DrawerLayouté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?
CzarMatt
Vaya, ¿entonces puedes deslizar el dedo hacia la izquierda / derecha y hacia arriba / abajo? Simplemente uso un FragmentPagerAdapter para mostrar fragmentos en mi buscapersonas. ¿Puedes compartir tu código de muestra en su lugar?
Kyso84
Pegué un diseño de ejemplo simple aquí: pastebin.com/jXPw6mtf Editar: Puede cargar cualquier fragmento que desee en el archivoViewPager . Puedo desplazar las vistas hacia arriba y hacia abajo, así como desplazarme hacia la ViewPagerizquierda / derecha.
CzarMatt

Respuestas:

128

Encuentro este problema, lo resuelvo por setFillViewport (true)

<android.support.v4.widget.NestedScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:id="@+id/nest_scrollview"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context="mio.kon.yyb.nestedscrollviewbug.ScrollingActivity"
tools:showIn="@layout/activity_scrolling">


    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

en actividad

  NestedScrollView scrollView = (NestedScrollView) findViewById (R.id.nest_scrollview);
    scrollView.setFillViewport (true);

ingrese la descripción de la imagen aquí

mio4kon
fuente
31
Tenga en cuenta que esto también se puede configurar en XML, solo agregue android:fillViewport="true"al NestedScrollViewobjeto. La documentación describe este atributo como Defines whether the scrollview should stretch its content to fill the viewport..
Krøllebølle
7
Esto no resuelve el problema de desplazamiento en los fragmentos de marcador de posición
Atieh
3
¡Gracias! Me senté android:fillViewport="true"en NestedScrollViewy dentro del fragmentTengo un lugar listViewdonde me senté android:nestedScrollingEnabled="true". Se solucionó el problema de desplazamiento
radubogdan
@ Krøllebølle NestedScrollView no tiene este atributo, debe configurarlo mediante programación.
Sí, esto funciona para mí. Tengo un problema cuando configuro la altura de viewpager en match_parent dentro de NestedScrollView, no mostraba las vistas.
Waheed Nazir
71

Bien, hice una pequeña demostración con ViewPagery NestedScrollView. El problema que enfrenté fue con la altura ViewPagery el ListView. Así que hice una pequeña modificación en ListViewy ViewPager'sde medición de altura.

Si alguien desea ver el código, aquí está el enlace: https://github.com/TheLittleNaruto/SupportDesignExample/

Salida:

ingrese la descripción de la imagen aquí

TheLittleNaruto
fuente
no funciona, si el fragmento no tiene vista de lista, incluso para la vista de lista está funcionando si el número de recuento de elementos es el mismo para todos los fragmentos.
Pankaj Arora
3
Puede que llegue un poco tarde a la fiesta, pero estaba trabajando en esto hoy, y lo tengo (principalmente) trabajando para agregar la aplicación: layout_behavior = "@ string / appbar_scrolling_view_behavior" tanto en ViewPager como en la vista principal de cada Fragmento.
Graeme
1
No hay duda de que esto funciona, pero ¿no complica demasiado el problema? Resolví esto deshaciéndome del NestedScrollViewy usando un LinearLayout. ¿Cuáles serían los beneficios de tener un NestedScrollViewover a LinearLayoutsi todo el propósito es desplazar el contenido dentro de ViewPager? Por favor corrígeme si estoy equivocado. : x Gracias
Calambres
1
Muchas gracias! Estuve a punto de tirarme de los pelos y su WrapContentHeightViewPager funciona a la perfección. ¡Te debo una!
Mavamaarten
1
Solución perfecta. Gracias. Funcionó para mí .. :)
Mrunal
42

Agregue android:fillViewport="true"su NestedScrollView. período.

Sujit Yadav
fuente
3
resuelve el problema, pero la altura del visor será el padre coincidente (toma la altura de toda la página).
Manukumar
27

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:

<?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"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true">

    <android.support.design.widget.AppBarLayout
        android:id="@+id/app_bar"
        android:layout_width="match_parent"
        android:layout_height="@dimen/app_bar_height"
        android:fitsSystemWindows="true"
        android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.design.widget.CollapsingToolbarLayout
            android:id="@+id/toolbar_layout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:fitsSystemWindows="true"
            app:contentScrim="?attr/colorPrimary"
            app:layout_scrollFlags="scroll|exitUntilCollapsed|snap">

            <ImageView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:minHeight="@dimen/app_bar_height"
                android:scaleType="centerCrop"
                android:src="@drawable/my_bg"
                app:layout_collapseMode="parallax"
                app:layout_collapseParallaxMultiplier="0.8"
                app:layout_scrollFlags="scroll|enterAlways|enterAlwaysCollapsed" />

            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                app:layout_collapseMode="pin"
                app:popupTheme="@style/AppTheme.PopupOverlay" />

        </android.support.design.widget.CollapsingToolbarLayout>

    </android.support.design.widget.AppBarLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">

        <android.support.design.widget.TabLayout
            android:id="@+id/content_tabs"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <android.support.v4.view.ViewPager
            android:id="@+id/viewPager"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1" />
    </LinearLayout>

</android.support.design.widget.CoordinatorLayout>

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:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/recycler_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

Disposición del fragmento complejo:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.NestedScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:fillViewport="true"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <android.support.v7.widget.RecyclerView
            android:id="@+id/recycler_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Hello World"/>
    </RelativeLayout>
</android.support.v4.widget.NestedScrollView>

Aplicación de ejemplo: CollapsingToolbarPoc

ingrese la descripción de la imagen aquí

Ino
fuente
Este es el que lo hizo por mí. ¡Gracias!
rjr-apps
Hola Ino, esto parece estar funcionando, pero cuando agrego una vista más en la parte superior del TabLayout, se rompe. ¿Podrías ayudarme?
hushed_voice
Me has salvado los días. :)
androidXP
20

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.

<android.support.v4.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">
        <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@id/fragment_detail"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_gravity="fill_vertical"
            android:orientation="vertical">
    ...Content...
    </LinearLayout>
</android.support.v4.widget.NestedScrollView>

ThemBones
fuente
¿Funciona si el contenido era un diseño de coordinador con otro NestedScrollView? ¿Y el CoordinatorLayout padre escucha los eventos de desplazamiento allí?
Atieh
Esto funciona para mí. Agrego NestedScrollView a cada elemento de mi ViewPager en lugar de ViewPager. Gracias.
jerogaren
Tengo swipefreshlayout en un fragmento, de acuerdo con su solución, puse NestedScrollview en un fragmento, arriba de swipeRefreshLayout .. entonces los datos no se están cargando. No funcionó.
Palak Darji
16

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

<android.support.v4.widget.NestedScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:minHeight="800dp"
        android:orientation="vertical">

        <android.support.v4.view.ViewPager
            android:id="@+id/pager"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"/>
    </LinearLayout>
</android.support.v4.widget.NestedScrollView>
Pablo
fuente
¿Intentó encapsularlo en un "android.support.design.widget.CoordinatorLayout" y una barra de herramientas que se colapsa?
Kyso84
Tus soluciones parecen demostrar que el problema está en la altura. ¿Encontraste alguna mejora todavía @Paul?
jasxir
3
Este funcionó para mí, pero también tuve que llamar a setFillViewport (verdadero) en la vista anidada.
larrytech
12

Tuve el mismo problema y lo solucioné con algunos cambios. ViewPagerno funciona dentro de NestedScrollView. Simplemente ponga su ViewPagercomo un hijo directo de su CoordinatorLayout. Luego , debe incluirseNestedScrollView el contenido de cada Fragmento de ViewPager . Eso es.

BST Kaal
fuente
incluso si el contenido era un diseño de coordinador con otro NestedScrollView?
Atieh
1
Los datos de la vista de lista de fragmentos no se cargan de esta manera.
Palak Darji
5

No es necesario utilizar NestedScrollView para tener los efectos de paralaje. prueba algo como esto:

<android.support.design.widget.CoordinatorLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:animateLayoutChanges="true">

        <android.support.v7.widget.Toolbar
            android:id="@+id/my_toolbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:layout_scrollFlags="scroll|enterAlways"/>

        <android.support.design.widget.TabLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/my_tab_layout"
            android:fillViewport="false"
            app:tabMode="fixed"/>
     </android.support.design.widget.AppBarLayout>

            <android.support.v4.view.ViewPager
                android:id="@+id/my_view_pager"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                app:layout_behavior="@string/appbar_scrolling_view_behavior"/>

</android.support.design.widget.CoordinatorLayout>
Pedro Henrique
fuente
3
Esto funcionará, siempre que todos tus ViewPagerfragmentos sean éter RecyclerViewo NestedScrollView. Si no lo son (por ejemplo ListView), entonces una solución para Lollipop y por encima es llamarlistView.setNestedScrollingEnabled(true)
AndyDeveloper
¡finalmente algo que funciona sin agregar un contenedor de desplazamiento adicional! Por cierto, también puede configurar este setNestedScrollingEnabled (true) en xml: android: nestedScrollingEnabled = "true"
Analizador
1
Si ejecuto mi aplicación, contraigo la barra de herramientas mientras está en una pestaña, cambio de pestaña, luego jalo la barra de herramientas hacia abajo, está vacía. Tiene que cambiar de pestaña mientras está en estado no contraído para recuperarlo. Tan cerca, pero tan lejos :(
yo--
4

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":

public class ContentWrappingViewPager extends ViewPager {

    public ContentWrappingViewPager(Context context) {
        super(context);
    }

    public ContentWrappingViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

        int height = 0;
        if (getChildCount() > getCurrentItem()) {
            View child = getChildAt(getCurrentItem());
            child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
            int h = child.getMeasuredHeight();
            if(h > height) height = h;
        }

        heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);

        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }
}

La solución se inspiró en esta respuesta . ¡Trabajó para mi!

Breeno
fuente
pero la vista de desplazamiento se desplaza automáticamente hacia la parte superior? Cómo arreglar esto ?
Vivek Kumar
4

simplemente ponga esta línea en NestedScrollView

android:fillViewport="true"
gholam
fuente
Muchísimas gracias. ¿Qué hacer si quiero desplazarme tocando CollapsingToolbarLayout directamente?
Pratik Saluja
3

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í.

Riddhish Ojha
fuente
3

Utilice la siguiente clase personalizada para resolver su problema. No olvide llamar al método onRefresh () en pagechangelistener.

public class ContentWrappingViewPager extends ViewPager
{
    private int width = 0;
    public ContentWrappingViewPager(Context context) {
        super(context);
    }

    public ContentWrappingViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
    {
        int height = 0;
        width = widthMeasureSpec;
        if (getChildCount() > getCurrentItem()) {
            View child = getChildAt(getCurrentItem());
            child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
            int h = child.getMeasuredHeight();
            if(h > height) height = h;
        }

        heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);

        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

    public void onRefresh()
    {
        try {
            int height = 0;
            if (getChildCount() > getCurrentItem()) {
                View child = getChildAt(getCurrentItem());
                child.measure(width, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
                int h = child.getMeasuredHeight();
                if(h > height) height = h;
            }

            int heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
            ViewGroup.LayoutParams layoutParams = this.getLayoutParams();
            layoutParams.height = heightMeasureSpec;
            this.setLayoutParams(layoutParams);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
Kuldeep Sakhiya
fuente
2

Estaba teniendo un problema similar (pero sin CollapsingToolbarLayout, solo un simple Toolbar+ TabLayoutdentro de AppBarLayout). Quería que la barra de herramientas se desplazara fuera de la vista cuando se desplaza hacia abajo por el contenido de ViewPagerdentro de NestedScrollView.

Mi diseño fue algo como esto:

<android.support.design.widget.CoordinatorLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">

        <android.support.design.widget.AppBarLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:animateLayoutChanges="true">

            <android.support.v7.widget.Toolbar
                android:id="@+id/my_toolbar"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:layout_scrollFlags="scroll|enterAlways"/>

            <android.support.design.widget.TabLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:id="@+id/my_tab_layout"
                android:fillViewport="false"
                app:tabMode="fixed"/>
         </android.support.design.widget.AppBarLayout>

         <android.support.v4.widget.NestedScrollView
                android:id="@+id/container"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:fillViewport="true"
                android:layout_gravity="fill_vertical"
                app:layout_behavior="@string/appbar_scrolling_view_behavior">

                <android.support.v4.view.ViewPager
                    android:id="@+id/my_view_pager"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                     app:layout_behavior="@string/appbar_scrolling_view_behavior">
                </android.support.v4.view.ViewPager>
         </android.support.v4.widget.NestedScrollView>

</android.support.design.widget.CoordinatorLayout>

Este diseño no funcionaba como se esperaba, pero lo resolví simplemente deshaciéndome del NestedScrollViewy usando un LinearLayout. Me funcionó de inmediato en la biblioteca de soporte de Android v23.1.0. Así es como terminó el diseño:

<android.support.design.widget.CoordinatorLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">

        <android.support.design.widget.AppBarLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:animateLayoutChanges="true">

            <android.support.v7.widget.Toolbar
                android:id="@+id/my_toolbar"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:layout_scrollFlags="scroll|enterAlways"/>

            <android.support.design.widget.TabLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:id="@+id/my_tab_layout"
                android:fillViewport="false"
                app:tabMode="fixed"/>
         </android.support.design.widget.AppBarLayout>

         <LinearLayout
            android:orientation="vertical"
            android:id="@+id/container"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginBottom="4dp"
            app:layout_behavior="@string/appbar_scrolling_view_behavior">

                <android.support.v4.view.ViewPager
                    android:id="@+id/my_view_pager"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                     app:layout_behavior="@string/appbar_scrolling_view_behavior">
                </android.support.v4.view.ViewPager>
         </LinearLayout>

</android.support.design.widget.CoordinatorLayout>

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.

Obstáculo
fuente
1

Lo siguiente debería garantizar la altura adecuada del buscapersonas de vista. El fragmento es el primer fragmento proporcionado por el paginador de vistas.

<android.support.v4.widget.NestedScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal">

        <android.support.v4.view.ViewPager
            android:id="@+id/viewPager"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>

        <fragment
            class="com.mydomain.MyViewPagerFragment"
            android:id="@+id/myFragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:visibility="gone"/>

    </LinearLayout>

</android.support.v4.widget.NestedScrollView>
Jon
fuente
1

Tengo el mismo deseo, anidar un ViewPagerinterior a NestedScrollView. Pero tampoco me funciona. En mi caso, el ViewPagerestá dentro de una Fragmentpara 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 ViewPagerinterior de a NestedScrollView, sino que incrusto el contenido de los fragmentos contenidos dentro de un NestedScrollView.

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 addOnPageChangeListenerbú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.

François Perret
fuente
¿Entonces, esencialmente, escribió su propia implementación de ViewPager? ¿Podrías compartir código sobre esto?
joseph
Hice algo similar a esto (si lo entiendo correctamente), que es hacer un diseño lineal en el diseño de su coordinador, que contiene el tablayout (si es necesario) y el visor, en lugar de una vista de desplazamiento anidada. Los propios fragmentos tienen la vista de desplazamiento anidada como elemento raíz. Esto funciona para mí, pero preferiría tener solo una vista de desplazamiento anidada en lugar de repetirla en cada fragmento.
Chris
0

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:

<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:orientation="vertical">

<android.support.design.widget.AppBarLayout
    android:id="@+id/appbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:elevation="0dp">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        app:layout_scrollFlags="scroll|enterAlways"
        android:layout_height="@dimen/toolbar_height"
        android:background="?attr/colorPrimary"
        android:gravity="center">

    </android.support.v7.widget.Toolbar>


</android.support.design.widget.AppBarLayout>

<FrameLayout
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

</FrameLayout>

Y fragmento:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.improvemdia.inmyroom.MainFragment">

<android.support.v4.view.ViewPager
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

Entonces usa FragmentManager

getSupportFragmentManager().beginTransaction()
            .replace(R.id.container, new MainFragment())
            .commit();
rz0
fuente
Creo que el LinearLayoutdiseño dentro del Fragmento es innecesario aquí. Vea mi respuesta, utilicé a en LinearLayoutlugar de a FrameLayouten el diseño de mi actividad, y la raíz de mi fragmento es un ViewPager (sin diseño de envoltura).
Calambres
0

Después de pasar horas probando todas las sugerencias anteriores, finalmente lo hice funcionar. La clave es poner NestedScrollViewen el interior PageViewer, y ajuste layout_behaviora '@string/appbar_scrolling_view_behavior'para AMBOS vistas. El diseño final es como

<CoordinatorLayout>
    <ViewPager app:layout_behavior="@string/appbar_scrolling_view_behavior">
        <NestedScrollView fillViewport="true" app:layout_behavior="@string/appbar_scrolling_view_behavior">
            <Content>...</Content>
        </NestedScrollView>
    </ViewPager>
    <AppBarLayout>...</AppBarLayout>
</CoordinatorLayout>
Tranquilizante
fuente
0

acaba de eliminar el NestedScrollView en su xml y agrega este código en su clase

yourGridView.setNestedScrollingEnabled(true);

Rivaldy Firmansyah
fuente
0

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:

<android.support.design.widget.CoordinatorLayout>

    <android.support.design.widget.AppBarLayout>

            <android.support.design.widget.CollapsingToolbarLayout>

                <include
                    layout="@layout/toolbar"/>

            </android.support.design.widget.CollapsingToolbarLayout>

    </android.support.design.widget.AppBarLayout>

    <FrameLayout
        android:id="@+id/container"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"/>

</android.support.design.widget.CoordinatorLayout>

En el "contenedor" frameLayout he inflado este fragmento:

<android.support.constraint.ConstraintLayout>

    ... some content ...

    <android.support.v4.view.ViewPager/>

    ...

</android.support.constraint.ConstraintLayout>

Y los fragmentos dentro de ese ViewPager se ven así:

<RelativeLayout>

    <android.support.v7.widget.RecyclerView/>

    ....

</RelativeLayout>

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ó.

Alex Mensak
fuente