Hier ist meine Lösung, die tatsächlich funktioniert. Es beinhaltet Sendungen zur Benachrichtigung der Fragmente.
Zuerst habe ich erweitert die Fragment
Klasse:
@SuppressLint("ValidFragment")
public class ExtendedFragment extends Fragment {
public static final String FragmentIdTag = "Fragment ID";
public static final String FragmentSwitchedEventId = "FragmentSwitchedEvent";
@SuppressLint("ValidFragment")
protected ExtendedFragment(FragmentType fragmentId) {
m_fragmentType = fragmentId;
}
public void onSwitchedAway() {
}
public BroadcastReceiver broadcastReceiver() {
return m_receiver;
}
class Receiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
FragmentType newFragmentType = (FragmentType) intent.getSerializableExtra(FragmentIdTag);
if (newFragmentType != m_fragmentType)
onSwitchedAway();
}
}
protected final FragmentType m_fragmentType;
Receiver m_receiver = new Receiver();
}
FragmentType
ist enum
, die für jedes Fragment anders. Alle Fragmente erstrecken sich ExtendedFragment
(ein schrecklicher Name, ich weiß. Fühlen Sie sich frei, einen besseren vorzuschlagen) und passender einzigartiger FragmentType
Wert zu seinem Erbauer.
Dann benutze ich die Viewpager.OnPageChangeListener
das Fragment Schalter zu erkennen:
pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}
@Override
public void onPageSelected(int position) {
FragmentType newType = fragmentTypeForPosition(position);
Intent i = new Intent(ExtendedFragment.FragmentSwitchedEventId);
i.putExtra(ExtendedFragment.FragmentIdTag, newType);
LocalBroadcastManager.getInstance(MainActivity.this).sendBroadcast(i);
}
@Override
public void onPageScrollStateChanged(int state) {}
});
Und schließlich, wenn die Fragmente Instanziieren vergessen sie nicht als Rundfunkempfänger zu registrieren:
pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageSelected(int position) {
FragmentType newType = fragmentTypeForPosition(position);
Intent i = new Intent(ExtendedFragment.FragmentSwitchedEventId);
i.putExtra(ExtendedFragment.FragmentIdTag, newType);
LocalBroadcastManager.getInstance(MainActivity.this).sendBroadcast(i);
}
});
Erledigt. Jetzt können die Fragmente public void onSwitchedAway()
überschreiben.
Nein, ich sehe nicht, wie es funktioniert. Nehmen wir an, ich speichere den Verweis auf das aktuelle Fragment in 'FragmentPagerAdapter.getItem', aber zu dem Zeitpunkt, zu dem' OnPageChangeListener.onPageSelected' aufgerufen wird, ist es bereits zu spät. Ich weiß, auf welches Fragment ich ** ** umstelle, aber nicht was ** von **. –
Und ich glaube nicht, dass 'getItem' jedes Mal aufgerufen wird, wenn ein Übergang auftritt. Es könnte intern zwischengespeichert werden. –
Ok ich sehe deinen Standpunkt. Keine Notwendigkeit, es von getItem() zu bekommen. Wie wäre es mit der Verfolgung Ihrer aktuellen Viewpager-Seite? Sie können alles verwenden, einen Index, eine Zeichenfolge. Dann erhalten Sie bei onPageSelected Ihre Referenz basierend auf dem Objekt, auf dem Sie die letzte Seitenreferenz speichern, und rufen Sie schließlich eine Methode auf. – Matteo