現在、アクティビティが 1 つだけある Android アプリを開発しています。レイアウト ファイルには ViewPager があり、そのアダプターには 3 つの Fragment が関連付けられています。最初の 2 つのフラグメントのレイアウト ファイルは、プルダウン更新用の最も外側の SwipeRefreshLayout であり、次に ScrollView がネストされています。3 番目のフラグメントも同じように準備されましたが、問題が見つかりました。
アプリに入り、デフォルトで最初のフラグメントを表示すると、画面を上下にスライドするとスライド効果がありますが、2 番目のフラグメントに切り替えてスライドしても効果はありません。次に、2 番目のフラグメントにスライドしてから最初のフラグメントに戻ると、最初のフラグメント インターフェイスがスライド操作に応答することがわかりました。そこで、3 番目のフラグメントに切り替えようとして、スライドした後すぐに 2 番目のフラグメントに切り替えたところ、案の定、インターフェースがスライドしました。
理由は分かりませんが、 setUserVisibleHint() をオーバーロードすることで、Fragment を離れたら直接 Fragment 全体を Invisible にするという方法を試してみました。スライド操作は現在のフラグメントによって応答されます。 しかし、なぜ以前にそのような状況があったのかはまだわかりません -
最初と 2 番目の Fragment で画面をスライドすると、最初の Fragment が応答し、3 番目の Fragment で画面をスライドすると、2 番目の Fragment が応答しますスライド操作にフラグメントが反応します。
フラグメント レイアウト ファイル コード (1 つだけが指定されており、もう 1 つは同様です):
リーリー
問題は解決しました。 。
このコードは、質問で説明されている「超自然的な」現象を解決するために一時的に使用したものです:質問に記載されていない情報があります。つまり、ViewPager がページを切り替えるときにアニメーションをデフォルトのスライドではなくフェードインおよびフェードアウトさせるために、ViewPager クラスのインターフェイス ViewPager.PageTransformer を実装しました。次に、Activityでこのクラスをインスタンス化し、
mViewPager.setPageTransformer(true, pageTransformer);
を実行して切り替えアニメーションを自分で書いたアニメーションに設定します。問題はこのアニメーションにあります。最初にこのインターフェイスを次のように実装しました。 リーリーリーリー
何が問題ですか?問題は view.setTranslationX() 関数にあります。この関数によって設定されるビューの位置は、ビューが現在のインターフェイスを離れるときの実際の位置でもあります。位置は [-Infinity,-1] と [1,+Infinity] の間にあり、setTranslationX() を使用して現在のインターフェイスの外側に位置を設定しませんでしたが、それでも新しく表示されたビューと同じ位置にありました。透明度が setAlpha() で設定されているため、見えないだけです。この問題をどのようにして発見しましたか?このクラスの selAlpha() を呼び出すすべてのコードをコメント アウトし、再度実行すると、フラグメントを切り替えると 2 つのフラグメントが重なって表示されることがわかります。このクラスを次のように変更すると、問題は解決しました (一時的なコードはコメントアウトされています)。 リーリー