ViewPager가 화면 외부보기를 파괴하지 못하도록 방지


133

세 개의 프래그먼트를 표시하는 FragmentPagerAdapter에 연결된 ViewPager가 있습니다. ViewPager는 현재 위치에서 두 번 이상 스 와이프하면 호스팅 된 조각의보기를 파괴하는 것으로 보입니다.

이 뷰는 모두 간단한 목록이며이 최적화는 완전히 불필요하므로 비활성화하고 싶습니다. 목록에 레이아웃 애니메이션이 적용되고 해당 애니메이션이 파괴되고 재생성 된 후에 재생되기 때문에 시각적 인 문제가 발생합니다. 또한 산만해질 수있는 스크롤 막대 소개 애니메이션 (스크롤 막대가 짧게 표시되어 스크롤이 가능함을 나타냄)이 표시되어 사용자의 현재 스크롤 위치가 손실됩니다.

또한 첫 번째 스 와이프가 발생할 때까지 세 번째 조각을로드하지 않습니다. 각 조각이 자체 서비스 호출을 처리하고 활동이로드 될 때 동시에 세 개의 불을 모두 끄는 것을 선호하기 때문에 문제가됩니다. 세 번째 서비스 요청이 지연되는 것은 이상적이지 않습니다.

ViewPager 가이 동작을 중지하고 모든 조각을 메모리에 보관하도록 설득 할 수있는 방법이 있습니까?

답변:


332

에서 개정 4 지원 패키지의 방법은 오히려 1 기본보다, 사용할 오프 스크린 페이지 수를 지정할 수 있습니다 ViewPager에 추가되었습니다.

귀하의 경우 2를 지정하여 세 번째 페이지에있을 때 첫 번째 페이지가 파괴되지 않고 그 반대도 마찬가지입니다.

mViewPager = (ViewPager)findViewById(R.id.pager);
mViewPager.setOffscreenPageLimit(2);

커버 플로우 에서이 작업을 수행하는 방법을 알고 있습니까?
josephus

4
안녕하세요. 내가하고있는 작업에서 조각 / 페이지가 동적으로 생성되므로 무한한 수의 조각이 있습니다. 이 경우 일반적으로 10 이하입니다. 이 솔루션을 많은 페이지에 사용하기 위해 메모리를 제대로 사용하지 않습니까? 그런데 파편은 뷰를 유지합니다. 감사!
mahkie

이 메서드는 내 응용 프로그램에 대한 "java.lang.IllegalStateException : Fragment already added :"오류가 발생합니다.
alicanbatur

고마워 정말 효과가있었습니다. 나도 @ chefgon과 같은 문제가있었습니다.
Prashant

@mahie 위의 솔루션 인 경우 최적화로 제공됩니다. 페이지에 * 지원해야하거나 지연 로딩 메커니즘이 필요한 페이지 수를 미리 알고있는 경우이 설정을 조정하면 페이징 애니메이션 및 상호 작용의 부드러운 정도를 인식 할 수 있습니다. 한 번에 모두 활성화 할 수있는 적은 수의 페이지 (3-4)가있는 경우 사용자 페이지가 앞뒤로 새로 생성 된 뷰 하위 트리의 레이아웃에 소요되는 시간이 줄어 듭니다.
Asthme

8

기본적으로 ViewPager는 페이지를 스 와이프 할 때 조각을 다시 만듭니다. 이를 방지하기 위해 다음 두 가지 중 하나를 시도 할 수 있습니다.

1. 프래그먼트의 onCreate ()에서 setRetainInstance (true)를 호출합니다.

2. 조각 수가 고정되어 있고 상대적으로 적 으면 onCreate ()에 다음 코드를 추가하십시오.

ViewPager mViewPager = (ViewPager) findViewById(R.id.pager);
mViewPager.setOffscreenPageLimit(3);

올바르게 기억한다면 두 번째 옵션이 더 유망합니다. 그러나 나는 두 가지를 모두 시도하고 어느 것이 효과가 있는지를 촉구합니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.