2012-03-24 10 views
19

Próbuję się nauczyć Fragmentów w Androidzie i na podstawie różnych przykładów, które znalazłem, wydaje się, że są różne sposoby robienia tego i chciałem po prostu uzyskać poradę, która z nich jest poprawna, lub przynajmniej w jakich okolicznościach w jedną stronę powinien być użyty nad innym.Fragmenty Androida powinny ponownie użyć 1 fragment lub utworzyć nowe wystąpienia?

Jeden z przykładów utworzył układ zawierający fragment i FrameLayout. W kodzie, gdy element jest wybierany z ListFragmentu, tworzony jest nowy Fragment (z pewnymi danymi wymaganymi w konstruktorze) i FrameLayout jest zastępowany nowym Fragmentem (za pomocą FragmentTransaction.replace()).

Inny przykład ma plik układu, który deklaruje 2 fragmenty obok siebie. Teraz w kodzie, gdy użytkownik wybierze element z listy w jednym fragmencie, wywoływane jest połączenie z drugim fragmentem, aby zaktualizować dane (w oparciu o wybrany element).

Po prostu zastanawiam się, czy któraś z tych metod jest preferowana w stosunku do drugiej, czy też istnieją pewne okoliczności, w których należy z nich skorzystać?

EDIT: Oto kod dla każdego z dwóch metod miałem na myśli:

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:

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); 

    } 

} 

Odpowiedz

20

Więc jestem po prostu zastanawiasz czy któraś z tych metod jest preferowana względem drugiej, czy też istnieją okoliczności, w których należy z niej skorzystać?

Jeżeli rzeczywisty fragment nie trzeba zmieniać (czyli jest to ta sama klasa fragment), musiałbym aktywność wywołać metodę na tym fragmencie zamiast ją (Twój 2 scenariusz #) zastąpić, zakładając go istnieje. To znacznie mniej kosztowne w czasie wykonywania, i prawdopodobnie łatwiejsze jest również kodowanie.

Jeśli jednak fragment może wymagać innego (np. W zależności od kliknięcia, mogą występować różne fragmenty dla różnych typów obiektów modelu przedstawionych na liście), konieczne będzie zastąpienie fragmentu (Twój scenariusz nr 1). Możesz zoptymalizować przypadek, w którym fragment będzie się składał z tej samej klasy, ale najpierw skupię się na jego działaniu, zastępując fragment i martwiąc się o optymalizację, jeśli/kiedy masz czas i nachylenie .

Nie jestem jednak fanem twojego kodu # 2 strukturalnie. IMHO, fragmenty nie powinny bezpośrednio rozmawiać z innymi fragmentami. Moim preferowanym wzorem jest, aby fragmenty "trzymały się na drutach", koncentrując się wyłącznie na rzeczach w ich własnych widżetach i modelach. W przypadku zdarzeń, które mają wpływ na inne części interfejsu użytkownika (np. Kliknięcie listy), fragment powiadamia o aktywności (np. Za pośrednictwem interfejsu odbiornika). Działanie to ten, który wie, które fragmenty powinny być w pobliżu, ponieważ to on je przede wszystkim stworzył. Aktywność może następnie rozmawiać z innym fragmentem (jeśli istnieje), utworzyć drugi fragment (jeśli jest miejsce) lub rozpocząć inne działanie. Jeśli wolisz swoje # 2, możesz go użyć - po prostu nie jest to, co bym zrobił w twoich okolicznościach.

Powiązane problemy