java - Acara gelongsor ke atas dan ke bawah dalam Fragmen akan bertindak balas kepada Fragmen sebelumnya dan bukannya yang semasa
某草草
某草草 2017-05-31 10:37:03
0
1
967

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

membalas semua(1)
刘奇

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:

.
import android.support.v4.view.ViewPager;
import android.view.View;

/*
*设置Fragment切换时的动画为淡入淡出
*/

public class NoSlidingPageTransformer implements ViewPager.PageTransformer {
    private static final float MIN_ALPHA = 0.0f;    //最小透明度

    public void transformPage(View view, float position) {
        int pageWidth = view.getWidth();    //得到view宽

        if (position < -1) { // [-Infinity,-1)
            // This page is way off-screen to the left. 出了左边屏幕
            view.setAlpha(0);

        } else if (position <= 1) { // [-1,1]
            view.setTranslationX(-pageWidth * position);  //阻止页面的滑动
            float alphaFactor = Math.max(MIN_ALPHA, 1 - Math.abs(position));
            //透明度改变
            view.setAlpha(alphaFactor);
            if (alphaFactor == 0)
                view.setVisibility(View.INVISIBLE);     //页面不在当前界面显示,则使其Invisible,这句是为了解决Fragment对上下滑动事件监听的错乱,暂不知原因
            else if (view.getVisibility() == View.INVISIBLE)
                view.setVisibility(View.VISIBLE);       //页面在当前界面显示,则使其Visible,这句是为了解决Fragment对上下滑动事件监听的错乱,暂不知原因
        } else { // (1,+Infinity]
            // This page is way off-screen to the right.    出了右边屏幕
            view.setAlpha(0);
        }
    }

}

Sekeping kod ini ialah yang saya gunakan buat sementara waktu untuk menyelesaikan fenomena "ghaib" yang diterangkan dalam soalan:

if (alphaFactor == 0)
    view.setVisibility(View.INVISIBLE);     //页面不在当前界面显示,则使其Invisible,这句是为了解决Fragment对上下滑动事件监听的错乱,暂不知原因
    else if (view.getVisibility() == View.INVISIBLE)
        view.setVisibility(View.VISIBLE);       //页面在当前界面显示,则使其Visible,这句是为了解决Fragment对上下滑动事件监听的错乱,暂不知原因

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

import android.support.v4.view.ViewPager;
import android.view.View;

/*
*设置Fragment切换时的动画为淡入淡出
*/

public class NoSlidingPageTransformer implements ViewPager.PageTransformer {

    public void transformPage(View view, float position) {
        int pageWidth = view.getWidth();    //得到view宽

        if (position <= -1) { // [-Infinity,-1]
            // This page is way off-screen to the left. 出了左边屏幕
            view.setTranslationX(0);

        } else if (position < 1) { // (-1,1)
            view.setTranslationX(-pageWidth * position);  //阻止页面的滑动,位置在左则设向右偏移位置,在右则设向左偏移位置
            float alphaFactor = 1 - Math.abs(position);
            //透明度改变
            view.setAlpha(alphaFactor);
            /*
            if (alphaFactor == 0)
                view.setVisibility(View.INVISIBLE);     //页面不在当前界面显示,则使其Invisible,这句是为了解决Fragment对上下滑动事件监听的错乱,暂不知原因
            else if (view.getVisibility() == View.INVISIBLE)
                view.setVisibility(View.VISIBLE);       //页面在当前界面显示,则使其Visible,这句是为了解决Fragment对上下滑动事件监听的错乱,暂不知原因
                */
        } else { // [1,+Infinity]
            // This page is way off-screen to the right.    出了右边屏幕
            view.setTranslationX(0);
        }
    }

}
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan