Ich entwickle derzeit eine Android-App mit nur einer Aktivität. Die Layoutdatei enthält einen ViewPager, an dessen Adapter drei Fragmente gebunden sind. Die Layoutdateien der ersten beiden Fragmente sind das äußerste SwipeRefreshLayout für die Pulldown-Aktualisierung, und dann wird eine ScrollView verschachtelt. Das dritte war ebenfalls bereit, dasselbe zu tun, stellte jedoch ein Problem fest.
Wenn ich die App aufrufe und standardmäßig das erste Fragment anzeige, hat das Verschieben des Bildschirms nach oben und unten einen Gleiteffekt. Das Wechseln zum zweiten Fragment und das Verschieben hat jedoch keine Wirkung. Dann stellte ich fest, dass die erste Fragment-Schnittstelle auf meinen Schiebevorgang reagierte, als ich das zweite Fragment hineinschob und dann zurück zum ersten Fragment wechselte. Also habe ich versucht, zum dritten Fragment zu wechseln, und bin nach dem Schieben schnell zum zweiten Fragment gewechselt. Tatsächlich rutschte die Benutzeroberfläche.
Ich weiß nicht, was der Grund ist, aber ich habe eine Methode ausprobiert: 通过重载setUserVisibleHint(),一旦离开一个Fragment,直接把整个Fragment设成Invisible,以这种方式,的确实现了滑动操作被当前Fragment响应。
Aber ich verstehe immer noch nicht, warum es vorher so passiert ist – Wenn man den Bildschirm im ersten und zweiten Fragment verschiebt, antwortet das erste Fragment Der Bildschirm wird im dritten Fragment verschoben, das zweite Fragment reagiert auf den Schiebevorgang.
Ich möchte wissen, was schief gelaufen ist, was es verursacht hat und wie ich es lösen kann (ohne es durch die Einstellung der Sichtbarkeit zu erzwingen)?
Fragment-Layout-Dateicode (nur einer ist angegeben, der andere ist ähnlich):
<?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>
问题解决了。。
有一个信息在问题中没有描述。那就是,我为了使ViewPager切换page时动画为淡入淡出而不是默认的滑动,实现了ViewPager类的一个接口ViewPager.PageTransformer。然后,我在Activity中实例化这个类,并执行
mViewPager.setPageTransformer(true, pageTransformer);
就可以将切换动画设置成我自己写的动画。问题就出在这个动画上,一开始这个接口我是这么实现的:其中这一段代码是我临时用来解决问题中描述的“灵异”现象的:
问题在哪里呢?问题就在view.setTranslationX()这个函数上,这个函数所设置的view的位置,不仅仅是视觉上的,也是实际的位置,那么看我实现的这段代码,在view离开当前界面的时候,position的值处于[-Infinity,-1]和[1,+Infinity]的时候,我并没有用setTranslationX()将其位置设置到当前界面之外,而是还是与新出现的view在同一位置,只不过由于用setAlpha()设置了透明度才看不见的。
我是怎么发现这个问题的呢?就是把这个类中的调用selAlpha()的代码全注释掉,再次运行,终于发现,当我切换Fragment的时候,会出现两个Fragment重叠显示的现象。现在我将这个类修改如下,问题解决(临时代码注释掉了):