Olayı

2013-11-01 13 views
28

FragmentTransaction tamamlandığında bir olay olması mümkün mü?Olayı

FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
ft.replace(R.id.content_frame, fragment).commit(); 

Aslında, benim uygulama için bir Çekmecesini kullanmak ve işlem benim İşlem çubuğunun menüsünü değiştirme tamamlandığında invalidateOptionsMenu(); tetiklemek istiyorum.

cevap

31

? N? Z taahhüt() işlevi çağrısından sonra

getSupportFragmentManager().executePendingTransactions(); 

arayabilir, tamamlamak için parça işlem için beklemek gerekmez.

Bu işlemin tamamlanmasını sağlar.

+4

Sorunum, işlemimin iyi gittiğini değil, ne zaman bittiğini bilmek değil. Aksi halde, görünümümün ekranı arasında bir boşluk var ve eylemimin menü çubuğunu değiştir. –

+0

executePendingTransactions öğesini çağırdığınızda işlem zorla tamamlanacaktır. Hiç değilse, görünümün yüklenmesi biraz zaman alacaktır. Bunu bulmak için, statik bir işlev kullanın ve parçanızın onResume'den arayın. –

+2

Bence bu, geçerli bir cevaptır, her seferinde "etkinlik" olmasa bile. executePendingTransactions() işlem tamamlanana kadar * bloğu * ve işlemin tamamlanmasının ardından bir sonraki komut, bir olayın olduğu gibi ve hatta olay dinleyicisi yükü olmadan bile geçerli olacaktır. bir fragmanı eklenirken – auval

3

this answer numaralı belgede verilen tavsiyeyi kullanabilirsiniz --- işlem tamamlandıktan sonra onAnimationEnd yöntemini kullanarak kodu çalıştırın.

Bunun çalışması için, FragmentTransaction üzerinde bir animasyonu ayarlamanız gerekir.

transaction.setCustomAnimations(R.anim.slide_in_left, 
           R.anim.slide_out_right); 
8

Hei! Bu deneyin:

private OnBackStackChangedListener backStackListener = new OnBackStackChangedListener() { 

    @Override 
    public void onBackStackChanged() { 
     String name = ""; 
     int position = getSupportFragmentManager().getBackStackEntryCount(); 
     if(position!=0){ 
      FragmentManager.BackStackEntry backEntry=getSupportFragmentManager().getBackStackEntryAt(position-1); 
      name=backEntry.getName(); 


     } 
     if(position==0){ 
      mainActionBar(); 
     } 
     else if(name=="someWord"){ 
      mainActionBar2(); 
     } 
     else{ 
      mainActionBar3(); 
     } 

    } 
}; 
getSupportFragmentManager().addOnBackStackChangedListener(backStackListener); 

Ve İşlem içinde

böyle backStack etiket eklemek:

getSupportFragmentManager().beginTransaction() 
       .replace(R.id.main, SomeFragment.newInstance(some argument)) 
       .addToBackStack("someWord").commit(); 
FragmentTransaction tamamlandıktan
+0

Bu, yalnızca herhangi bir özel animasyon eklemediyseniz geçerlidir. –

+3

'onBackStackChanged', geçiş başlangıcında çağrılıyor. Bu asla geçerli değildir. – Servus7

0

commit() yerine commitNow() kullanmayı düşünebilirsiniz ve daha sonra işlemin tamamlandığından emin olabilirsiniz. Elbette bunu yapmalı veya yapmasanız işlemin karmaşıklığı meselesi.