2012-03-24 20 views
19

Android’de Fragments’ı öğrenmeye çalışıyorum ve çeşitli örnekler buldum. Bunu yapmak için farklı yollar var gibi görünüyor ve sadece doğru yolun hangisi olduğuna dair bir tavsiye almak istedim ya da en azından hangi durumlarda Başka bir yerde kullanılmalıdır.Android Fragmanlar 1 parçayı yeniden kullanmalı mıyım yoksa yeni örnekler mi oluşturmalı?

Bir örnek, bir parça ve bir FrameLayout içeren bir düzen oluşturdu. Kodda, ListFragment öğesinden bir öğe seçildiğinde, yeni bir Fragment oluşturulur (kurucuda bazı veriler gerekir) ve FrameLayout bu yeni Fragment ile değiştirilir (FragmentTransaction.replace() kullanılarak).

Başka bir örnekte, 2 parçayı yan yana bildiren bir düzen dosyası vardır. Şimdi, kullanıcı listedeki bir öğeyi bir parçadan seçtiğinde, diğer fragmana veriyi güncellemek için (seçilen öğeye göre) bir çağrı yapılır.

Bu yüzden, bu yöntemlerden herhangi birinin diğeri üzerinde mi tercih edildiğini mi yoksa birisinin kullanılması gereken belirli durumlar olup olmadığını mı merak ediyorum?

DÜZENLEME:

1:

 mCurCheckPosition = index; 

     if (mDualPane) { 
      // We can display everything in-place with fragments, so update 
      // the list to highlight the selected item and show the data. 
      getListView().setItemChecked(index, true); 

      // Check what fragment is currently shown, replace if needed. 
      DetailsFragment details = (DetailsFragment) 
        getFragmentManager().findFragmentById(R.id.details); 
      if (details == null || details.getShownIndex() != index) { 
       // Make new fragment to show this selection. 
       details = DetailsFragment.newInstance(index); 

       // Execute a transaction, replacing any existing fragment 
       // with this one inside the frame. 
       FragmentTransaction ft = getFragmentManager().beginTransaction(); 
       ft.replace(R.id.details, details); 
       ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); 
       ft.commit(); 
      } 

     } else { 
      // Otherwise we need to launch a new activity to display 
      // the dialog fragment with selected text. 
      Intent intent = new Intent(); 
      intent.setClass(getActivity(), DetailsActivity.class); 
      intent.putExtra("index", index); 
      startActivity(intent); 
     } 

2: Yani

public void onListItemClick(ListView l, View v, int position, long id) { 
    String item = (String) getListAdapter().getItem(position); 
    DetailFragment fragment = (DetailFragment) getFragmentManager() 
      .findFragmentById(R.id.detailFragment); 
    if (fragment != null && fragment.isInLayout()) { 
     fragment.setText(item); 
    } else { 
     Intent intent = new Intent(getActivity().getApplicationContext(), 
       DetailActivity.class); 
     intent.putExtra("value", item); 
     startActivity(intent); 

    } 

} 

cevap

20

Sadece merak ediyorum burada atıfta bulundu iki yöntemden biri için kodudur Bu yöntemlerden herhangi biri diğeri üzerinde tercih edilirse veya birisinin kullanılması gereken belirli durumlar varsa?

fiili parçası (yani, aynı parça sınıftır) değiştirmek gerekmez, ben aktiviteye olurdu onu varsayarak onu (senin senaryo # 2) yerine yerine o parça üzerindeki yöntemini çağırın bulunmaktadır. Çalışma süresinde çok daha az pahalı ve kod yazmak da muhtemelen daha kolay. Bununla birlikte, parçanın farklı olması gerekebilir (örneğin, tıklattığınıza bağlı olarak, listede temsil edilen farklı model nesneler için farklı parçalar olabilir), ardından parçanın değiştirilmesi gerekli olacaktır. (senaryonuz # 1). Bu olayın aynı sınıfta olması için parçasının bölümünün gerçekleştiği durumu en iyi duruma getirebilirsiniz, ancak önce parçayı değiştirerek ve zamana ve eğime sahip olduğunuz zaman optimizasyon hakkında endişelenmeye çalışarak odaklanmam gerekir .

Yapısal olarak, # 2 kodunuzun hayranı değilim. IMHO, fragmanlar doğrudan diğer fragmanlar ile konuşmamalıdır. Tercih ettiğim model, parçaların sadece kendi kalıpları ve modelleri içindeki şeylere odaklanarak "örgülerine yapışmasını" sağlamaktı. Kullanıcı arayüzünün diğer bölümlerini etkileyen olaylar için (ör. Liste tıklaması), parçanın aktiviteyi bildirmesi (örneğin bir dinleyici arayüzü aracılığıyla). Aktivite, hangi fragmanların etrafında olması gerektiğini bilen, çünkü onları ilk sırada yaratan şey. Etkinlik daha sonra diğer parça ile konuşabilir (eğer varsa), diğer parçayı yaratabilir (eğer oda varsa) veya başka bir aktivite başlatabilir. # 2 yaklaşımınızı tercih ederseniz, bunu kullanmaya davetlisiniz - bu sizin durumunuzda yaptığım şey değil.

İlgili konular