2013-02-22 31 views
30

MainActivity sayfamda bir ListFragment var. İşte benim parça nesneyi nasıl belirledim.Yığının tepesinden parça almanın bir yolu var mı?

FragmentManager fragmentManager = activity.getSupportFragmentManager(); 
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
Fragment newFragment = new MyFragment(); 
fragmentTransaction.replace(R.id.framecontainer, newFragment, "tag"); 
fragmentTransaction.addToBackStack(null); 
fragmentTransaction.commit(); 

sorun kullanıcı geri düğmesine basın, ben, en azından,

getActionBar().setTitle(title); 
getActionBar().setDisplayHomeAsUpEnabled(isEnabled); 
invalidateOptionsMenu(); 

arayarak eylem çubuğunu ve menü değiştirmek zorunda zaman Şu anda gösterilenden parçanın ne tür bilmek zorunda olduğunu , böylece eylem çubuğunu nasıl ayarlayacağımı biliyorum. Ayar seçeneğini argüman olarak parçalı olarak saklıyorum.

String title = fragment.getArguments().getString("KEY_TITLE"); 
boolean isEnabled = fragment.getArguments().getBoolean("KEY_ISENABLED"); 

ben ilgili soru arama yapmak ve ben özel bir yığın tüm etiketi saklamak ve (pop aramak zorunda ben Ancak

MyFragment fragment = (MyFragment) getSupportFragmentManager() 
     .findFragmentByTag("tag"); 

arayarak fragman alabilir fark) onBackPressed()'da kullanıcı geri düğmesine bastığında her zaman.

Yani, benim sorum şu: o anki görünür parçayı doğrudan yığıntan almanın bir yolu var mı?

Not: Parça türlerinin yalnızca farklı bir bölüm değil, yalnızca farklı bölümler olduğunu unutmayın.

cevap

52

bu gibi bazı şey backpress bu etkinlik öğrenmesine yardımcı olmalıdır: Bu yardımcı olur

private Fragment getCurrentFragment(){ 
    FragmentManager fragmentManager = getSupportFragmentManager(); 
    String fragmentTag = fragmentManager.getBackStackEntryAt(fragmentManager.getBackStackEntryCount() - 1).getName(); 
    Fragment currentFragment = fragmentManager.findFragmentByTag(fragmentTag); 
    return currentFragment; 
} 

@Override 
public void onBackPressed() { 
    Fragment fragmentBeforeBackPress = getCurrentFragment(); 
    // Perform the usual back action 
    super.onBackPressed(); 
    Fragment fragmentAfterBackPress = getCurrentFragment(); 
} 

Umut.

+6

Ben yoluna yaparsan, ben ayarlamak zorunda gibi görünüyor * * fragmentTransaction.addToBackStack (tag) ** da; Aksi takdirde, bir NullPointerException alırdım. Yani ** fragmentManager.getBackStackEntryAt (fragmentManager.getBackStackEntryCount() - 1) .getName(); ** etiket adı –

+1

Yea'ya başvurmazsınız ... sıfırları ve kötü matematik için kontrol etmeniz gerekir ((getBackStackEntryCount-1)> 0 ve benzeri).Bunu çok hızlı yazdım. Ayrıca, etiketsiz eklenen fragmanlar boş olarak görünecektir. AddToBackStack (boş) kullanırsam – petey

+0

hala çalışır mı? – umerk44

20
FragmentManager.findFragmentById(fragmentsContainerId) 

function döner backstack içinde Fragment top bağlantı. Kullanım örneği:

fragmentManager.addOnBackStackChangedListener(new OnBackStackChangedListener() { 
     @Override 
     public void onBackStackChanged() { 
      Fragment fr = fragmentManager.findFragmentById(R.id.fragmentsContainer); 
      if(fr!=null){ 
       Log.e("fragment=", f.getClass().getSimpleName()); 
      } 
     } 
    }); 
+0

Bu çok tuhaf görünüyor ... ama benim için harika çalışıyor :). Dokümanlar, arka planı aradığını söyler, bu yüzden her zaman Android'in tüm sürümlerinde (parmak çarpı işareti) yığının üst kısmından arama yapar. – delrocco

+0

Bunu uzun zamandır arıyordum. Bu dinleyicinin nasıl çalıştığını açıkladığınız için teşekkürler – mikebertiean

1

Orada doğru olarak işaretlenmiş bir cevap zaten ve benim ek bilgiler en buna farklı olmayacaktır olacaktır. ANCAK, alıcının olduğu yerden parçanın mevcut üst parçası olup olmadığını anlamak için bir alıcı kullanırken denemeye çalışırken sorun yaşadım. Çok sayıda NPE ve Dizin sınırları dışında kolayca çalıştırabilirsiniz. Bu yüzden bunu yazdım, belki birilerine yardım ediyor.

private boolean isFragmentOnTop(Activity parentActivity, final String fragmentName){ 
     FragmentManager fmManager = parentActivity.getFragmentManager(); 
     if(fmManager.getBackStackEntryCount() == 0){ 
      LOG.i("BackStack entry count is 0: " + this); 
      return false; 
     } 
     String fragmentNameOnStackTop = ""; 
     final FragmentManager.BackStackEntry topEntry = fmManager.getBackStackEntryAt(fmManager.getBackStackEntryCount() -1); 
     if(topEntry != null) { 
      fragmentNameOnStackTop = topEntry.getName(); 
     } 
     LOG.d("Got fragments name: " + fragmentNameOnStackTop); 
     return fragmentNameOnStackTop != null ? fragmentNameOnStackTop.equals(fragmentName) : false; 
    } 

Bunun bazı parçalara sahip bir etkinlik için iyi çalıştığını unutmayın. ViewPager'ın bir çocuk bölümü yöneticisi kullanarak olduğunuzu unutmayın.

Ve bu yardımcı yöntem yığının tepesinden parçasını almak FragmentTransaction.addToBackStack(fragmentName)

0

yılında fragmentName ayarlamak unutmayın:

public Fragment getTopFragment() { 
    if (getSupportFragmentManager().getBackStackEntryCount() == 0) { 
     return null; 
    } 
    String fragmentTag = getSupportFragmentManager().getBackStackEntryAt(getSupportFragmentManager().getBackStackEntryCount() - 1).getName(); 
    return getSupportFragmentManager().findFragmentByTag(fragmentTag); 
} 
İlgili konular