2017-09-08 3 views
0

Ich benutze einen ViewPager, um durch eine Reihe von Fragmenten zu wechseln, und ich möchte jedes Fragment aktualisieren, nachdem es auf den Bildschirm gleitet. Grundsätzlich möchte ich, dass der Text nach dem Ablegen des Fragments "eingeblendet" wird.onPageSelected Läuft BEVOR onCreateView aufgerufen wird?

Ich habe versucht mit den onStart und onResume Methoden des Fragments, und während dies für die meisten Seiten funktioniert, funktioniert es nicht für die zweite Seite, denn aus welchem ​​doof Grund, die erste Seite UND die zweite Seite haben ihre onStart/onResume-Methoden, die gleichzeitig aufgerufen werden (bevor die zweite Seite überhaupt auf den Bildschirm trifft).

Jetzt versuche ich, es mit dem OnPageChangeListener onPageSelected Callback zu arbeiten. Das Verfahren sieht wie folgt aus:

@Override 
public void onPageSelected(final int position) { 
    mCurrentPosition = position; 

    PageFragment fragment = (PageFragment) ((MainActivity.ScreenSlidePagerAdapter) mViewPager.getAdapter()).getItem(position); 

    fragment.onSelect(); 

} 

Und die onSelect Methode im Fragment sieht wie folgt aus:

public void onSelect(){ 

    new android.os.Handler().postDelayed(
      new Runnable() { 
       public void run() { 

        mSwitcher.setText(""); 

        mNum = getArguments() != null ? getArguments().getInt("num") : 1; 
        Media currentMedia = slideshow.getMedia().get(mNum); 

        mSwitcher.setText(currentMedia.getDisplayName()); 
       } 
      }, 
      4000); 
} 

Das Problem mit dieser Art und Weise ist, dass die Linie mSwitcher.setText(""); ein NullPointerException

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextSwitcher.setText(java.lang.CharSequence)' on a null object reference

wirft

Was würde vorschlagen, dass die onCreateView Methode in tha Die Klasse muss noch ausgeführt werden, da die Variable mSwitcher instanziiert wird. Das scheint mir Banane zu sein, da die Aussicht an dieser Stelle schon auf den Bildschirm rutscht.

Irgendwelche Ideen zur Lösung dieses Problems würden sehr geschätzt werden. Dies ist meine erste Android-Erfahrung, und ich habe versucht, diese blöde Text-Einblendung für eine ganze Woche ohne Glück zu lösen. An diesem Punkt bin ich fast bereit, Mobile als eine Plattform aufzugeben, wegen wie schmerzhaft jede kleine Änderung bisher war.

+1

_ „erste Seite und die zweite Seite haben ihre onStart/onResume Methoden zur gleichen Zeit als“ _ - So arbeitet 'ViewPager' mit Fragmenten (standardmäßig). Sie können einstellen, wie viele Offscreen-Fragmente mit https://developer.android.com/reference/android/support/v4/view/ViewPager.html#setOffscopePageLimit() geladen werden. – CzarMatt

+0

Zeigen Sie Ihre 'onCreateView()' Methode im Fragment an –

Antwort

0

ViewPager speichert die nächste Seite im Speicher & Dies ist das Standardverhalten. Man könnte es anpassen, indem Aufruf wie:

viewPager.setOffscreenPageLimit(2); 

jedoch nicht sinnvoll sein könnte, als ob Sie 0 in oben-Methode übergeben, viewPager es ignorieren.

Sie gehen in die richtige Richtung. Ich glaube, jetzt ist das Problem in Ihrem ScreenSlidePagerAdapter. In getItem(int position) könnten Sie so etwas wie

if(position == 1) 
    return new PageFragment(); 

stattdessen den Adapter zu etwas ändern wie folgt haben,

public class ScreenSlidePagerAdapter extends FragmentPagerAdapter { 

    private List<Fragment> mFragments = new ArrayList<>(); 

    public ScreenSlidePagerAdapter(FragmentManager fm, List<Item> items) { 
     super(fm); 

     for (Item item : items) { 
      mFragments.add(new PageFragment()); 
     } 
    } 


    @Override 
    public int getCount() { 
     return mFragments.size(); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     return mFragments.get(position); // Return from list instead of new PagerFragment() 
    } 
} 
+0

Ja, das hat funktioniert. Ich denke, ein Teil des Problems bestand in der PageFragment-Klasse, die einen Verweis auf die gesamte Diashow enthielt, statt auf ein einzelnes Medienobjekt pro Fragment, aber das Ändern des Adapters, wie Sie angegeben haben, war definitiv notwendig. Kann ich fragen, warum das funktioniert und wie Sie wussten, dass das das Problem war? Ist es, weil diese Strategie sicherstellt, dass alle Fragmente im Voraus erstellt werden? –

+0

Auf diese Weise erhalten Sie immer die gleiche Instanz des Fragments, das in ViewPager aufgebläht wird, während Sie bei der Rückgabe von MyFragment() immer eine andere Instanz erhalten, wenn Sie sie aufrufen –

Verwandte Themen