ViewPager-Update-Fragment beim Swipe

Ich habe ein Problem, dass ich in den letzten 2 Tagen gekämpft habe.

Ich baue eine App, die ActionBar, ViewPager & FragmentPagerAdapter verwendet. Der Code für die Aktivität, Fragments & FragmentPagerAdapter sind genau wie die, die im Android-Beispiel auf http://developer.android.com/reference/android/support/v4/view/ViewPager.html angegeben sind

  • Rekursion verursacht mutableData.setValue (), wodurch die gleiche Aktivität im Backstack erzeugt wird?
  • Wie finde ich, ob die Kamera benutzt wird?
  • Wie finde ich Element in View von Koordinaten x, y Android
  • Wie kann ich verhindern, dass die Ansichten im relativen Layout überlappen?
  • RecyclerDie Artikeldekoration
  • Android Studio Logcat funktioniert nicht
  • Das Problem, das ich vorbei habe, ist – vorausgesetzt, ich habe nur 2 Fragmente im ViewPager. Beim Umschalten / Swiping zwischen den beiden werden die Fragmente nicht aktualisiert. OnResume wird nicht aufgerufen, da der ViewPager ein Minimum von 1 Fragment auf beiden Seiten des angezeigten Fragments cachiert.

    Ich habe versucht, die onTabSelected zu erkennen, wann ein Fragment ausgewählt ist und dann eine Methode aus diesem Fragment mit Hilfe einer Schnittstelle (Code unten) starten.

    public void onTabSelected(Tab tab, FragmentTransaction ft) { TabInfo tag = (TabInfo)tab.getTag(); for (int i=0; i<mTabs.size(); i++) { if (mTabs.get(i) == tag) { mViewPager.setCurrentItem(i); } } ((IStartStop)getItem(tab.getPosition())).Start(); } 

    Wenn jedoch die Startmethode verwendet wird, wird eine NullPointerException ausgelöst, wenn versucht wird, eine Textansicht zu aktualisieren. Der Code der Startmethode lautet:

     public void Start() { TextView tv = _view.findViewById(R.id.text); tv.setText("test"); } 

    Die Ausnahme wird an der Linie geworfen:

     TextView tv = _view.findViewById(R.id.text); 

    Die IStartStop-Schnittstelle ist ganz einfach:

     public interface IStartStop { public void Start(); public void Stop(); } 

    Ich möchte nicht notifyDataSetChanged () verwenden; Mit POSITION_NONE denn jedes Mal, wenn ich zu einem neuen Fragment schwinge, dauert es ein paar Sekunden, um die Fragmente zu laden

    Zu diesem Zeitpunkt enthalten die Fragmente nur eine Textansicht, in Zukunft werden sie eine Animation haben und es ist also wichtig:

    1 Führen Sie nur eine Animation aus, wenn das Fragment ausgewählt ist und nicht, wenn das Fragment daneben ausgewählt ist (wie ViewPager die Fragmente cachiert und wieder aufnimmt).

    2- Stoppen Sie die Animation, wenn das Fragment nicht mehr ausgewählt ist, um zu vermeiden, Geräteressourcen zu verschwenden.

    Ja, ich habe schon alles im Internet überprüft, aber nichts scheint mit mir zu arbeiten.

    Vielen Dank für Ihre Hilfe!

  • Rotation Byte Array von JPEG nach onPictureTaken
  • Android KitKat (API 19) - Wie schreibe ich Nachrichten in SMS Content Provider, ohne sie zu senden, von Non-Default App?
  • Android Multitouch - Zweiter Finger ACTION.MOVE Ignoriert
  • Android: Bug mit ThreadSafeClientConnManager Herunterladen von Bildern
  • Wofür sollte ich Android AccountManager verwenden?
  • Was ist diese Warnung: Ignorieren InnerClasses Attribut für eine anonyme innere Klasse, die nicht mit einem zugehörigen EnclosingMethod Attribut
  • 4 Solutions collect form web for “ViewPager-Update-Fragment beim Swipe”

    Überraschenderweise macht der ViewPager dies nicht "nativ" (unter anderem). Aber nicht alles ist verloren

    Zuerst musst du deine Fragmente modifizieren, damit sie nur die Animation ausführen, wenn du ihnen sagst, dass es ok ist und nicht, wenn sie instanziiert sind. Auf diese Weise kannst du mit dem Viewpager-Offset spielen (default = 3) und hast 2-3 Fragmente vorinstalliert aber nicht animiert.

    Zweiter Schritt ist es, eine Schnittstelle oder ähnliches zu schaffen, die definiert, wann das "Fragment sichtbar geworden ist".

    Dritter Schritt wäre, einen neuen OnPageScrollListener an Ihren Viewpager anzuhängen.

    Code folgt (in halb-ungetestem Code):

    1) Bring den Hörer an:

     mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(final int i, final float v, final int i2) { } @Override public void onPageSelected(final int i) { YourFragmentInterface fragment = (YourFragmentInterface) mPagerAdapter.instantiateItem(mViewPager, i); if (fragment != null) { fragment.fragmentBecameVisible(); } } @Override public void onPageScrollStateChanged(final int i) { } }); 

    2) Das ist deine Schnittstelle:

     public interface YourFragmentInterface { void fragmentBecameVisible(); } 

    3) Ändern Sie Ihre Fragmente, damit sie dies implementieren:

     public class YourLovelyFragment extends Fragment implements YourFragmentInterface { 

    4) Implementiere die Schnittstelle im Fragment

     @Override public void fragmentBecameVisible() { // You can do your animation here because we are visible! (make sure onViewCreated has been called too and the Layout has been laid. Source for another question but you get the idea. } 

    Wohin gehen von hier?

    Vielleicht möchten Sie eine Methode / einen Zuhörer implementieren, um die "anderen" Fragmente zu benachrichtigen, die sie nicht mehr sichtbar sind (dh wenn man sichtbar ist, die anderen nicht). Aber das kann nicht nötig sein

    Dies wirkt sich auf die Änderungen von einer Seite zu einer anderen Seite im View-Pager aus.

     OnPageChangeListener pagechangelistener =new OnPageChangeListener() { @Override public void onPageSelected(int arg0) { Logger.logMessage("Called first"); pageAdapter.notifyDataSetChanged(); indicator.setCurrentItem(arg0); } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { Logger.logMessage("Called second"); } @Override public void onPageScrollStateChanged(int arg0) { Logger.logMessage("Called third"); } }; myViewPager.setOnPageChangeListener(pagechangelistener); 

    Verwenden Sie diese in Ihrem Seitenadapter.

     @Override public int getItemPosition(Object object) { return POSITION_NONE; } 

    SetOnPageChangeListener wurde veraltet. Stattdessen sollten Sie addOnPageChangeListener verwenden.

     mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(final int i, final float v, final int i2) { } @Override public void onPageSelected(final int i) { YourFragmentInterface fragment = (YourFragmentInterface) mPagerAdapter.instantiateItem(mViewPager, i); if (fragment != null) { fragment.fragmentBecameVisible(); } } @Override public void onPageScrollStateChanged(final int i) { } }); 

    Fügen Sie diesen Code hinzu, wenn Sie den Viewpager definieren

     mViewPager.setOffscreenPageLimit(0); 

    Es wird keine Sicht auf die Fragmente sparen, wenn du zu einem anderen Fragment wechsest. So schaltet das Umschalten von Fragment auf ein anderes das Fragment von Anfang an und aktualisiert alles.

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.