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>
ViewPager
bagian dalam AndaLinearLayout
? Hanya ingin tahu apakah itu akan membuat denganViewPager
benar.ViewPager
dalam aNestedScrollView
sebagai satu-satunya tata letak - sepertinya berfungsi dengan baik. Saya juga bisaDrawerLayout
sukses. Mungkin ada aspek lain dari kode Anda yang mencegah fungsionalitas yang Anda inginkan. Ingin membagikan lebih banyak sumber Anda?ViewPager
. Saya dapat menggulir tampilan ke atas dan ke bawah, serta menggulir keViewPager
kiri / kanan.Jawaban:
Saya menemui masalah ini, saya menyelesaikannya dengan
setFillViewport (true)
dalam aktivitas
sumber
android:fillViewport="true"
keNestedScrollView
objek. The dokumentasi menggambarkan atribut ini sebagaiDefines whether the scrollview should stretch its content to fill the viewport.
.android:fillViewport="true"
diNestedScrollView
dan di dalamfragment
aku punyalistView
di mana aku dudukandroid:nestedScrollingEnabled="true"
.. Tetap masalah bergulirOke, saya membuat demo kecil dengan
ViewPager
danNestedScrollView
. Masalah yang saya hadapi adalah dengan ketinggianViewPager
danListView
. Jadi saya melakukan sedikit modifikasi padaListView
danViewPager's
pengukuran tinggi badan.Jika ada yang ingin melihat kode tersebut, Berikut ini tautannya: https://github.com/TheLittleNaruto/SupportDesignExample/
Keluaran:
sumber
NestedScrollView
dan menggunakan aLinearLayout
sebagai gantinya. Apa keuntungan memilikiNestedScrollView
lebih dari aLinearLayout
jika tujuan keseluruhan adalah untuk menggulir konten dalam ViewPager? Harap perbaiki saya jika saya salah. : x Terima kasihTambahkan
android:fillViewport="true"
AndaNestedScrollView
. Titik.sumber
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:
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:
Tata Letak Fragmen Kompleks:
Contoh Aplikasi: CollapsingToolbarPoc
sumber
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.
sumber
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
sumber
Saya memiliki masalah yang sama, dan baru saja memperbaikinya dengan beberapa perubahan.
ViewPager
tidak bekerja di dalamNestedScrollView
. Sederhananya, AndaViewPager
sebagai anak langsung AndaCoordinatorLayout
. Kemudian konten untuk setiap Fragmen ViewPager harus diapitNestedScrollView
. Itu dia.sumber
Anda tidak perlu menggunakan NestedScrollView untuk mendapatkan efek paralaks. coba sesuatu seperti ini:
sumber
ViewPager
fragmen Anda adalah eterRecyclerView
, atauNestedScrollView
. Jika tidak (misalnyaListView
), maka solusi untuk Lollipop dan yang lebih baru adalah dengan menghubungilistView.setNestedScrollingEnabled(true)
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":
Solusi terinspirasi oleh jawaban ini . Bekerja untuk saya!
sumber
cukup letakkan baris ini di NestedScrollView
sumber
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.
sumber
Gunakan di bawah kelas yang disesuaikan untuk menyelesaikan masalah Anda. Jangan lupa untuk memanggil metode onRefresh () di pagechangelistener.
sumber
Saya mengalami masalah serupa (tetapi tanpa
CollapsingToolbarLayout
, hanyaToolbar
+ sederhanaTabLayout
di dalamAppBarLayout
). Saya ingin Toolbar menggulir tidak terlihat saat menggulir ke bawah konten a diViewPager
dalam fileNestedScrollView
.Tata letak saya berjalan seperti ini:
Tata letak ini tidak berfungsi sebagaimana mestinya, tetapi saya menyelesaikannya hanya dengan menyingkirkan
NestedScrollView
dan menggunakan aLinearLayout
. Ini langsung berfungsi untuk saya di Android Support Library v23.1.0. Beginilah akhirnya tata letak: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.
sumber
Berikut ini harus memastikan ketinggian yang tepat dari halaman tampilan. Fragmen adalah fragmen pertama yang disediakan oleh halaman tampilan.
sumber
Saya memiliki keinginan yang sama, bersarang
ViewPager
di dalam aNestedScrollView
. Tapi itu juga tidak berhasil untuk saya. Dalam kasus saya,ViewPager
is inside aFragment
sehingga 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
ViewPager
dalamNestedScrollView
, sebagai gantinya, saya menyematkan konten dari fragmen yang terkandung di dalam aNestedScrollView
.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
addOnPageChangeListener
mencari status seret) saya menginformasikan fragmen kiri atau kanan target di mana ia harus menggulir (berdasarkan pengetahuan wadahnya) untuk disejajarkan dari fragmen tempat saya berasal.sumber
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:
Dan Fragmen:
Kemudian gunakan FragmentManager
sumber
LinearLayout
tata letak di dalam Fragmen tidak diperlukan di sini. Lihat jawaban saya, saya menggunakan a,LinearLayout
bukan aFrameLayout
di layout Activity saya, dan root fragmen saya adalah ViewPager (tanpa layout pembungkus).Setelah menghabiskan berjam-jam mencoba semua saran di atas, akhirnya saya berhasil. Kuncinya adalah meletakkan ke
NestedScrollView
dalamPageViewer
, DAN disetellayout_behavior
ke'@string/appbar_scrolling_view_behavior'
untuk KEDUA tampilan. Layout terakhirnya sepertisumber
Anda baru saja menghapus NestedScrollView di xml Anda dan menambahkan kode ini di kelas Anda
yourGridView.setNestedScrollingEnabled(true);
sumber
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:
Di frameLayout "container", saya telah meningkatkan fragmen ini:
Dan fragmen di dalam ViewPager itu terlihat seperti ini:
Fakta bahwa NestedScrollView bisa begitu dalam dalam hierarki anak CoordinatorLayout dan perilaku gulir masih mengejutkan saya.
sumber