ViewPager가 페이지를 변경하는시기 결정


146

ViewPager 내부에 3 개의 페이지 (Fragments)가 있지만 해당 페이지 중 2 개의 메뉴 항목 만 표시하려고합니다.

이전 SO 답변에 제공된 코드 가 작동하지 않는 것 같습니다.

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);

    if (isVisibleToUser == true) { }
    else if (isVisibleToUser == false) {  }

}

Eclipse는 @Override가 필요하지 않으며 super를 설정할 수 없다고 말합니다. 시스템에서 호출 한 적이 없으며 현재 어떤 페이지가 표시되는지 어떻게 알 수 있습니까? 여기에 도움이 필요하십니까?


1
이것은 나를 위해 일했으며 주어진 솔루션을 사용하는 방법에 대한 약간의 컨텍스트를 제공합니다 . Fragment 내 ViewPager 탭 변경 감지 .
gcl1

답변:


282

사용하십시오 ViewPager.onPageChangeListener:

viewPager.addOnPageChangeListener(new OnPageChangeListener() {
    public void onPageScrollStateChanged(int state) {}
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}

    public void onPageSelected(int position) {
        // Check if this is the page you want.
    }
});

48
대신 SimpleOnPageChangeListener를 사용할 수 있고 onPageSelected를 재정의 할 수 있습니다
clocksmith

118

ViewPager.setOnPageChangeListener더 이상 사용되지 않습니다. 이제 ViewPager.addOnPageChangeListener대신 사용해야 합니다.

예를 들어

viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

        }

        @Override
        public void onPageSelected(int position) {

        }

        @Override
        public void onPageScrollStateChanged(int state) {

        }
    });

3
이해하지 못하는 것 같습니다. 절대 초보자입니다. 그래서 우리는 그 방법에 무엇을 넣을까요? 어디서 배울 수 있는지 도와주세요 addOnPageChangeListener.
Karue Benson Karue

정보는 +1이지만이 둘의 차이점 ViewPager.SimpleOnPageChangeListenerViewPager.OnPageChangeListener위에서 언급 한 내용은 무엇입니까?
RoCk RoCk

2
@RoCk SimpleOnPageChangeListener를 사용하면 실제로 사용하려는 메소드 만 재정의하면됩니다. 보다예를 들어 stackoverflow.com/a/31961397/608312 를 .
Jake Lee

37

사용 하려는 메소드 ViewPager.SimpleOnPageChangeListener대신 대신 사용할 수 있습니다 ViewPager.OnPageChangeListener.

viewPager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {

    // optional 
    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { }

    // optional 
    @Override
    public void onPageSelected(int position) { }

    // optional 
    @Override
    public void onPageScrollStateChanged(int state) { }
});

이 도움을 바랍니다 :)

편집 : 안드로이드 API에 따라 setOnPageChangeListener (ViewPager.OnPageChangeListener listener)더 이상 사용되지 않습니다. 이 URL을 확인하십시오 : -Android ViewPager API


1
mViewPager.setOnPageChangeListener();더 이상 사용되지 않는 것처럼 이것은 잘 작동합니다.
BST Kaal

위 코드에서 상태가 변경되었는지 여부를 감지하려면 현재 위치를 저장하고 페이지가 onPageScrolled 메소드에서 스크롤 될 때 비교합니다.
AnupamChugh

14

Kotlin 사용자 ,

viewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {

            override fun onPageScrollStateChanged(state: Int) {
            }

            override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {

            }

            override fun onPageSelected(position: Int) {
            }
        })

ViewPager2 용 2020 업데이트

        viewPager.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
        override fun onPageScrollStateChanged(state: Int) {
            println(state)
        }

        override fun onPageScrolled(
            position: Int,
            positionOffset: Float,
            positionOffsetPixels: Int
        ) {
            super.onPageScrolled(position, positionOffset, positionOffsetPixels)
            println(position)
        }


        override fun onPageSelected(position: Int) {
            super.onPageSelected(position)
            println(position)
        }
    })

11

ViewPager2의 경우

viewPager.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
  override fun onPageSelected(position: Int) {
    super.onPageSelected(position)
  }
})

OnPageChangeCallback세 가지 메소드가있는 정적 클래스는 어디에 있습니까?

onPageScrolled(int position, float positionOffset, @Px int positionOffsetPixels),
onPageSelected(int position), 
onPageScrollStateChanged(@ScrollState int state)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.