ViewPager di NestedScrollView


111

Saya perlu membuat antarmuka seperti Google Kios yang merupakan semacam ViewPager (gulir horizontal) di atas tajuk yang runtuh (gulir vertikal). Salah satu persyaratan saya adalah menggunakan Pustaka Dukungan Desain baru yang disajikan di Google IO 2015. ( http://android-developers.blogspot.ca/2015/05/android-design-support-library.html )

Berdasarkan contoh yang dibuat oleh Chris Banes ( https://github.com/chrisbanes/cheesesquare ), saya telah mencapai titik di mana saya dapat melakukan perilaku runtuh tetapi dengan LinearLayout dasar (tanpa scroll horizontal).

Saya mencoba mengganti LinearLayout dengan ViewPager dan saya mendapat layar kosong. Saya bermain dengan: lebar, berat dan semua jenis kelompok tampilan tapi .... masih layar kosong. Tampaknya ViewPager dan NestedScrollView tidak saling menyukai.

Saya mencoba solusi dengan menggunakan HorizontalScrollView: berfungsi tetapi saya kehilangan manfaat fitur PagerTitleStrip dan fokus pada satu panel (saya dapat menghentikan horizontal antara 2 panel).

Sekarang saya tidak punya ide lagi, jika ada yang bisa membawa saya ke solusi ...

Terima kasih

Ini file layout terbaru saya:

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

Sudahkah Anda mencoba membungkus ViewPagerbagian dalam Anda LinearLayout? Hanya ingin tahu apakah itu akan membuat dengan ViewPagerbenar.
CzarMatt

Ya saya coba tapi tetap hasilnya sama. Saya melakukan banyak tes dengan banyak komponen tetapi ViewPager tidak pernah ditampilkan di NestedScrollView tidak peduli hierarkinya
Kyso84

Saya baru saja membuat aplikasi pengujian dengan bagian ViewPagerdalam a NestedScrollViewsebagai satu-satunya tata letak - sepertinya berfungsi dengan baik. Saya juga bisa DrawerLayoutsukses. Mungkin ada aspek lain dari kode Anda yang mencegah fungsionalitas yang Anda inginkan. Ingin membagikan lebih banyak sumber Anda?
CzarMatt

Wah, jadi bisa geser ke kiri / kanan dan atas / bawah? Saya cukup menggunakan FragmentPagerAdapter untuk menampilkan fragmen di halaman saya. Dapatkah Anda membagikan kode sampel Anda?
Kyso84

Saya menempelkan contoh tata letak sederhana di sini: pastebin.com/jXPw6mtf Edit: Anda dapat memuat fragmen apa pun yang Anda inginkan di file ViewPager. Saya dapat menggulir tampilan ke atas dan ke bawah, serta menggulir ke ViewPagerkiri / kanan.
CzarMatt

Jawaban:


128

Saya menemui masalah ini, saya menyelesaikannya dengan 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"/>

dalam aktivitas

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

masukkan deskripsi gambar di sini


31
Perhatikan bahwa ini juga dapat disetel dalam XML, cukup tambahkan android:fillViewport="true"ke NestedScrollViewobjek. The dokumentasi menggambarkan atribut ini sebagai Defines whether the scrollview should stretch its content to fill the viewport..
Krøllebølle

7
Ini tidak menyelesaikan masalah pengguliran di fragmen placeholder
Atieh

3
Terima kasih! Aku duduk android:fillViewport="true"di NestedScrollViewdan di dalam fragmentaku punya listViewdi mana aku duduk android:nestedScrollingEnabled="true".. Tetap masalah bergulir
radubogdan

@ Krøllebølle NestedScrollView tidak memiliki atribut ini, Anda harus menyetelnya secara terprogram.

Ya ini berhasil untuk saya. Saya mengalami masalah saat menyetel tinggi viewpager ke match_parent di dalam NestedScrollView, ini tidak menampilkan tampilan.
Waheed Nazir

71

Oke, saya membuat demo kecil dengan ViewPagerdan NestedScrollView. Masalah yang saya hadapi adalah dengan ketinggian ViewPagerdan ListView. Jadi saya melakukan sedikit modifikasi pada ListViewdan ViewPager'spengukuran tinggi badan.

Jika ada yang ingin melihat kode tersebut, Berikut ini tautannya: https://github.com/TheLittleNaruto/SupportDesignExample/

Keluaran:

masukkan deskripsi gambar di sini


tidak berfungsi, jika fragmen tidak memiliki listview, bahkan forlistview berfungsi jika jumlah count item sama untuk semua fragmen.
Pankaj Arora

3
Saya mungkin sedikit terlambat ke pesta tetapi, saya mengerjakannya hari ini, dan saya (kebanyakan) bekerja dengan menambahkan app: layout_behavior = "@ string / appbar_scrolling_view_behavior" pada ViewPager dan pada tampilan induk dari setiap Fragmen.
Graeme

1
Tidak diragukan lagi ini berhasil, tetapi bukankah ini memperumit masalah? Saya menyelesaikan ini dengan menyingkirkan NestedScrollViewdan menggunakan a LinearLayoutsebagai gantinya. Apa keuntungan memiliki NestedScrollViewlebih dari a LinearLayoutjika tujuan keseluruhan adalah untuk menggulir konten dalam ViewPager? Harap perbaiki saya jika saya salah. : x Terima kasih
Kram

1
Terima kasih banyak! Saya berada pada titik menarik rambut saya, dan WrapContentHeightViewPager Anda bekerja seperti pesona. I berutang budi padamu!
Mavamaarten

1
Solusi yang tepat. Terima kasih. Ini berhasil untuk saya .. :)
Mrunal

42

Tambahkan android:fillViewport="true"Anda NestedScrollView. Titik.


3
itu memecahkan masalah tetapi tinggi viewpager akan menjadi induk yang cocok (dibutuhkan tinggi seluruh halaman).
Manukumar

27

Alih-alih menempatkan ViewPager di dalam NestedScrollView, lakukan sebaliknya.

Tempatkan NestedScrollView di View anak di dalam ViewPager yang intinya adalah layout Fragmen. Kemungkinan besar Anda bahkan tidak perlu menggunakan NestedScrollView jika tata letak daftar Fragmen Anda sangat sederhana.

Contoh Tata Letak

Tata Letak Aktivitas:

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

Jika Anda tidak membutuhkan TabLayout, Anda dapat membuang LinearLayout dan membuat ViewPager berdiri sendiri. Tapi pastikan untuk menggunakan app:layout_behavior="@string/appbar_scrolling_view_behavior"atribut ViewPager.

Tata Letak Fragmen Sederhana:

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

Tata Letak Fragmen Kompleks:

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

Contoh Aplikasi: CollapsingToolbarPoc

masukkan deskripsi gambar di sini


Inilah yang melakukannya untuk saya. Terima kasih!
rjr-apps

Hei Ino, ini sepertinya berhasil tetapi ketika saya menambahkan satu tampilan lagi di atas TabLayout, itu rusak. Bisakah Anda memberikan bantuan?
hushed_voice

Anda telah menyelamatkan hari-hari saya. :)
androidXP

20

Punya masalah yang sama.

Saat meletakkan NestedScrollView di sekitar ViewPager, itu tidak akan berfungsi.

Apa yang berhasil DID adalah meletakkan NestedScrollView di dalam tata letak fragmen yang saya muat di dalam 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>


Apakah ini berfungsi jika konten adalah layout koordinator dengan NestedScrollView lain? Dan apakah KoordinatorLayout induk mendengarkan kejadian gulir di sana?
Atieh

Ini bekerja untuk saya. Saya menambahkan NestedScrollView ke setiap item ViewPager saya, bukan ViewPager. Terima kasih.
jerogaren

Saya memiliki swipefreshlayout dalam fragmen, menurut solusi ur, saya meletakkan NestedScrollview dalam fragmen, di atas swipeRefreshLayout .. maka data tidak dimuat. Itu tidak berhasil.
Palak Darji

16

Anda dapat mencoba seperti ini, viewpager berfungsi dengan baik, tetapi tinggi viewpager tetap.

saya masih menemukan solusi yang lebih baik ..., jadi tolong beri tahu saya poin apa pun dapat melakukannya dengan lebih baik, terima kasih

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

Apakah Anda mencoba merangkumnya ke dalam "android.support.design.widget.CoordinatorLayout" dan toolbar yang runtuh?
Kyso84

Solusi Anda tampaknya membuktikan bahwa masalahnya ada di ketinggian. Menemukan perbaikan apa pun @Paul?
jasxir

3
Yang ini berhasil untuk saya, tetapi saya juga harus memanggil setFillViewport (true) di nestedview.
larrytech

12

Saya memiliki masalah yang sama, dan baru saja memperbaikinya dengan beberapa perubahan. ViewPagertidak bekerja di dalam NestedScrollView. Sederhananya, Anda ViewPagersebagai anak langsung Anda CoordinatorLayout. Kemudian konten untuk setiap Fragmen ViewPager harus diapit NestedScrollView. Itu dia.


meskipun kontennya adalah layout koordinator dengan NestedScrollView?
Atieh

1
Data tampilan daftar fragmen tidak dimuat dengan cara ini!
Palak Darji

5

Anda tidak perlu menggunakan NestedScrollView untuk mendapatkan efek paralaks. coba sesuatu seperti ini:

<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
Ini akan berhasil, selama semua ViewPagerfragmen Anda adalah eter RecyclerView, atau NestedScrollView. Jika tidak (misalnya ListView), maka solusi untuk Lollipop dan yang lebih baru adalah dengan menghubungilistView.setNestedScrollingEnabled(true)
AndyDeveloper

akhirnya sesuatu yang berfungsi tanpa menambahkan wadah bergulir ekstra! Btw Anda juga dapat menyetel setNestedScrollingEnabled ini (true) dalam xml: android: nestedScrollingEnabled = "true"
Analizer

1
Jika saya menjalankan aplikasi saya, tutup toolbar sementara di satu tab, alihkan tab, lalu tarik kembali toolbar, kosong. Harus beralih tab saat dalam keadaan tidak diciutkan untuk mendapatkannya kembali. Begitu dekat, namun begitu jauh :(
me--

4

Saya memiliki tata letak dengan toolbar aplikasi dengan NestedScrollView di bawahnya, lalu di dalam toolbar bersarang ada LinearLayout, di bawah LinearLayout ada tampilan pager. Ide adalah LinearLayout di dalam NestedScrollView telah diperbaiki - Anda dapat menggeser ke kiri / kanan di antara tampilan halaman tampilan tetapi konten ini tidak akan bergerak, setidaknya secara horizontal . Anda masih dapat menggulir semua konten secara vertikal karena tampilan gulir bersarang. Itu idenya. Jadi saya menyetel tinggi NestedScrollView bersarang ke match_parent, mengisi viewport, lalu semua anak layouts / ViewPager ke wrap_content.

Di kepalaku itu benar. Tetapi tidak berhasil - ViewPager memungkinkan saya untuk ke kiri / kanan, tetapi tidak ada pengguliran vertikal, baik konten halaman viewpager didorong ke bawah bagian bawah layar saat ini atau tidak. Ternyata itu pada dasarnya karena ViewPager tidak menghormati wrap_content di berbagai halamannya.

Saya mengatasinya dengan membuat subclass ViewPager untuk membuatnya mengubah ketinggian tergantung pada item yang dipilih saat ini, semacam memaksanya untuk berperilaku seperti 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);
    }
}

Solusi terinspirasi oleh jawaban ini . Bekerja untuk saya!


tetapi tampilan gulir secara otomatis menggulir ke atas? bagaimana cara memperbaikinya?
Vivek Kumar

4

cukup letakkan baris ini di NestedScrollView

android:fillViewport="true"

Terima kasih banyak. Apa yang harus saya lakukan jika saya ingin menggulir dengan menyentuh CollapsingToolbarLayout secara langsung?
Pratik Saluja

3

Saya menghapus NestedScrollView dari tata letak utama dan menyisipkan sebagai Induk di semua tata letak Fragmen saya yang seharusnya dimuat di ViewPager memperbaiki masalah ini untuk saya.


3

Gunakan di bawah kelas yang disesuaikan untuk menyelesaikan masalah Anda. Jangan lupa untuk memanggil metode onRefresh () di 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

Saya mengalami masalah serupa (tetapi tanpa CollapsingToolbarLayout, hanya Toolbar+ sederhana TabLayoutdi dalam AppBarLayout). Saya ingin Toolbar menggulir tidak terlihat saat menggulir ke bawah konten a di ViewPagerdalam file NestedScrollView.

Tata letak saya berjalan seperti ini:

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

Tata letak ini tidak berfungsi sebagaimana mestinya, tetapi saya menyelesaikannya hanya dengan menyingkirkan NestedScrollViewdan menggunakan a LinearLayout. Ini langsung berfungsi untuk saya di Android Support Library v23.1.0. Beginilah akhirnya tata letak:

<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: Ini sebenarnya adalah dua file tata letak dalam proyek saya. Saya menyalin dan menempelkannya di sini dan mencoba menyusunnya seperti dalam satu file. Saya minta maaf jika saya mengacaukan saat menyalin-menempel, tetapi beri tahu saya jika itu masalahnya sehingga saya dapat memperbaikinya.


1

Berikut ini harus memastikan ketinggian yang tepat dari halaman tampilan. Fragmen adalah fragmen pertama yang disediakan oleh halaman tampilan.

<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

Saya memiliki keinginan yang sama, bersarang ViewPagerdi dalam a NestedScrollView. Tapi itu juga tidak berhasil untuk saya. Dalam kasus saya, ViewPageris inside a Fragmentsehingga saya dapat mengganti konten tergantung pada interaksi dengan laci. Tentu saja, AppBar, collapse, dll dan semua fitur baru dari support library harus berfungsi.

Jika pengguna menggulir halaman secara vertikal di halaman, saya ingin halaman lain di-scroll dengan cara yang sama, untuk memberikan kesan keseluruhan kepada pengguna bahwa halaman itu sendiri yang di-scroll.

Apa yang saya lakukan, yang berhasil, adalah bahwa saya tidak lagi menyematkan di ViewPagerdalam NestedScrollView, sebagai gantinya, saya menyematkan konten dari fragmen yang terkandung di dalam a NestedScrollView.

Kemudian, dalam kasus gulir dalam satu fragmen, saya memberi tahu wadah tentang posisi gulir baru, yang menyimpannya.

Akhirnya, pada gesekan ke kiri atau kanan yang terdeteksi dari pager (menggunakan addOnPageChangeListenermencari status seret) saya menginformasikan fragmen kiri atau kanan target di mana ia harus menggulir (berdasarkan pengetahuan wadahnya) untuk disejajarkan dari fragmen tempat saya berasal.


Jadi pada dasarnya Anda menulis implementasi ViewPager Anda sendiri? Apakah Anda dapat membagikan kode tentang ini?
joseph

Saya melakukan sesuatu yang mirip dengan ini (jika saya memahaminya dengan benar), yaitu melakukan tata letak linier dalam tata letak koordinator Anda, yang berisi tablayout (jika perlu) dan viewpager, bukan scrollview bersarang. Fragmen itu sendiri kemudian memiliki scrollview bersarang sebagai elemen akarnya. Ini berfungsi untuk saya, tetapi saya lebih suka hanya memiliki satu tampilan gulungan bersarang daripada mengulanginya di setiap fragmen.
Chris

0

Saya tahu satu solusi yang berfungsi: Anda menggunakan Activity, dengan CoordinatorLayout dan menggunakan FrameLayout, container. Kemudian. gunakan pengelola fragmen untuk meletakkan fragmen ke dalam wadah. Misalnya kode saya:

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

Dan Fragmen:

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

Kemudian gunakan FragmentManager

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

Saya pikir LinearLayouttata letak di dalam Fragmen tidak diperlukan di sini. Lihat jawaban saya, saya menggunakan a, LinearLayoutbukan a FrameLayoutdi layout Activity saya, dan root fragmen saya adalah ViewPager (tanpa layout pembungkus).
Kram

0

Setelah menghabiskan berjam-jam mencoba semua saran di atas, akhirnya saya berhasil. Kuncinya adalah meletakkan ke NestedScrollViewdalam PageViewer, DAN disetel layout_behaviorke '@string/appbar_scrolling_view_behavior'untuk KEDUA tampilan. Layout terakhirnya seperti

<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

Anda baru saja menghapus NestedScrollView di xml Anda dan menambahkan kode ini di kelas Anda

yourGridView.setNestedScrollingEnabled(true);


0

Sebenarnya NestedScrollView tidak harus merupakan saudara langsung dari CollapsingToolbarLayout di CoordinatorLayout. Saya telah mencapai sesuatu yang sangat aneh. Appbar_scrolling_view_behavior bekerja dalam 2 fragmen bertingkat.

Tata letak aktivitas saya:

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

Di frameLayout "container", saya telah meningkatkan fragmen ini:

<android.support.constraint.ConstraintLayout>

    ... some content ...

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

    ...

</android.support.constraint.ConstraintLayout>

Dan fragmen di dalam ViewPager itu terlihat seperti ini:

<RelativeLayout>

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

    ....

</RelativeLayout>

Fakta bahwa NestedScrollView bisa begitu dalam dalam hierarki anak CoordinatorLayout dan perilaku gulir masih mengejutkan saya.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.