2013-04-08 22 views
5

Grafikte uygulama akış şovu verildiğinde ve aşağıdaki metinsel olarak açıklandığı gibi.Backstack içinde en üstte olmayan parça yeniden başlıyor

Application flow

  1. Fragment 1 disallowAddToBackStack ayarlayarak backstack en düşük parçası ama değil.
  2. Parça 2, fragmentTransaction.addToBackStack() kullanılarak yığının üstüne itilir.
  3. Yığın üzerine yeni bir parça 1 örneği itilir.
  4. En çok parça (parça 1) yığından atılır.
  5. Etkinlik 2 ön plana dönüşür.
  6. Etkinlik 1 ön plana dönüşür.

    private void changeContainerViewTo(int containerViewId, Fragment fragment, 
                Activity activity, String backStackTag) { 
    
        if (fragmentIsAlreadyPresent(containerViewId, fragment, activity)) { return; } 
        final FragmentTransaction fragmentTransaction = 
           activity.getFragmentManager().beginTransaction(); 
        fragmentTransaction.replace(containerViewId, fragment); 
        fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
        if (backStackTag == null) { 
         fragmentTransaction.disallowAddToBackStack(); 
        } else { 
         fragmentTransaction.addToBackStack(backStackTag); 
        } 
        fragmentTransaction.commit(); 
    } 
    

    sorun

    zaman aktivitesi 1. parçanın en örneği de devam eder, son aşamada 1 devam eder:

Burada fragmanlarını işlemek için kullanımı yaygın bir yöntemdir. Bu noktada, parça 1, getActivity()'da null'u döndürür.

Soru

  • Neden olmayan bir parçası yığını üzerinde en üst sürdürülür? Parçayı sürdürmek doğruysa - ayrılmış bir parçayla nasıl başa çıkmalıyım?
+0

İlk Fragment1 ve Fragment2 aynı konteyner görünümü ve ikinci adımda hangi işlemi kullanıyorsunuz? – Evos

+0

Evet, Fragment1 ve Fragment2 aynı kapsayıcı görünümünü kullanır. – JJD

+0

Ve işlem türü hakkında ne diyorsunuz: "değiştir", "ekle"? – Evos

cevap

1

I (adımları nasıl tarif dayanarak) olmadıkça bu fragmentTransaction.addToBackStack() nasıl çalıştığını yanlış anladın, ne olacağını nasıl görmüyorum: işlemler fragmanları, backstack değil yerleştirildiği yönetir. böylece kullanıcı işlemi tersine çevirmek ve Geri düğmesine basarak önceki parçasını geri getirebilir, yerine işlem geri yığını kaydedilir) (addToBackStack arayarak

: android Dokümanlar

.

fragmentTransaction.replace(containerViewId, fragment2); 
fragmentTransaction.addToBackStack(); 
fragmentTransaction.commit(); 

ve 3. adımı:

yüzden adımını 2 kodunda böyle bir şey görünüyorsa Bu noktada

fragmentTransaction.disallowAddToBackStack()//or just no call to addToBackStack - you do not say 
fragmentTransaction.replace(containerViewId, newfragment1); 
fragmentTransaction.commit(); 

, Fragment2 backstack kaldırılır ve olacak backstack iki Fragment1 örneğinden oluşur. 4. Adımda en üstteki pencereyi açarsınız, yani şimdi en üstteki Fragment1'e sahip olmanız gerekir.

Bu, etkinliğe geri döndüğünüzde neden devam eden parça olduğunu açıklar. Ama korkmuyorum ki, neden kendi faaliyetinden ayrıldığını açıkçası.

+0

.disallowAddToBackStack() '' .replace() 'işlevini çağırdığınızı fark ettim. Güncellenmiş sorumu görün. Bu bir sorun olabilir mi? – JJD

+1

no, sipariş önemli değil. İşlemi oluştururken belirlediğiniz nitelikler, son olarak taahhüt verene kadar kullanılmaz. – salfon

+0

şu anda boş step1 gibi bir şey) 'changeContainerViewTo (containerId, afragment1, aktiviteyi,)' adım2) yapıyorsan 'changeContainerViewTo (containerId, afragment2, aktivite, etiketi)' step3) 'changeContainerViewTo (containerId, afragment1, etkinlik , null) büyük olasılıkla istediğinizi yapmıyorsunuz - step2'nin tag parametresi için null değerini ve step3'ün tag parametresi için boş olmayan bir değeri geçmeyi deneyin. Kısacası, sadece bir işlemin yerine bir parça değiştirilirse addToBackStack'ı geri aramak istiyorum. – salfon

2

Activity, UI'yi göstermiyor ve ardından UI'yi göstermeye geldiğinde, ilişkili tüm parçalarınızla birlikte FragmentManager ölüyor ve durumunu geri yüklemeniz gerekiyor. documentation olarak

söyler:

bulunmaktadır (örneğin, bir kullanıcı arayüzü gösteren geri yığını üzerine yerleştirildiğinde olduğu gibi) bir fragmanının en çok yıkılabilir birçok durum vardır, ancak durum kadar kaydedilmeyecektir

Sahip olma faaliyetinin aslında devletini korumasına ihtiyacı vardır. senin Activity onSaveInstanceState ve onRestoreInstanceState yılında

, size Fragment referansları kaydetme ve sonra böyle bir şey ile onları geri deneyin:

public void onSaveInstanceState(Bundle outState){ 
    getFragmentManager().putFragment(outState,"myfragment", myfragment); 
} 
public void onRetoreInstanceState(Bundle inState){ 
    myFragment = getFragmentManager().getFragment(inState, "myfragment"); 
} 

bu deneyin ve şans var! :-)

1

Android OS, uygun gördüğü zaman parçaları oluşturabilir ve yok edebilir. Etkinlik 2'yi başlattığınızda ve Etkinlik 1'e geri döndüğünüzde bu muhtemelen gerçekleşir. Aktif olarak görüntülenen parça olmadığından emin olmak isterim. Muhtemelen, parça 2 için yaratma adımlarını gerçekleştirmeden önce, parça 1 için yaratma adımlarından bazılarını yaptığınızı görmektesiniz.

Ayrılmış parçaların işlenmesiyle ilgili olarak, bu page'a bir göz atmalısınız. Bunun özü, sadece belirli bir bölüm fonksiyonunda getActivity kullanmanızdır (fragment life cycle). Bu, mantığınızın bir kısmını diğer işlevlere taşımanız gerektiği anlamına gelebilir.

İlgili konular