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.
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.
Eine weitere gute Quelle ist http://developer.Android.com/guide/components/fragments.html (Suche nach der Funktion replace ()).
Einfach erstmal entfernen und die super.onBackPressed aufrufen
public void onBackPressed(){
// here remove code for your last fragment
super.onBackPressed();
}
//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;
}