현재 레이아웃 파일에 ViewPager가 하나 있고 해당 어댑터에 세 개의 조각이 연결된 Android 앱을 개발 중입니다. 처음 두 조각의 레이아웃 파일은 풀다운 새로 고침을 위한 가장 바깥쪽 SwipeRefreshLayout이고, 세 번째 조각도 동일한 작업을 수행하도록 준비되었지만 문제가 발견되었습니다.
앱에 들어가서 기본적으로 첫 번째 Fragment를 표시하면 화면을 위아래로 슬라이드하면 슬라이딩 효과가 발생합니다. 그러나 두 번째 Fragment로 전환하여 슬라이딩해도 효과가 없습니다. 그런 다음 두 번째 조각으로 미끄러졌다가 다시 첫 번째 조각으로 전환했을 때 첫 번째 조각 인터페이스가 내 슬라이딩 작업에 응답한다는 사실을 발견했습니다. 그래서 세 번째 Fragment로 전환하려고 했는데 슬라이딩 후 빠르게 두 번째 Fragment로 전환했습니다. 당연히 인터페이스가 슬라이딩되었습니다.
이유가 무엇인지는 모르겠지만 다음과 같은 방법을 시도했습니다. 通过重载setUserVisibleHint(),一旦离开一个Fragment,直接把整个Fragment设成Invisible,以这种方式,的确实现了滑动操作被当前Fragment响应。
근데 이전에 왜 그런 일이 일어났는지 아직도 이해가 안 됩니다. - 첫 번째와 두 번째 조각에서 화면을 슬라이드하면 첫 번째 조각이 모두 응답합니다. 세 번째 조각에서는 화면이 미끄러지고 두 번째 조각은 슬라이딩 작업에 응답합니다.
무엇이 잘못됐는지, 무엇이 원인인지, 어떻게 해결할 수 있는지 알고 싶습니다(공개 설정을 통해 강제하지 않고).
조각 레이아웃 파일 코드(하나만 제공되고 다른 하나는 유사함):
으아악怪我咯2017-05-31 10:39:03
문제가 해결되었습니다. .
질문에 설명되지 않은 정보가 있습니다. 즉, ViewPager가 페이지를 전환할 때 기본 슬라이딩 대신 애니메이션이 페이드 인 및 아웃되도록 하기 위해 ViewPager 클래스의 인터페이스인 ViewPager.PageTransformer를 구현했습니다. 그런 다음 Activity에서 이 클래스를 인스턴스화하고 mViewPager.setPageTransformer(true, pageTransformer);
를 실행하여 전환 애니메이션을 내가 직접 작성한 애니메이션으로 설정합니다. 문제는 이 애니메이션에 있습니다. 처음에는 이 인터페이스를 다음과 같이 구현했습니다.
이 코드 조각은 질문에 설명된 "초자연적" 현상을 해결하기 위해 일시적으로 사용한 코드입니다.
으아아아무엇이 문제인가요? 문제는 view.setTranslationX() 함수에 있습니다. 이 함수로 설정한 뷰의 위치는 시각적일 뿐만 아니라, 제가 구현한 코드를 보면, 현재 인터페이스에서 값이 나올 때입니다. 위치가 [-Infinity,-1]과 [1,+Infinity] 사이에 있으므로 현재 인터페이스 외부에서 위치를 설정하기 위해 setTranslationX()를 사용하지 않았지만 여전히 새로 나타난 뷰와 동일한 위치에 있었습니다. 단지 투명도가 setAlpha()로 설정되었기 때문에 보이지 않는다는 것뿐입니다.
이 문제를 어떻게 발견했습니까? 이 클래스에서 selAlpha()를 호출하는 모든 코드를 주석 처리하고 다시 실행하면 마지막으로 조각을 전환할 때 두 개의 조각이 겹쳐서 나타나는 것을 확인할 수 있습니다. 이제 이 클래스를 다음과 같이 수정하면 문제가 해결됩니다(임시 코드는 주석 처리됨).