web-dev-qa-db-ger.com

Fragment nach vorne bringen (Keine Fragmentwiederherstellung)

Ich habe drei Fragmente F1 F2 F3 F4 sind alle von der Seitenleiste aus erreichbar.

alle vier können jederzeit und in beliebiger Reihenfolge angerufen werden,

Jetzt möchte ich, wenn F1 bereits angeklickt (erstellt) wird, dann nie mehr F1 erstellen, sondern nur Fragment F1 mit Fragmentmanager nach vorne bringen. Gleiches für alle anderen Fragmente

Bisher ich habe es für jedes Fragment versucht in meinem Container (FRAGMENT ACTIVITY)

if (fragmentManager.findFragmentByTag("apps")==null) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);

Fragment newFragment = new CategoriesFragment();
transaction.replace(R.id.content_frame, newFragment, "apps");
transaction.addToBackStack("apps");
transaction.commit();   
} else{

}

If part sorgt dafür, dass KEIN Fragment erneut erstellt wird (wenn es bereits erstellt wurde), aber was soll ich in else Part schreiben, damit das bereits erstellte Fragment in der Ansichtshierarchie in den Vordergrund gestellt werden kann

Bitte helfen Sie, ich bin 2 Tage lang dabei.

21
Nitin Misra

Ich würde diesen Code in die Aktivitätsklasse setzen, die FrameLayout mit der ID R.id.fragment_container haben muss.

private Fragment1 F1;
private Fragment2 F2;
private Fragment3 F3;
private Fragment4 F4;       

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    F1 = new Fragment1();
    getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, F1).commit();
    F2 = new Fragment2();
    getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, F2).commit();
    F3 = new Fragment3();
    getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, F3).commit();
    F4 = new Fragment4();
    getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, F4).commit();

    //if needed show F1
    getSupportFragmentManager().beginTransaction().show(F1).commit();

}

Und füge dies für den Button-Klick hinzu:

public void onBtnClick(View view){
    if(mShowF1){
        getSupportFragmentManager().beginTransaction().show(F1).commit();
        getSupportFragmentManager().beginTransaction().hide(F2).commit();
        getSupportFragmentManager().beginTransaction().hide(F3).commit();
        getSupportFragmentManager().beginTransaction().hide(F4).commit();
    }
    //...
}

Auf Knopfdruck (en) können Sie das gewünschte Fragment anzeigen und andere ausblenden.

HINWEIS (@entwickler1011): Für den Einsatz nach dem Status speichern-Status rufen Sie commitAllowingStateLoss () auf. Seien Sie vorsichtig, da das Fragment bei der Wiederherstellung der Aktivität nicht wiederhergestellt wird.

HINWEIS: MainActivity sollte OnFragmentInteractionListener für jedes Fragment implementieren.

public class MainActivity extends FragmentActivity implements Fragment1.OnFragmentInteractionListener, Fragment2.OnFragmentInteractionListener, Fragment3.OnFragmentInteractionListener, Fragment4.OnFragmentInteractionListener {//..

    @Override
    public void onFragmentInteraction(Uri uri) {
        //
    }
}
11
Solata

Holen Sie sich das Fragment per Tag und ersetzen Sie es im Container.

else{
Fragment existingFragment = (CategoriesFragment)fragmentManager.findFragmentByTag("apps");
transaction.replace(R.id.content_frame,existingFragment, "apps");
transaction.addToBackStack("apps");
transaction.commit();
}

UPDATE: Sie können Hide- und Show-Fragment verwenden, um die Verwendung von "transaction.replace ()" zu vermeiden.

fragmentTransaction.hide(<oldFragment>);
fragmentTransaction.show(<newFragment>);
6
nikvs

Wenn Sie nur versuchen, eine Fragment hinzuzufügen, ohne sich darum kümmern zu müssen, dass sie neu erstellt wird, denke ich, dass diese Methode, die ich geschrieben habe, um Fragment hinzuzufügen, Ihre Arbeit erledigen wird.

public static void attachFragment ( int fragmentHolderLayoutId, Fragment fragment, Context context, String tag ) {


    FragmentManager manager = ( (AppCompatActivity) context ).getSupportFragmentManager ();
    manager.findFragmentByTag ( tag );
    FragmentTransaction ft = manager.beginTransaction ();

    if (manager.findFragmentByTag ( tag ) == null) { // No fragment in backStack with same tag..
        ft.add ( fragmentHolderLayoutId, fragment, tag );
        ft.addToBackStack ( tag );
        ft.commit ();
    }
    else {
        ft.show ( manager.findFragmentByTag ( tag ) ).commit ();
    }
}
2
erluxman
  1. Verwenden Sie einen einfachen ArrayList<Fragment> für Ihre Fragmente, und fügen Sie sie in der Reihenfolge hinzu, sodass Sie wissen, dass (0) F1 erhalten, Get (1) F2 usw. erhält.

  2. Erstellen Sie die Fragmente als Singletons. Fügen Sie in jedem Fragment ein statisches Feld und eine Methode hinzu:

     private static Fragment mMyInstance = null;
    
     public static Fragment newInstance() {
         if (mMyInstance == null) {
             mMyInstance = new F1();
         }
         return mMyInstance;
     }
    
  3. Erstellen Sie die Fragmente mit der statischen Methode und fügen Sie sie der ArrayList hinzu.

  4. Fügen Sie in jedem Fragment den Befehl setRetainInstance(true); zur onCreate () - Methode hinzu.

Wenn Sie nun das Fragment mit dem FragmentManager hinzufügen, wird onCreate() nur beim ersten Aufruf aufgerufen, aber onCreateView() wird jedes Mal aufgerufen. Sie möchten die Ansicht jedes Mal aufblähen und die Widgets verbinden, wenn Ihre Aktivität aufgrund einer Konfigurationsänderung neu erstellt wurde. Sie können jedoch etwas überprüfen, das Sie hinzufügen, um zu sehen, ob es das erste Mal ist oder nicht, und die Widgets auf ihren vorherigen Zustand zurückzusetzen, falls dies nicht der Fall ist. Sie benötigen also Member-Variablen in Ihren Fragmenten, um deren Status zu verfolgen. Überschreiben Sie onStop (), um den Status zu speichern, und wenden Sie es nach der Verdrahtung der Widgets erneut in onCreateView () an.

Wenn Sie dann die Sidebar-Schaltfläche drücken, erhalten Sie das Fragment, das dieser Schaltfläche entspricht, entfernen Sie das vorherige Fragment und fügen Sie das aktuelle Fragment mit dem FragmentManager hinzu (oder verwenden Sie einfach den Befehl replace () anstelle von remov ()/add ()). .

1
Rick Falck

Wenn Sie das Support-Fragment verwenden, erledigt diese statische Methode die Aufgabe.

    /**
 * Takes a Fragment TAG and tries to find the fragment in the manager if it exists and bring it to front.
 * if not, will return false;
 * @param manager
 * @param tag
 */
public static boolean resurfaceFragment(FragmentManager manager, String tag ){
    Fragment fragment = manager.findFragmentByTag(tag);
    FragmentTransaction transaction = manager.beginTransaction();
    if (fragment!=null){
        for (int i = 0; i < manager.getFragments().size(); i++) {
            Fragment f =  manager.getFragments().get(i);
            transaction.hide(f);

        }
        transaction.show(fragment).commit();
        return true;
    }

    return false;
}
0
JDenais