Null parametresine sahip addToBackStack'in anlamı nedir?


99

Müşteri kodum var. Tüm fragmanlar için tek bir aktivite vardır, yani tek aktivite tüm fragmanları yönetmektir.

Bu aktivite, o parçanın yöntem sonundaki herhangi bir parça için aşağıdaki kodu içerir:

Örneğin - MoreFragment parçacığı:

MoreFragment firstFragment = new MoreFragment();
getSupportFragmentManager().beginTransaction()
.replace(R.id.article_fragment, firstFragment)
.addToBackStack(null).commit();

Yani,

1) addToBackStack(null)Ardından a'nın anlamı nedir commit()?

2) Neden null parametresine geçmeniz gerekiyor addToBackStack?

3) Böyle eklendikten sonra o parça nasıl elde edilir?

Son satırı olmadan kodu çalıştırdığım ve sorunsuz çalıştığı için bu kod işe yaramıyor gibi görünüyor .addToBackStack(null).commit().


developer.android.com/reference/android/app/… bazı durumlarda bu yöntemi çağırmanız gerekir.
Lucifer


3
Parça adını, Null yerine addToBackStack (ad) için parametre olarak iletebilirsiniz. Null değerini iletirseniz FragmentManager.popBackStackImmediate (Dize adı, int bayrakları) yöntemini kullanamazsınız; veya popBackStack (Dize adı, int bayrakları); çünkü adı Null idi. Dolayısıyla popBackstack yöntemleri çalışmayacaktır. Parametre olarak null geçmek yerine Fragman adını iletmenizi öneririm.
luckylukein

Yanıtlar:


115

AddToBackStack (null) ve ardından bir commit () ifadesinin anlamı nedir?

Alıntılanan belgeler:

AddToBackStack () çağrıldığında, değiştirme işlemi arka yığına kaydedilir, böylece kullanıcı işlemi tersine çevirebilir ve Geri düğmesine basarak önceki parçayı geri getirebilir.

İşleme birden fazla değişiklik eklerseniz (başka bir add () veya remove () gibi) ve addToBackStack () 'i çağırırsanız, commit () çağrılmadan önce uygulanan tüm değişiklikler tek bir işlem olarak ve Geri düğmesi arka yığına eklenir. hepsini birlikte tersine çevirecek.

Bir FragmentTransaction'a değişiklikleri eklediğiniz sıra, şu durumlar dışında önemli değildir:

commit()Son aramalısın . Aynı kaba birden çok parça ekliyorsanız, bunları eklediğiniz sıra, görünüm hiyerarşisinde görünecekleri sırayı belirler.

Yani sonunda taahhüt etmelisiniz.

AddToBackStack için neden boş bir parametre geçirmeniz gerekiyor?

Boş olması gerekmez, bir dizge olabilir. İstemiyorsan, boş geç.

genel soyut FragmentTransaction addToBackStack (Dize adı)

API seviyesi 11'de eklendi Bu işlemi arka yığına ekleyin. Bu, işlemin tamamlandıktan sonra hatırlanacağı ve daha sonra yığından çıkarıldığında işleminin tersine döneceği anlamına gelir.

Parametreler adı Bu arka yığın durumu için isteğe bağlı bir ad veya boş.

İlgili:

Son satır .addToBackStack (null) .commit () olmadan kodu çalıştırdığım için bu kod işe yaramaz gibi görünüyor ve sorunsuz çalışıyor

Önceki parçaya gitmek istiyorsanız, onu arka istifleme ekleyin. Bu nedenle, parçayı arka yığına eklemek isteyip istemediğinize bağlıdır.

Bu şekilde eklendikten sonra o parça nasıl elde edilir?

Parça örneğine zaten sahipsiniz firstFragment. Yani parçayı daha sonra almakla ne demek istediğini anlamıyorum.

Daha fazla bilgi @

http://developer.android.com/guide/components/fragments.html

http://developer.android.com/reference/android/app/FragmentTransaction.html#addToBackStack(java.lang.String)


Bunu API belgesinden cevabınıza da ekleyebilirsiniz: Bu işlemi arka yığına ekleyin. Bu, işlemin tamamlandıktan sonra hatırlanacağı ve daha sonra yığından çıkarıldığında işleminin tersine döneceği anlamına gelir. Parametreler adı Bu arka yığın durumu için isteğe bağlı bir ad veya boş.
Dyrborg

Anladığım kadarıyla, backstack'e eklemenin tüm amacı, önceki bölüme gitmek için geri düğmesiyle yaptığımız gibi gezinmeyi gerçekleştirmek mi?
Tanrım

Tamam, eğer addToBackStack'e bir parametre iletiyorsanız, o zaman neden getFragmentManager().popBackStackImmediate()geri düğmesi parametre geçişi ile / olmadan kendi başına yapabiliyorsa neden yapmamız gerekiyor ? Cevabı görmek için - stackoverflow.com/questions/21156153/…
My God

@VedPrakash ihtiyacınız yok. Ayrıca bu tamamen farklı bir soru ve cevap. İki parçayı arka yığına ekleyerek ve geri düğmesine basarak kendinizi kolayca bulabilirsiniz
Raghunandan

@VedPrakash, yönetim parçalarını oku @ developer.android.com/guide/components/fragments.html
Raghunandan

17

tagDize addToBackStack(String name)daha sonra o konuma doğrudan pop geri yığını bulmak için bir yol sağlar. Yöntemde kullanılması amaçlanmıştır popToBackStack(String name, int flags):

Yöneticinin arka parça yığınından son parça geçişini açın. Bu işlev eşzamansızdır - isteği pop'a sıralar, ancak uygulama olay döngüsüne dönene kadar eylem gerçekleştirilmez.

name: boş değilse, bu aranacak önceki geri durumunun adıdır; bulunursa, o duruma kadar olan tüm durumlar açılır. POP_BACK_STACK_INCLUSIVE bayrağı, adlandırılmış durumun kendisinin atılıp atılmadığını kontrol etmek için kullanılabilir. Boşsa, yalnızca üst durum açılır.

bayraklar: 0 veya POP_BACK_STACK_INCLUSIVE.

O tarafından eklendi parçasını bulana kadar başka bir deyişle, sırt yığını çıkacaktır namein addToBackStack(String name).

Örneğin, parça yöneticisine "frag1", "frag2", "frag3", "frag4" adlarını veren bir dizi ekleme veya değiştirme yaparsanız ve daha sonra doğrudan addToBackStack (" frag2 "), ararsınız popToBackStack("frag2", 0).

Yani,

  • Kullanın .addToBackStack("fragName"): Daha sonra popToBackStack(String name, int flags)birden fazla arka yığını patlatmak istiyorsanız .

  • Kullanın .addToBackStack(null): Daha sonra birden fazla arka yığını patlatmak istemiyor ancak yine de birer birer patlatmak istiyorsanız. Bunu, popToBackStack () 'i açıkça çağırmasanız bile, bunun yerine geri basma varsayılan uygulamasının geri yığını işlemesine izin verseniz bile yapın.

  • Kullanın .disallowAddToBackStack(): Geri tuşuna basmak istemiyorsanız veya popBackStack () 'i açıkça çağırın. Kodun hiçbir bölümünde .addToBackStack () kullanılmadığından emin olacaktır.


1

Cevaplarınız kullanımdan kaldırıldı. Arka yığına parçalar eklemek istemiyorsanız, aşağıdaki kod parçacığını kullanmalısınız:

    public static void replaceFragment (@NonNull FragmentManager fragmentManager,
            @NonNull Fragment fragment, int frameId){

        checkNotNull(fragmentManager);
        checkNotNull(fragment);
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        transaction.replace(frameId, fragment);
        transaction.disallowAddToBackStack(); // <-- This makes magic!
        transaction.commit();
    }

Aşağıda bunun nasıl kullanıldığına dair sevimli bir örnek var:

GameFragment fragment = GameFragment.newInstance(mGameObject, currentQuestion);
ActivityUtils.replaceFragment(getFragmentManager(), fragment, R.id.main);

6
Nerede kullanımdan kaldırıldı? Belgelerde veya FragmentTransaction kaynağında hiçbir şey görmüyorum.
Rup

3
Dikkat edin, eğer siz disallowAddToBackStack, ileride yapılacak addToBackStack çağrıları IllegalStateException atacaktır. AddToBackStack zaten çağrılmışsa, bu yöntem IllegalStateException oluşturur.
Kathir
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.