SORU
21 EYLÜL 2012, Cuma


Android ile ilgili sorunlar Parçası yığın geri

Android parça backstack iş gibi görünüyor şekilde büyük bir sorunum var ve sunulan herhangi bir yardım için minnettar olacaktır.

3 parça var düşünün

[1] [2] [3]

Kullanıcı [1] > [2] > [3] gidin ama yolda (düğmeye basarak geri) [3] > [1] geri edebilmek için istiyorum.

Hayal olurdu bu parça tutucu XML olarak tanımlanmış bir parçası haline getiren bir hareket oluştururken addToBackStack(..) [2] aramayarak gerçekleştirilebilir.

Gerçeğin bu gibi görünüyor olsa da, eğer istemiyorum [2] görünür tekrar ne zaman kullanıcı presler geri düğmesi [3], değilim Ara addToBackStack hareket gösteriyor parçası [3]. Bu tamamen karşı sezgisel (belki iOS dünyadan geliyor gibi görünüyor.

Zaten eğer bu şekilde yaparsam, [1] > [2] ben gidip geri basın, beklendiği gibi [1] geri geldim.

[1] > [2] > [3] gidip, sonra geri tuşuna basın [1] (beklendiği gibi) geri atlamak. Şimdi garip davranışlar çalıştığımda oluyor ve [1] [2] tekrar atlamak. Öncelikle [3] [2] görünümüne gelmeden kısa bir süre yanar. Eğer bu noktada tekrar basarsam [3] görüntülenir ve eğer bir kez daha basarsanız uygulaması çıkar.

Kimse bana ne, burada neler olduğunu anlamak için yardımcı olabilir?


Ve işte benim asıl etkinlik için dosya xml düzeni:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="fill_parent"
          android:layout_height="fill_parent"
          android:orientation="vertical" >

<fragment
        android:id="@ id/headerFragment"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        class="com.fragment_test.FragmentControls" >
    <!-- Preview: layout=@layout/details -->
</fragment>
<FrameLayout
        android:id="@ id/detailFragment"
        android:layout_width="match_parent"
        android:layout_height="fill_parent"

        />



Güncelleme Bu nav hiyerarşi tarafından inşa etmek için kullanıyorum kodudur

    Fragment frag;
    FragmentTransaction transaction;


    //Create The first fragment [1], add it to the view, BUT Dont add the transaction to the backstack
    frag = new Fragment1();

    transaction = getSupportFragmentManager().beginTransaction();
    transaction.replace(R.id.detailFragment, frag);
    transaction.commit();

    //Create the second [2] fragment, add it to the view and add the transaction that replaces the first fragment to the backstack
    frag = new Fragment2();

    transaction = getSupportFragmentManager().beginTransaction();
    transaction.replace(R.id.detailFragment, frag);
    transaction.addToBackStack(null);
    transaction.commit();


    //Create third fragment, Dont add this transaction to the backstack, because we dont want to go back to [2] 
    frag = new Fragment3();
    transaction = getSupportFragmentManager().beginTransaction();
    transaction.replace(R.id.detailFragment, frag);
    transaction.commit();


     //END OF SETUP CODE-------------------------
    //NOW:
    //Press back once and then issue the following code:
    frag = new Fragment2();
    transaction = getSupportFragmentManager().beginTransaction();
    transaction.replace(R.id.detailFragment, frag);
    transaction.addToBackStack(null);
    transaction.commit();

    //Now press back again and you end up at fragment [3] not [1]

Çok teşekkürler

CEVAP
12 Ocak 2013, CUMARTESİ


AÇIKLAMAne oluyor burada?) (:

Eğer aklınızda böyle devam edersek .() yerine = .() çıkarın.() Ekle belgelerle biliyoruz ()

Bir kap eklendi varolan bir parça değiştirin. Bu aslında(Parçası) şu anda kaldırmak çağıran aynı aynı containerViewİd ve daha sonra eklenen parçalar eklendi (int, Fragman, dizi) aynı argümanları burada verilen ekleyin.

oluyor o zaman bu (frag için numara daha açık hale getirmek için ekliyorum) gibi

// transaction.replace(R.id.detailFragment, frag1);
Transaction.remove(null).add(frag1)  // frag1 on view

// transaction.replace(R.id.detailFragment, frag2).addToBackStack(null);
Transaction.remove(frag1).add(frag2).addToBackStack(null)  // frag2 on view

// transaction.replace(R.id.detailFragment, frag3);
Transaction.remove(frag2).add(frag3)  // frag3 on view

(burada yanıltıcı şeyler olmaya başlar)

Unutmayın .() addToBackStack sadece tasarruf HAREKETİ kendisi gibi PARÇASI değil!

Şimdi düzenine frag3:

< press back button >
// System pops the back stack and find the following saved back entry to be reversed:
// [Transaction.remove(frag1).add(frag2)]
// so the system makes that transaction backward!!!
// tries to remove frag2 (is not there, so it ignores) and re-add(frag1)
// make notice that system doesn't realise that there's a frag3 and does nothing with it
// so it still there attached to view
Transaction.remove(null).add(frag1) //frag1, frag3 on view (OVERLAPPING)

// transaction.replace(R.id.detailFragment, frag2).addToBackStack(null);
Transaction.remove(frag3).add(frag2).addToBackStack(null)  //frag2 on view

< press back button >
// system makes saved transaction backward
Transaction.remove(frag2).add(frag3) //frag3 on view

< press back button >
// no more entries in BackStack
< app exits >

Olası çözüm:

FragmentManager.BackStackChangedListener onBackStackChanged() sırt ve mantık yığını yöntemi Uygula: değişiklikleri izlemek için kullanmayı düşünebilirsiniz

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Ricardo Cerqueira

    Ricardo Cerq

    28 Mayıs 2008
  • Sam Kear

    Sam Kear

    14 Temmuz 2007
  • trickycharms

    trickycharms

    6 Aralık 2013