2017-04-26 4 views
1

Ich bin ziemlich neu in der Android-Entwicklung, so bin ich neugierig, wie man mit Fragmenten richtig arbeitet.Gemeinsame Möglichkeit, Fragmente zu wechseln, ohne den Zustand zu verlieren

My Anwendung enthält ein BottomNavigationActivity, die mit diesem Code zwischen 3 Fragmenten schalten:

FragmentManager fragmentManager = getSupportFragmentManager(); 
    fragmentManager.beginTransaction().replace(R.id.content_montage_order_detail, fragment).commit(); 

I die Fragmente in einem List<Fragment> den aktuellen Zustand zu vermeiden, an Speicherung zu verlieren. Aber jedes Mal, wenn ich das Fragment durch ein anderes ersetze, wird die Methode onDestroy() aufgerufen.

Ich weiß, ich weiß, ich könnte das Fragment im Fragmentmanager hinzufügen und entfernen, anstatt es zu ersetzen. Ich habe viel gegoogelt und die meisten Tutorials sagen mir, dass ich das Fragment ersetzen soll.

Was ist der übliche Weg, um einen Fragmentstatus beizubehalten, ohne ihn bei jedem Aufruf neu zu erstellen?

+0

Sie können addFragment tun. – Rajasekhar

+0

Haben Sie einen View-Pager? –

Antwort

2

Finden Sie die Lösung

Es wird nicht Fragment jederzeit

FragmentManager fragmentManager = getSupportFragmentManager(); 
fragmentManager.beginTransaction().add(R.id.content_montage_order_detail, fragment).commit(); 
+0

und später anhängen und trennen? –

1

Ya neu erstellen, können Sie auch durch die Verwaltung der Backstack den Zustand verwalten.

2

Verwenden Sie Fragment TAG zum Zeitpunkt der Erstellung von Fragment, wenn Sie es wieder verwenden möchten, verwenden Sie findFragmentByTag. Wenn das Fragment bereits erstellt wurde, wird es vom Fragmentmanager gefunden.

Fragment vorherigerFragment = fragmentManager.findFragmentByTag ("TAG");

2

Ich schlage vor, Sie show verwenden, nicht für replace

protected void addFragmentStack(Fragment fragment) { 
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
    if (this.mContent != fragment) { 
     if (fragment.isAdded()) { 
      ft.hide(this.mContent).show(fragment); 
     } else { 
      ft.hide(this.mContent).add(getFragmentViewId(), fragment); 
     } 
     this.mContent = fragment; 
    } 
    ft.commit(); 
} 
1

Versuchen switchFragment mit Fragment zu wechseln, wird es Fragment zeigen, wenn es bereits hinzugefügt wird.

Verwenden Sie die Methode fragmentTransaction.show, um das vorhandene Fragment, d. H. Die gespeicherte Instanz, erneut zu verwenden.

public void switchFragment (Fragment oldFragment, Fragment newFragment, int frameId) { 

    boolean addFragment = true; 

    FragmentManager fragmentManager = getFragmentManager(); 
    String tag = newFragment.getArguments().getString (BaseFragment.TAG); 
    Fragment fragment = fragmentManager.findFragmentByTag (tag); 

    // Check if fragment is already added 
    if (fragment != null && fragment.isAdded()) { 
     addFragment = false; 
    } 

    // Hide previous fragment 
    String oldFragmentTag = oldFragment.getArguments().getString (BaseFragment.TAG); 

    if (!tag.equals (oldFragmentTag)) { 
     FragmentTransaction hideTransaction = fragmentManager.beginTransaction(); 
     Fragment fragment1 = fragmentManager.findFragmentByTag (oldFragmentTag); 
     hideTransaction.hide (fragment1); 
     hideTransaction.commit(); 
    } 

    // Add new fragment and show it 
    FragmentTransaction addTransaction = fragmentManager.beginTransaction(); 

    if (addFragment) { 
     addTransaction.add (frameId, newFragment, tag); 
     addTransaction.addToBackStack (tag); 
    } 
    else { 
     newFragment = fragmentManager.findFragmentByTag (tag); 
    } 

    addTransaction.show (newFragment); 

    addTransaction.commit(); 
} 
Verwandte Themen