Saya sedang membangunkan apl Android dengan hanya satu aktiviti Terdapat ViewPager dalam fail reka letak dan penyesuainya mempunyai tiga Fragmen yang terikat padanya. Fail susun atur dua Fragmen pertama ialah SwipeRefreshLayout paling luar untuk muat semula tarik ke bawah, dan kemudian ScrollView bersarang yang ketiga juga telah bersedia untuk melakukan perkara yang sama tetapi menemui masalah.
Apabila saya memasuki apl dan memaparkan Fragmen pertama secara lalai, gelongsor skrin ke atas dan ke bawah mempunyai kesan gelongsor Walau bagaimanapun, beralih kepada Fragmen kedua dan gelongsor tidak mempunyai kesan. Kemudian saya mendapati bahawa apabila saya meluncur dalam Fragmen kedua dan kemudian beralih kembali ke Fragmen pertama, saya mendapati bahawa antara muka Fragmen pertama bertindak balas kepada operasi gelongsor saya. Jadi saya cuba beralih kepada Fragmen ketiga, dan cepat beralih ke Fragmen kedua selepas meluncur.
Saya tidak tahu apa sebabnya, tetapi saya mencuba kaedah: 通过重载setUserVisibleHint(),一旦离开一个Fragment,直接把整个Fragment设成Invisible,以这种方式,的确实现了滑动操作被当前Fragment响应。
Tetapi saya masih tidak faham mengapa ia berlaku sebelum ini - Meluncur skrin dalam Fragmen pertama dan kedua, kedua-duanya Fragmen pertama bertindak balas skrin tergelincir dalam Fragmen ketiga, Fragment kedua bertindak balas kepada operasi gelongsor.
Saya ingin tahu apa yang salah, apa yang menyebabkannya, dan bagaimana saya boleh menyelesaikannya (tanpa memaksanya dengan menetapkan Keterlihatan)?
Kod fail susun atur serpihan (hanya satu diberikan, satu lagi serupa):
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/swipe_article_container"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ScrollView
android:id="@+id/scroll_article_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:descendantFocusability="blocksDescendants">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<WebView
android:id="@+id/articleWebView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:alpha="0"/>
<ProgressBar
android:id="@+id/webViewLoading"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
style="@style/MyProgressBar"
android:visibility="gone"/>
</FrameLayout>
</ScrollView>
</android.support.v4.widget.SwipeRefreshLayout>
Masalah selesai. .
.Ada maklumat yang tidak diterangkan dalam soalan. Iaitu, untuk membuat animasi pudar masuk dan keluar dan bukannya gelongsor lalai apabila ViewPager menukar halaman, saya melaksanakan antara muka kelas ViewPager, ViewPager.PageTransformer. Kemudian, saya membuat instantiate kelas ini dalam Aktiviti dan laksanakan
mViewPager.setPageTransformer(true, pageTransformer);
untuk menetapkan animasi penukaran kepada animasi yang saya tulis sendiri. Masalahnya terletak pada animasi ini Pada mulanya, saya melaksanakan antara muka ini seperti ini:Sekeping kod ini ialah yang saya gunakan buat sementara waktu untuk menyelesaikan fenomena "ghaib" yang diterangkan dalam soalan:
Apa masalahnya? Masalahnya terletak pada fungsi view.setTranslationX() Kedudukan paparan yang ditetapkan oleh fungsi ini bukan sahaja visual, tetapi juga kedudukan sebenar Lihat kod yang saya laksanakan Apabila paparan meninggalkan antara muka semasa daripada kedudukan adalah antara [-Infinity,-1] dan [1+Infinity], saya tidak menggunakan setTranslationX() untuk menetapkan kedudukannya di luar antara muka semasa, tetapi ia masih pada kedudukan yang sama dengan paparan yang baru muncul cuma ia tidak kelihatan kerana ketelusan ditetapkan dengan setAlpha().
Bagaimana saya menemui masalah ini? Hanya ulas semua kod yang memanggil selAlpha() dalam kelas ini, jalankannya semula, dan akhirnya mendapati bahawa apabila saya menukar Fragmen, dua Fragmen akan muncul bertindih. Sekarang saya mengubah suai kelas ini seperti berikut dan masalahnya diselesaikan (kod sementara diulas):