Ich benutze einen ViewPager mit 4 Seiten, und ich bin auf der Suche nach einer effizienten Möglichkeit zum Ersetzen/Wechseln zwischen Fragmenten auf jeder Seite.Ersetze ein Fragment in einem ViewPager mit FragmentPagerAdapter
Dies ist das Interaktionsmuster, die ich versuche zu erstellen:
- Benutzer drückt auf einer Seite eine Schaltfläche, die zur Zeit Fragment A
- Fragment A hält, ist für einige neue Fragment B ausgelagert
- der Benutzer hat einige Arbeit in Fragment B, und dann drückt einen Knopf, wenn er/sie
- Fragment B gemacht wird entfernt, und wird von Fragment A (das Original-Fragment)
Ich habe einen Weg gefunden, dies zu tun, aber es scheint erhebliche Fehler zu haben. Die Lösung besteht darin, das ursprüngliche Fragment zu entfernen, und dann Überschreiben getItemPosition
(im wesentlichen der Methode in diesen related question beschrieben):
//An array to keep track of the currently visible fragment in each page
private final Fragment[] activeFragments= new Fragment[4];
public void openFragmentB(ViewPager pager, int position) {
startUpdate(pager);
//Remove the original fragment
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.remove(activeFragments[position]);
transaction.commit();
//Create a new tile search fragment to replace the original fragment
activeFragments[position] = FragmentB.newInstance();
pageStates[position] = PageState.STATE_B;
finishUpdate(pager);
notifyDataSetChanged();
}
@Override
public int getItemPosition(Object object) {
//If the main fragment is not active, return POSITION_NONE
if(object instanceof FragmentA) {
FragmentA a = (FragmentA) object;
if(pageStates[a.getPosition()] != PageState.STATE_A) {
return POSITION_NONE;
}
}
//If the secondary fragment is not active, return POSITION_NONE
if(object instanceof FragmentB) {
FragmentB b = (FragmentB) object;
if(pageStates[b.getPosition()] != PageState.STATE_B) {
return POSITION_NONE;
}
}
return POSITION_UNCHANGED;
}
Diese Methode funktioniert, aber unerwünschte Nebenwirkungen hat. Wenn das Fragment entfernt und seine Position auf POSITION_NONE festgelegt wird, wird das Fragment zerstört. Wenn der Benutzer also mit der Verwendung von FragmentB fertig ist, muss ich eine neue Instanz von FragmentA erstellen, anstatt das ursprüngliche Fragment erneut zu verwenden. Die Hauptfragmente im Pager (FragmentA in diesem Beispiel) enthalten relativ große datenbankgestützte Listen, daher möchte ich sie, wenn möglich, nicht neu erstellen.
Im Wesentlichen möchte ich nur Referenzen zu meinen 4 Hauptfragmenten behalten und sie in Seiten um- und auslagern, ohne sie jedes Mal neu erstellen zu müssen. Irgendwelche Ideen?
'Fragmente' sind auch 'Ansichten', Sie könnten ein Layout mit den' Fragmenten' erstellen, die Sie austauschen müssen, dann verwenden Sie 'setVisibility()', um sie zu entfernen und hinzuzufügen. – adneal