web-dev-qa-db-de.com

Android: Fragmente backStack

Ich versuche, ein neues Fragment zu laden, wenn eine Methode aufgerufen wird. Diese Methode erstellt ein neues Fragment und "ersetzt" das andere Fragment:

private void showTestFragment(Fragment oldFragment, boolean addBackStack, BaseAdapter adapter, int position) {
    Cursor cursor = (Cursor)adapter.getItem(position);
    if(cursor != null){

        int idx = cursor.getColumnIndexOrThrow(Episode._ID);
        long rowId = cursor.getLong(idx);

        FragmentManager fragmentManager = getFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

        if(oldFragment != null){
            Log.i(TAG, "Removing the old fragment");
            fragmentTransaction.remove(oldFragment);
        }

        TestFragment testFragment =  new TestFragment();
        testFragment.setId(rowId);

        fragmentTransaction.add(Android.R.id.content, testFragment);

        if(addBackStack){
            Log.i(TAG, "Added to the backstack");
            fragmentTransaction.addToBackStack(TAG);
        }

        fragmentTransaction.commit();
        Fragment f = getFragmentManager()
                .findFragmentById(R.id.index);
        Log.i(TAG, "after commit, frag is "+ f);
    }
}

Das funktioniert gut, bis ich zurückgehe. Das letzte Fragment sollte entfernt werden, wenn ich zurück gehe. Bevor ich Methoden für die Aktivitäten implementieren werde

public void onBackPressed(){}

um das letzte Fragment zu entfernen, möchte ich wissen, ob ich mit dem Fragmentwechsel richtig umgehe. Es sieht so aus, als würde mir hier etwas fehlen.

38
Oritm

Wenn Sie das Fragment wirklich ersetzen möchten, verwenden Sie die Methode replace (), anstatt remove () und add () auszuführen.

    FragmentManager fragmentManager = getFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.replace(..............);
    fragmentTransaction.addToBackStack(null);
    fragmentTransaction.commit(); 

Vergessen Sie nicht, addToBackStack (null) auszuführen, damit Ihr vorheriger Status zum Backstack hinzugefügt wird und Sie mit der Zurück-Taste zurückgehen können.

Siehe auch https://developer.Android.com/reference/Android/app/FragmentTransaction.html#replace (int, Android.app.Fragment, Java.lang.String .

Eine weitere gute Quelle ist http://developer.Android.com/guide/components/fragments.html (Suche nach der Funktion replace ()).

86
K Roobroeck

Einfach erstmal entfernen und die super.onBackPressed aufrufen

public void onBackPressed(){

    // here remove code for your last fragment
    super.onBackPressed();

}
4
Pratik
//lets wait for systems back to finish

 super.onBackPressed();

//here we believe a fragment was popped, so we need to remove the fragment from ourbackstack
if(fragmentBackStack.size()>0)
{
    Log.d("custombackstack","before back: "+fragmentBackStack.size()+" current:"+fragmentBackStack.peek());

    fragmentBackStack.pop();            
}
//after popping is the size > 0, if so we set current fragment from the top of stack, otherwise we default to home fragment.
if(fragmentBackStack.size()>0)
{           
    Log.d("custombackstack","after back: "+fragmentBackStack.peek());
currentFragment = fragmentBackStack.peek();         
}
else
{           
    //back stack empty
    currentFragment = HOME_FRAGMENT;
}
0
TanvirChowdhury