2013-01-16 11 views
35

Bir yöntem çağrıldığında yeni bir parça yüklemeye çalışıyorum. Bu yöntem, yeni bir parçasını oluşturur ve diğer parçası "yerini" i tekrar gitmek kadarAndroid: Fragments backStack

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); 
    } 
} 

Bu, gayet iyi çalışıyor. Son parçam geri döndüğümde çıkarılmalı. ben geçen parçasını kaldırmak için etkinlikler

public void onBackPressed(){} 

üzerinde yöntemlerini uygulamak için gidiyorum önce i doğru parçası değişikliği kaldırabilecek olmadığını bilmek istiyorum. Ben burada bir şey eksik gibi

+0

Olası kopyalar [Fragments içinde onBackPressed() nasıl eklenir?] (Http://stackoverflow.com/questions/5448653/how-to-implement-onbackpressed-in-fragments) –

cevap

78

super.onBackPressed() ve bir ekle().

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

geri geri düğmesi ile gitmek için izin backstack eklenecektir addToBackStack (null) için önceki durumuna yapmak unutmayın.

Ayrıca bkz. https://developer.android.com/reference/android/app/FragmentTransaction.html#replace(int, android.app.Fragment, java.lang.String).

Başka bir iyi kaynak http://developer.android.com/guide/components/fragments.html (replace() işlevi için aramadır).

+2

(replace) = = remove (thisFragment) .add (anotherFragment). Değiştir, bu sıradaki yöntemlere eşittir. – Nepster

+0

@Nepster, doğru, ancak her zaman uygun değil. FWIW, Fark, Replace'in konteynerdeki herhangi bir parçayı/parçalarını kaldırmasıdır; BuFragmenti bilmeye gerek yok. Bunun önemli olduğu bir senaryo, Fragman B1'in Fragmanı B2 ile değiştirilen Fragman A'ya bir linkse. Daha sonra (Geriye doğru B1 yerine) parçasına geri dönmek için "Geri" düğmesini istendiğinde, bunu elle kodlamalıyız, çünkü Android'in arka yüzü [yanlış IMHO] "B1'i kaldır, A'yı ekle" - orijinal bağlantının tersi A'dan B1'e. B2 bakış açısı içinde bekler. Kodumuzun B2'nin B1 değil, mevcut parça olduğunu bilmesi gerekiyor. Bazen bu rahatsız edici. – ToolmakerSteve

4

Sadece ilk kaldırmak .. görünüyor ve gerçekten) (fragman daha sonra değiştirmek kullanmak Methode değiştirmek istiyor yerine kaldırmayı yapıyor ise çağrı

public void onBackPressed(){ 

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

} 
0
//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; 
} 
ait
İlgili konular