ViewPager'in sayfaları ne zaman değiştireceğini belirleme


146

Bir ViewPager içinde üç sayfa (Parçalar) var, ancak ben sadece bu sayfalardan ikisi için bir menü öğesi görüntülemek istiyorum.

Önceki SO yanıtında verilen kod işe yaramıyor:

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

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

}

Eclipse, @Override'a gerek olmadığını ve süper ayarlanamayacağını söylüyor. Hiçbir zaman sistem tarafından çağrılmaz ve şu anda hangi sayfanın gösterildiğini nasıl belirleyeceğim? Burada biraz yardım alabilir miyim?


1
Bu benim için çalıştı ve verilen çözümün nasıl kullanılacağı hakkında biraz daha bağlam verir: Fragment içindeki ViewPager sekmesi değişikliğini algıla .
gcl1

Yanıtlar:


285

Kullanın 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
Bunun yerine SimpleOnPageChangeListener kullanabilir ve yalnızca onPageSelected üzerinde geçersiz kılabilirsiniz
clocksmith

118

ViewPager.setOnPageChangeListenerşu anda kullanımdan kaldırıldı. Şimdi ViewPager.addOnPageChangeListenerbunun yerine kullanmanız gerekiyor .

Örneğin,

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
Anlamadım. Mutlak bir acemiyim. Peki bu yöntemlerin içine ne koyarız. Lütfen nerede öğreneceğime yardım et addOnPageChangeListener.
Karue Benson Karue

Bilgi için +1, ancak bu ikisinin farkı nedir ViewPager.SimpleOnPageChangeListenerve ViewPager.OnPageChangeListeneryukarıda bahsedildiği gibi?
RoCk RoCk

2
@RoCk SimpleOnPageChangeListener ile yalnızca gerçekten kullanmak istediğiniz yöntemleri geçersiz kılmanız gerekir. Örneğin, stackoverflow.com/a/31961397/608312 adresine bakın .
Jake Lee

37

Yalnızca kullanmak istediğiniz yöntemleri ViewPager.SimpleOnPageChangeListeneryerine kullanabilir ViewPager.OnPageChangeListenerve geçersiz kılabilirsiniz.

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

Umarım bu yardım :)

Düzenleme: Android API'lerine setOnPageChangeListener (ViewPager.OnPageChangeListener listener)göre kullanımdan kaldırıldı. Lütfen bu URL'yi kontrol edin: - Android ViewPager API


1
mViewPager.setOnPageChangeListener();Artık kullanımdan kaldırıldığı gibi , bu iyi çalışıyor.
BST Kaal

Yukarıdaki kodda, bir durumun değişip değişmediğini tespit etmek için geçerli konumu kaydedin ve sayfa onPageScrolled yönteminde kaydırıldığında karşılaştırın.
AnupamChugh

14

Kotlin Kullanıcıları ,

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 için 2020 Güncelleştirmesi

        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 için,

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

OnPageChangeCallbacküç yöntemle statik bir sınıf nerede :

onPageScrolled(int position, float positionOffset, @Px int positionOffsetPixels),
onPageSelected(int position), 
onPageScrollStateChanged(@ScrollState int state)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.