2014-04-12 18 views
9

Instagram Android istemcide kullanılana benzer bir navigasyon sistemi kullanmam gerekiyor.Android uygulamasında uygulama içi navigasyon sistemi gibi uygulama yapma

  1. Her zaman ekranın altında kalıcı bir sekme olmalıdır.
  2. Kullanıcı bu sekmelerden birinde daha derine gittiğinde, bir ayrıntı görünümüne diyelim, sonra başka bir sekmeye geçip ardından önceki sekmeye geri döner, en son gösterilen (daha ayrıntılı) ayrıntı görünümü, ve geri presler, söz konusu sekmenin ana görünümüne kadar geri yinelenmelidir.

    • Ben altta menü gösteren bir MainAcitvity vardır:

Şimdiye kadar ne ile geldi gelmiş şudur.

  • Bir menü noktası seçerken, uygun Parçacık gösterilir.
  • Kullanıcı bir Fragman içinde daha fazla gezinirse, daha sonra, içeriği verilen kriterlerle değiştirmek için MainActivity'den sorar ve bu da Gösterilen Parçayı değiştirir.
  • FragmentTransaction'ın addToBackStack() yöntemini çağırarak, tüm Fragment değişikliklerini backStack'a ekliyorum.
  • Bu noktada takılıyorum ve arka baskılardaki parçaları nasıl değiştirebileceğimi ve sekmelerin ana görünümleri yerine daha derin görünümler gösterildiğinde sekme yönlendirmelerinin nasıl işleneceğini anlayamıyorum.

    Her sekme için kendi ayrı "backstack uygulamalarını" kullanmayı düşünüyorum. Kullanıcı bir sekmede daha derine gittiğinde, benzersiz bir "etiket" oluşturur ve addToBackStack() öğesini çağırırken bu etiketi kullanır ve ayrıca etiketi benim tarafımdan uygulanan "backStack" içine yerleştirir. Kullanıcının bu sekmeye tekrar girmesi durumunda, bu sekme için "backStack" içinde herhangi bir etiketim olup olmadığını kontrol edebilirim ve eğer öyleyse, o zaman MainActivity'nin fraggmentManager'ındaki gerçek backStack'a bakın ve o.

    Henüz daha iyi bir şey ile gelemedim. Söz konusu davranışa uymanın daha iyi/basit bir yolu var mı? Bir şey mi eksik? (Bu, Android dünyasında gerçekten kötü bir uygulama tasarımı olduğunu biliyorum, ancak başka bir soru)

    +0

    Aynı durumdayım dostum, eğer bu tür bir gezintiyi nasıl yapacağınızı bilerek, bunu göndermenizi ve bana teşekkür etmenizi takdir edersiniz, teşekkürler – Hugo

    +0

    @Hugo Yanıtlarımın bir cevabı olarak gönderdim. Faydalı bulursanız lütfen bana bildirin. –

    cevap

    5

    Soru çok ölü olduğu için bir yanıt gönderiyorum, ancak sonuç başkaları için yararlı olabilir.

    İyi çalışan eski moda NavgationDrawer deseniyle yapışmayı bitirdik. Ancak bu arada, kendi özel mantığına sahip olan Hosting Uygulamasına bir Fragman sağlayan bir kütüphane projesi uygulamak zorunda kaldım. Bu Fragman daha sonra kendi içinde başka Fragmanlar eklemek için ChildFragmentManager'ını kullandı. ChildFragmentManager, Android Support v4 lib uygulamasına geri yüklenir, böylece her yerde temel olarak kullanabilirsiniz.

    Yani, daha derine inebileceğiniz x Menü noktalarını istediğinizi söyleyelim. Bunlar, o Menü içinde daha ayrıntılı gezinmek için başka Fragments eklemek üzere kendi ChildFragmentManager'larını kullanan Fragmanlar olacaktır. ChildFragmentManager'lar kendi arka yığınlarına sahiptir, bu yüzden taşıma durumları hakkında çok fazla endişelenmenize gerek yoktur. Başka bir Menü seçilirse, MainActivitys FragmentManager'daki karşılık gelen Fragmenti arayabilir ve ona geri dönebilir veya henüz eklenmemişse ekleyebilirsiniz.

    Dikkatli olun, ChildFragmentManager'lar otomatik olarak backPressed olayını alamayacağından, geri işlevselliği kendiniz uygulamanız gerekir. Ana Etkinliğinizde onBackPressed olayını ele alarak bunu yapabilirsiniz.o hatalar içeriyor olabilir böylece

    @Override 
    public void onBackPressed() { 
        boolean handled = false; 
        if(getFragmentManager().getBackStackEntryCount() == 0){ 
        // No menu added 
        return super.onBackPressed(); 
        } 
    
        Fragment frag = getFragmentManager().getBackStackEntryAt(getFragmentManager().getBackStackEntryCount() - 1); 
    
        if (frag instanceof XMenuFragment && frag.isVisible()) { 
        FragmentManager childFm = frag.getChildFragmentManager(); 
        if (childFm.getBackStackEntryCount() > 0) { 
         // pop the last menu sub-Fragment 
         childFm.popBackStack(); 
         handled = true 
        } 
        } 
    
        if(!handled){ 
        super.onBackPressed(); 
        } 
    } 
    

    Ben, farklı bir kod kullanılmış, ama kavramın noktası açıktır umuyoruz.

    +0

    great @Csaba Szugyiczki, bu problemi çözmenin ilginç bir yoludur, bunu önümüzdeki günlerde deneyeceğim ve sonuçlarınızı size anlatacağım, çok teşekkür ederim! – Hugo

    +0

    @Hugo Çalıştı mı? –

    +0

    şimdi uygulamanın ortasındayım, ancak şu an için parçaların çözümü mükemmel çalışıyor. @Csaba Szugyiczki sizinkiyle aynı çözüm değil, sanırım benzer. Tamamladıktan sonra bazı kod ile çözüm gönderirim? (muhtemelen önümüzdeki hafta) – Hugo

    İlgili konular