2013-08-23 9 views
27

Android için standart gezinme çekmece modelini uygulayarak, kullanıcının çekmeceden yaklaşık 10 parçaya gidebiliyor.Android: Gezinme çekmecesi öğesine her tıklandığında veya önceden oluşturulmuş parçaları yüklediğinde yeni bir fragman oluşturmak daha mı iyi?

// Somewhere in onCreate 
Fragment[] fragments = new Fragment[n]; 
fragments[0] = new Fragment0(); 
fragments[1] = new Fragment1(); 
... 

// When a new navigation item (at index) is clicked 
FragmentTransaction ft = fragmentManager.beginTransaction(); 
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); 
ft.replace(R.id.container, fragments[index]); 
ft.commit(); 
: aşağıdaki gibi bir şey yapmak için daha verimli olacaktır diye merak edilmiştir

// When a new navigation item at index is clicked 
FragmentTransaction ft = fragmentManager.beginTransaction(); 
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); 
Fragment newFragment = null; 
if (index == 0) 
    fragment = new Fragment0(); 
... 
ft.replace(R.id.container, newFragment); 
ft.commit(); 

: Şu anda, yeni fragmanı, farklı gezinme çekmecesi öğesi şöyle tıklandığında her zaman oluşturma

Başlıca endişem, bazı parçaların önemli miktarda veri tutmasıdır (oldukça büyük listeler ve çok sayıda görünüm). Bütün bu parçaları bellekte tutan herhangi bir sorun var mıydı ve her seferinde yeni fragmanların yaratılması için herhangi bir avantaj sağlıyor mu (parçalar arasındaki daha hızlı geçişler dışında)? Genel olarak 'daha iyi' bir çözüm var mıdır?

+0

Bu problemi daha verimli bir şekilde çözmek için findfragmentbytag kullanılabilir mi acaba? –

+0

Android'in neden olduğu gibi, parçaların kendiliğinden aktivitelere bakmadığını merak ediyorum. – Joffrey

cevap

5

Benzer bir sorunla karşılaştım.

switch (position) { 
    case 0: 
     if (fragmentOne == null) 
      fragmentOne = new FragmentOne(); 
     getSupportFragmentManager().beginTransaction()....... 
     break; 
    case 1: 
     if (fragmentTwo == null) 
      fragmentTwo = new FragmentTwo(); 
     getSupportFragmentManager()...... 
(selectItem yönteminde kullanımı için mi bağlamında) : Bir Parça nesnesi için bir örneğini oluşturmak için her çağrıyı ben sizinkine benzer bir yaklaşım aldı ve işlemci üzerindeki yükü kurtarabilmek için aşağıdaki çimdik yapılan

fragmentOne ve fragmentTwo iki farklı Fragment sınıflar ve fragmentOne ve fragmentTwo onların nesneleri MainActivity

alanlar

Düzenleme olarak ilan edilmiştir:

ne fo nasıl eklemek istiyorum

parçaları tutan dizi ile benzer bir yaklaşım llow. OnCreate'da yeni fragmanlar oluşturmak yerine, bir öğe tıklandığında bunu yapın. OnCreate uygulamasında, başlatıldığında varsayılan olarak seçmek istediğiniz parçayı seçmek için çekmeceye bir çağrı gönderin.

//somewhere in onCreate 
if (savedInstanceState == null) { 
    selectItem(defaultFragment); 
} 
else 
    selectItem(selectedFragment); 
//selectItem is method called by DrawerItemClickListener as well 


//in selectItem: when navigation item at index is clicked, the listener calls this 
switch (index) { 
    case 0: 
     if (fragments == null) { 
      fragments = new Fragment[n]; 
      fragment[0] = new Fragment0(); 
     } 
     else if (fragments[0] == null) { 
      fragments[0] = new Fragment0(); 
     } 
     break; 
    .... 
} 
FragmentTransaction ft = fragmentManager.beginTransaction(); 
... 
ft.replace(R.id.container, fragments[index]); 
ft.commit(); 

OnCreate'daki parçaları başlatmaya gerek yoktur, çünkü bu başlatma işlemini yavaşlatır. Onları gerektiğinde ve sonrasında oluşturun ve ardından varsa aynı olanı kullanın. Yeni fragmanlar sadece ilk kez yüklendiklerinde oluşturulur.

İlgili konular