ViewPagerがページを変更するタイミングを決定する


146

ViewPager内に3つのページ(フラグメント)がありますが、これらのページのうち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 '30 / 11/12

回答:


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、2016年

情報のための+1が、これら両者の違いは何であるViewPager.SimpleOnPageChangeListenerViewPager.OnPageChangeListener上記に言及ものとは?
RoCk RoCk 2016年

2
@RoCk SimpleOnPageChangeListenerを使用すると、実際に使用するメソッドをオーバーライドするだけで済みます。たとえば、stackoverflow.com / a / 31961397/608312を参照してください。
ジェイクリー

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) { }
});

この助けを願っています:)

編集: android APIに従い、setOnPageChangeListener (ViewPager.OnPageChangeListener listener)非推奨です。このURLを確認してください:-Android ViewPager API


1
現在mViewPager.setOnPageChangeListener();廃止されているように、これは正常に動作しています。
BST Kaal 2015年

上記のコードで、状態が変更されたかどうかを検出するには、現在の位置を保存し、ページが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.