Bestimmen Sie, wann ein ViewPager die Seiten wechselt


145

Ich habe drei Seiten (Fragmente) in einem ViewPager, möchte jedoch nur einen Menüpunkt für zwei dieser Seiten anzeigen.

Der in einer früheren SO-Antwort angegebene Code scheint nicht zu funktionieren:

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

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

}

Eclipse sagt, dass @Override nicht benötigt wird und Super nicht eingestellt werden kann. Es wird vom System nie aufgerufen, und selbst wenn es so wäre, würde ich feststellen, welche Seite gerade angezeigt wird? Könnte ich hier etwas Hilfe haben?


1
Dieser hat für mich funktioniert und bietet ein wenig mehr Kontext zur Verwendung der angegebenen Lösung: Erkennen der Änderung der ViewPager-Registerkarte in Fragment .
gcl1

Antworten:


282

Verwenden Sie die 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
Sie können stattdessen einen SimpleOnPageChangeListener verwenden und nur onPageSelected
Clocksmith

119

ViewPager.setOnPageChangeListenerist jetzt veraltet. Sie müssen jetzt ViewPager.addOnPageChangeListenerstattdessen verwenden.

beispielsweise,

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
Ich scheine nicht zu verstehen. Bin ein absoluter Anfänger. Was stecken wir in diese Methoden? Bitte helfen Sie mir, wo ich lernen kann addOnPageChangeListener.
Karue Benson Karue

+1 für die Info, aber was ist der Unterschied zwischen diesen beiden ViewPager.SimpleOnPageChangeListenerund ViewPager.OnPageChangeListenerwie oben erwähnt?
RoCk RoCk

2
@RoCk Mit SimpleOnPageChangeListener müssen Sie nur die Methoden überschreiben, die Sie tatsächlich verwenden möchten. Siehe zum Beispiel stackoverflow.com/a/31961397/608312 .
Jake Lee

38

Sie können auch verwenden , ViewPager.SimpleOnPageChangeListeneranstatt ViewPager.OnPageChangeListenernur die Methoden und überschreiben Sie verwenden möchten.

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

Ich hoffe das hilft :)

Bearbeiten: Laut Android APIs setOnPageChangeListener (ViewPager.OnPageChangeListener listener)ist veraltet. Bitte überprüfen Sie diese URL: - Android ViewPager API


1
Wie mViewPager.setOnPageChangeListener();jetzt veraltet, funktioniert dieser gut.
BST Kaal

Um festzustellen, ob sich ein Status geändert hat, speichern Sie im obigen Code die aktuelle Position und vergleichen Sie sie, wenn die Seite in der onPageScrolled-Methode gescrollt wird.
AnupamChugh

14

Kotlin Benutzer ,

viewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {

            override fun onPageScrollStateChanged(state: Int) {
            }

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

            }

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

Update 2020 für ViewPager2

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

12

Für ViewPager2

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

Wo OnPageChangeCallbackist eine statische Klasse mit drei Methoden:

onPageScrolled(int position, float positionOffset, @Px int positionOffsetPixels),
onPageSelected(int position), 
onPageScrollStateChanged(@ScrollState int state)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.