ViewPager in un oggetto NestedScrollView


111

Devo creare un'interfaccia come Google Edicola, che è una sorta di ViewPager (scorrimento orizzontale) su un'intestazione comprimibile (scorrimento verticale). Uno dei miei requisiti è utilizzare la nuova Design Support Library presentata al Google IO 2015. ( http://android-developers.blogspot.ca/2015/05/android-design-support-library.html )

Sulla base dell'esempio creato da Chris Banes ( https://github.com/chrisbanes/cheesesquare ) sono arrivato al punto che sono in grado di eseguire il comportamento di compressione ma con un LinearLayout di base (senza scorrimento orizzontale).

Ho provato a sostituire LinearLayout con un ViewPager e ho ottenuto uno schermo vuoto. Ho giocato con: larghezza, peso e tutti i tipi di gruppi di visualizzazione ma .... ancora uno schermo vuoto. Sembra che ViewPager e NestedScrollView non si piacciano.

Ho provato una soluzione alternativa utilizzando un HorizontalScrollView: funziona ma perdo il vantaggio della funzionalità PagerTitleStrip e il focus su un singolo pannello (posso interrompere orizzontalmente tra 2 pannelli).

Adesso non ho più idee, se qualcuno può condurmi a una soluzione ...

Grazie

Ecco il mio ultimo file di layout:

<?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>

Hai provato a avvolgerti ViewPagerall'interno di un LinearLayout? Sono solo curioso se questo renderebbe ViewPagercorrettamente il file.
ZarMatt

Sì, ho provato ma sempre lo stesso risultato. Ho eseguito molti test con molti componenti ma ViewPager non viene mai renderizzato in NestedScrollView, indipendentemente dalla gerarchia
Kyso84

Ho appena creato un'app di test con un ViewPagerinterno NestedScrollViewcome unico layout: sembrava funzionare bene. Sono stato anche in grado di entrare DrawerLayoutcon successo in un file . Forse c'è un altro aspetto del tuo codice che impedisce la funzionalità che desideri. Ti interessa condividere di più la tua fonte?
ZarMatt

Wow, quindi sei in grado di scorrere a sinistra / destra e su / giù? Uso semplicemente un FragmentPagerAdapter per visualizzare i frammenti nel mio cercapersone. Puoi invece condividere il tuo codice di esempio?
Kyso84

Ho incollato un semplice layout di esempio qui: pastebin.com/jXPw6mtf Modifica: puoi caricare qualsiasi frammento desideri nel file ViewPager. Sono in grado di scorrere le visualizzazioni su e giù, nonché scorrere a ViewPagersinistra / destra.
ZarMatt

Risposte:


128

Incontro questo problema, lo risolvo 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"/>

in attività

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

inserisci qui la descrizione dell'immagine


31
Si noti che questo può essere impostato in XML così, basta aggiungere android:fillViewport="true"alla NestedScrollViewoggetto. La documentazione descrive questo attributo come Defines whether the scrollview should stretch its content to fill the viewport..
Krøllebølle

7
Ciò non risolve il problema di scorrimento nei frammenti di segnaposto
Atieh

3
Grazie! Mi sono seduto android:fillViewport="true"sul NestedScrollViewe dentro la fragmentho una listViewin cui mi sono seduto android:nestedScrollingEnabled="true".. Risolto il problema di scorrimento
radubogdan

@ Krøllebølle NestedScrollView non ha questo attributo, devi impostarlo a livello di programmazione.

Sì, questo funziona per me. Ho un problema quando ho impostato l'altezza di viewpager su match_parent all'interno di NestedScrollView non mostrava le viste.
Waheed Nazir

71

Ok, ho fatto una piccola demo con ViewPagere NestedScrollView. Il problema che ho dovuto affrontare era con l'altezza di ViewPagere il ListView. Così ho fatto una piccola modifica su ListViewe ViewPager'smisurazione dell'altezza.

Se qualcuno volesse esaminare il codice, ecco il link: https://github.com/TheLittleNaruto/SupportDesignExample/

Produzione:

inserisci qui la descrizione dell'immagine


non funziona, se il frammento non ha listview, anche per listview funziona se il numero di conteggio degli elementi è lo stesso per tutti i frammenti.
Pankaj Arora

3
Potrei essere un po 'in ritardo per la festa, ma ci stavo lavorando oggi, e ce l'ho (principalmente) lavorando con l'aggiunta di app: layout_behavior = "@ string / appbar_scrolling_view_behavior" sia sul ViewPager che sulla vista genitore di ogni frammento.
Graeme

1
Non c'è dubbio che funziona, ma non è questo a complicare eccessivamente il problema? Ho risolto questo problema eliminando NestedScrollViewe utilizzando LinearLayoutinvece un file . Quali sarebbero i vantaggi di avere un NestedScrollViewover a LinearLayoutse lo scopo fosse quello di scorrere i contenuti all'interno del ViewPager? Per favore correggimi se sbaglio. : x Grazie
Cramps

1
Grazie mille! Ero sul punto di strapparmi i capelli e il tuo WrapContentHeightViewPager funziona a meraviglia. Ti devo un favore!
Mavamaarten

1
Soluzione perfetta. Grazie. Ha funzionato per me .. :)
Mrunal

42

Aggiungi il android:fillViewport="true"tuo NestedScrollView. periodo.


3
risolve il problema ma l'altezza del viewpager sarà il genitore della corrispondenza (prende l'altezza dell'intera pagina).
Manukumar

27

Invece di posizionare ViewPager all'interno di NestedScrollView, fallo al contrario.

Posiziona il NestedScrollView nelle viste figlio all'interno del ViewPager che in sostanza è il layout del frammento. È anche molto probabile che non avrai nemmeno bisogno di usare NestedScrollView se il layout dell'elenco dei frammenti è molto semplice.

Layout di esempio

Layout dell'attività:

<?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>

Se non hai bisogno di TabLayout, puoi abbandonare LinearLayout e rendere ViewPager autonomo. Ma assicurati di usare app:layout_behavior="@string/appbar_scrolling_view_behavior"gli attributi di ViewPager.

Layout del frammento semplice:

<?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" />

Layout del frammento complesso:

<?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>

App di esempio: CollapsingToolbarPoc

inserisci qui la descrizione dell'immagine


Questo è quello che l'ha fatto per me. Grazie!
rjr-apps

Ehi Ino, sembra che funzioni ma quando aggiungo un'altra visualizzazione sopra il TabLayout, si interrompe. Potresti dare qualche aiuto?
hushed_voice

Mi hai salvato i giorni. :)
androidXP

20

Ho avuto gli stessi problemi.

Quando si inserisce NestedScrollView attorno a ViewPager, non funzionerebbe.

Quello che ha funzionato però è mettere il NestedScrollView all'interno del layout del frammento che sto caricando nel 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>


Funziona se il contenuto era un layout coordinatore con un altro NestedScrollView? E il genitore CoordinatorLayout ascolta gli eventi di scorrimento lì?
Atieh

Questo lavoro per me. Aggiungo NestedScrollView a ogni elemento del mio ViewPager invece del ViewPager. Grazie.
jerogaren

Ho swipefreshlayout in fragment, secondo la tua soluzione, ho messo NestedScrollview in fragment, sopra swipeRefreshLayout .. quindi i dati non vengono caricati. Non ha funzionato.
Palak Darji

16

puoi provare in questo modo, viewpager funziona bene, ma l'altezza del viewpager è fissa.

Sto ancora trovando la soluzione migliore ..., quindi fammi sapere che qualsiasi punto può farlo meglio, grazie

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

Hai provato a incapsularlo in un "android.support.design.widget.CoordinatorLayout" e in una barra degli strumenti compressa?
Kyso84

Le tue soluzioni sembrano dimostrare che il problema è in altezza. Hai già trovato miglioramenti @Paul?
jasxir

3
Questo ha funzionato per me, ma ho anche dovuto chiamare setFillViewport (true) su nestedview.
larrytech

12

Ho avuto lo stesso problema e l'ho risolto con alcune modifiche. ViewPagernon funziona all'interno di NestedScrollView. Metti semplicemente il tuo ViewPagerfiglio diretto di tuo CoordinatorLayout. Quindi il contenuto per ogni frammento di ViewPager dovrebbe essere racchiuso in NestedScrollView. Questo è tutto.


anche se il contenuto fosse un layout coordinatore con un altro NestedScrollView?
Atieh

1
I dati della lista dei frammenti non vengono caricati in questo modo!
Palak Darji

5

Non è necessario utilizzare NestedScrollView per avere gli effetti di parallasse. prova qualcosa di simile:

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

3
Questo funzionerà, purché tutti i tuoi ViewPagerframmenti siano etere RecyclerView, o NestedScrollView. Se non lo sono (ad esempio ListView), allora una soluzione alternativa per Lollipop e versioni successive è chiamarelistView.setNestedScrollingEnabled(true)
AndyDeveloper

finalmente qualcosa che funziona senza aggiungere un contenitore a scorrimento extra! A proposito, puoi impostare questo setNestedScrollingEnabled (true) anche in xml: android: nestedScrollingEnabled = "true"
Analizer

1
Se eseguo la mia app, comprimo la barra degli strumenti mentre mi trovavo in una scheda, cambia scheda, quindi tira giù la barra degli strumenti, è vuota. Devo cambiare scheda mentre è in stato non compresso per riaverlo di nuovo. Così vicino, eppure così lontano :(
me--

4

Avevo un layout con una barra degli strumenti dell'app con NestedScrollView sotto di essa, quindi all'interno della barra degli strumenti nidificata c'era un LinearLayout, sotto il LinearLayout c'era un cercapersone della vista. L'idea era che LinearLayout all'interno di NestedScrollView fosse corretto: si poteva scorrere a sinistra / destra tra le viste del cercapersone della vista ma questo contenuto non si spostava, almeno in orizzontale . Dovresti comunque essere in grado di scorrere tutto il contenuto verticalmente grazie alla visualizzazione a scorrimento nidificata. Questa era l'idea. Quindi ho impostato l'altezza di NestedScrollView nidificata su match_parent, riempi la vista, quindi tutti i layout figlio / ViewPager su wrap_content.

Nella mia testa era giusto. Ma non ha funzionato - ViewPager mi ha permesso di andare a sinistra / destra, ma non lo scorrimento verticale, indipendentemente dal fatto che il contenuto della pagina del viewpager fosse spinto sotto la parte inferiore della schermata corrente o meno. Si scopre che era fondamentalmente perché ViewPager non rispetta wrap_content nelle sue varie pagine.

Ho aggirato questo problema creando una sottoclasse del ViewPager per fargli cambiare altezza a seconda dell'elemento attualmente selezionato, costringendolo a comportarsi come 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 soluzione è stata ispirata da questa risposta . Ha funzionato per me!


ma la visualizzazione a scorrimento scorre automaticamente verso l'alto? come risolvere questo problema?
Vivek Kumar

4

basta inserire questa riga in NestedScrollView

android:fillViewport="true"

Grazie mille. Cosa fare se desidero scorrere toccando CollapsingToolbarLayout direttamente?
Pratik Saluja

3

Ho rimosso NestedScrollView dal layout principale e inserito come Parent in tutti i miei layout Fragment che dovevano essere caricati in ViewPager ha risolto questo problema per me.


3

Usa la seguente classe personalizzata per risolvere il tuo problema. Non dimenticare di chiamare il metodo onRefresh () su 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();
        }
    }
}

2

Stavo avendo un problema simile (ma senza CollapsingToolbarLayout, solo un semplice Toolbar+ TabLayoutall'interno di AppBarLayout). Volevo che la barra degli strumenti per scorrere fuori vista quando scorrendo verso il basso il contenuto di una ViewPagerall'interno NestedScrollView.

Il mio layout è andato qualcosa del genere:

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

Questo layout non funzionava come previsto, ma l'ho risolto semplicemente eliminando NestedScrollViewe utilizzando un file LinearLayout. Ha funzionato subito per me su Android Support Library v23.1.0. Ecco come è finito il layout:

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

PS: Questi erano in realtà due file di layout nel mio progetto. Li ho copiati e incollati qui e ho cercato di strutturarli come sarebbero in un singolo file. Mi dispiace se ho sbagliato durante il copia-incolla, ma per favore fammi sapere se è così così posso aggiustarlo.


1

Quanto segue dovrebbe garantire la corretta altezza del cercapersone della vista. Il frammento è il primo frammento fornito dal cercapersone della vista.

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

1

Ho lo stesso desiderio, annidare un ViewPagerdentro a NestedScrollView. Ma non funziona neanche per me. Nel mio caso, ViewPagerè all'interno di un Fragmentcosì posso cambiare il contenuto a seconda delle interazioni con il cassetto. Ovviamente, AppBar, collapse, ecc. E tutte le nuove funzionalità della libreria di supporto devono funzionare.

Se un utente scorre verticalmente una pagina nel paginatore, voglio che le altre pagine vengano fatte scorrere allo stesso modo, per dare all'utente l'impressione generale che il paginatore stesso abbia fatto scorrere.

Quello che ho fatto, che funziona, è che non ho più incorporato l' ViewPagerinterno di a NestedScrollView, invece, ho incorporato il contenuto dei frammenti contenuti all'interno di un file NestedScrollView.

Quindi, in caso di scorrimento in un frammento, informo il contenitore della nuova posizione di scorrimento, che lo memorizza.

Infine, su uno swipe sinistro o destro rilevato dal cercapersone (utilizzando la addOnPageChangeListenerricerca degli stati di trascinamento) informo il frammento sinistro o destro di destinazione dove deve scorrere (in base alla conoscenza del contenitore) per essere allineato dal frammento da cui provengo.


Quindi essenzialmente hai scritto la tua implementazione ViewPager? Saresti in grado di condividere il codice su questo?
giuseppe

Ho fatto qualcosa di simile a questo (se ho capito bene), che è fare un layout lineare nel layout del coordinatore, che contiene il tablayout (se necessario) e il viewpager, invece di una scrollview nidificata. I frammenti stessi hanno quindi la scrollview annidata come elemento radice. Questo funziona per me, ma preferirei avere solo un nestedscrollview invece di ripeterlo in ogni frammento.
Chris

0

Conosco una soluzione funzionante: usi Activity, con CoordinatorLayout e usi FrameLayout, container. Poi. usa il gestore dei frammenti per mettere il frammento nel contenitore. Ad esempio il mio codice:

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

E frammento:

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

Quindi usa FragmentManager

getSupportFragmentManager().beginTransaction()
            .replace(R.id.container, new MainFragment())
            .commit();

Penso che il LinearLayoutlayout all'interno del frammento non sia necessario qui. Vedi la mia risposta, ho usato a LinearLayoutinvece di a FrameLayoutnel layout della mia attività e la radice del mio frammento è un ViewPager (nessun layout di wrapping).
Crampi

0

Dopo aver passato ore a provare tutti i suggerimenti di cui sopra, finalmente l'ho fatto funzionare. La chiave sta mettendo NestedScrollViewdentro PageViewere impostare layout_behaviora '@string/appbar_scrolling_view_behavior'per ENTRAMBI vista. Il layout finale è come

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

0

hai appena rimosso NestedScrollView sul tuo xml e aggiungi questo codice alla tua classe

yourGridView.setNestedScrollingEnabled(true);


0

In realtà, NestedScrollView non deve essere il fratello diretto di CollapsingToolbarLayout in CoordinatorLayout. Ho ottenuto qualcosa di veramente bizzarro. Appbar_scrolling_view_behavior funziona in 2 frammenti annidati.

Il mio layout di attività:

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

Nel frameLayout "container" ho gonfiato questo frammento:

<android.support.constraint.ConstraintLayout>

    ... some content ...

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

    ...

</android.support.constraint.ConstraintLayout>

E i frammenti all'interno di quel ViewPager hanno questo aspetto:

<RelativeLayout>

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

    ....

</RelativeLayout>

Il fatto che NestedScrollView possa essere così profondo nella gerarchia dei bambini di CoordinatorLayout e nei comportamenti di scorrimento che ancora funzionano mi ha sorpreso.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.