2016-08-11 3 views
0

Ursprünglich hatte ich ein einzelnes Fragment in meiner MainActivity Klasse geladen. Ich verwendete folgende inAufruf Fragment Methode aus Aktivität mit FragmentPagerAdapter

onCreate

if (savedInstanceState == null) { 
      getSupportFragmentManager().beginTransaction() 
        .add(new TimeTableFragment(), TIMETABLEFRAGMENT_TAG) 
        .commit(); 
     } 

und in

onResume

if(*setting has changed*){ 
TimeTableFragment tf = (TimeTableFragment) getSupportFragmentManager() 
        .findFragmentByTag(TIMETABLEFRAGMENT_TAG); 
      if (null != tf) { 
       tf.onStudentIdChanged(); 
      } 
} 

The onStudentIdChanged() Verfahren Wou ld Aktualisieren Sie die Fragmentdaten, wenn sich die Voreinstellungen geändert haben.

Ich habe diese Aktivität jetzt umgestaltet, um FragmentPagerAdapter zu verwenden und zwei verschiedene Fragmente in Registerkarten zu laden. Beide Fragmente sind Instanzen der gleichen TimetableFragment Klasse, aber mit verschiedenen Parametern beim Erstellen übergeben.

FragmentPagerAdapter Methoden

TimetableFragment Methode

public static TimeTableFragment newInstance(int sectionNumber) { 
     TimeTableFragment fragment = new TimeTableFragment(); 
     Bundle args = new Bundle(); 
     args.putInt(ARG_SECTION_NUMBER, sectionNumber); 
     fragment.setArguments(args); 
     return fragment; 
    } 

Nun, da dies Zugang arbeiten, in onResume meiner MainActivity Ich bin nicht mehr in der Lage, um die Fragmente mit findFragmentByTag, da sie während onCreate nicht auf diese Weise hinzugefügt werden und ich die onStudentIdChanged Methode nicht mehr aufrufen kann.

Wie kann ich für alle erstellten Instanzen des Zeitplanfragments diese Methode aufrufen und die Daten aktualisieren/aktualisieren lassen?

+0

Sie sollten die Fragmente "abonnieren" zu einem Ereignis, nicht explizit "Call" für ein Update von der Aktivität. Dies wird als Beobachtermuster bezeichnet. –

Antwort

1

In Ihrem FragmentPagerAdapter imprementation, fügen private SparseArray<Fragment> mFragments = new SparseArray<Fragment>();

Ihre getItem Methode wie folgt ändern:

@Override 
public Fragment getItem(int position) { 
    // getItem is called to instantiate the fragment for the given page. 
    // Return a Fragment 
    Fragment fragment = null; 
    switch (position) { 
     case 1: 
     case 2: 
     fragment = mFragments.get(position); 
     if (fragment == null) { 
      fragment = TimeTableFragment.newInstance(position); 
      mFragments.append(position, fragment) 
     } 
     break; 
     case 0: 
     //todo add the single day here 
     fragment = mFragments.get(position); 
     if (fragment == null) { 
      fragment = TimeTableFragment.newInstance(position); 
      mFragments.append(position, fragment) 
     } 
     break; 
    } 

    return fragment; 
} 

Nun, wenn Sie Instanz Fragment von Position zu bekommen.

Verwandte Themen