2015-07-05 13 views
32

Fragment i niestandardowy widok mogą osiągnąć podobną funkcję, Wiem, że fragment jest bardziej przydatny w porównaniu z niestandardowym widokiem, innymi korzyściami/ulepszeniami do używania Fragmentu? Czy fragment ma zastąpić widok niestandardowy, czy tylko ulepszenie do określonego celu?Fragment a niestandardowy widok w Androidzie

Na przykład, kod poniżej fragment:

public class TestFragment extends Fragment { 

    private TextView tv_name; 
    private Button btn_play; 
    private Button btn_delete; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     return inflater.inflate(R.layout.testfragment, container, false); 
    } 

    @Override 
    public void onStart() { 
     super.onStart(); 

     tv_name = (TextView)getView().findViewById(R.id.tv_name); 
     btn_play = (Button)getView().findViewById(R.id.btn_play); 
     btn_delete = (Button)getView().findViewById(R.id.btn_delete); 

    } 
} 

Kod dla widoku własnego:

public class TestCustomView extends LinearLayout { 

    private TextView tv_name; 
    private Button btn_play; 
    private Button btn_delete; 

    public TestCustomView(Context context, AttributeSet attrs){ 
     super(context, attrs); 

     setOrientation(LinearLayout.HORIZONTAL); 
     setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); 

     tv_name = new TextView(context); 
     addView(tv_name); 

     btn_play = new Button(context); 
     addView(btn_play); 

     btn_delete = new Button(context); 
     addView(btn_delete); 
    } 

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     return inflater.inflate(R.layout.testfragment, container, false); 
    } 
} 

Zarówno TestFragment i TestCustomView można utworzyć widok składają TextView i Buttons i użyj znaczników Framelayout/fragment i com.packagename.TestCustomView, aby zadeklarować w działaniu " s plik układu XML, ale jakie są zalety korzystania z Fragmentu?

+0

Fragmenty są przydatne, gdy potrzebujesz dostępu do czegoś, czego nie ma widok, np. informacje o cyklu życia Fragmentu lub coś w rodzaju "LoaderManager". – Karakuri

Odpowiedz

21

Fragment może być stosowany w różnych scenariuszach, ale najczęściej używane są:

  • otoki wokół myślą
  • bezgłowy fragment - czyli bez widoku => nie bardzo pomocny w ogóle, ale może być stosowany
  • Wygodne do przechowywania fragment - może być dowolnym z powyższych. Dzięki zastosowaniu Fragment.setRetainInstance(true) można ominąć Fragment.onDestroy(), czyli może przechowywać dane fragment o zmianach konfiguracyjnych ale wyświetlać fragment konstrukcji jest jeszcze zniszczona/odtworzone
  • mogą być dodawane do aktywności odwrotnej stosie, czyli łatwego przycisk Powrót poprzedniego stanu przywrócić

There to przypadki, w których fragment jest pełnym bólem w szyi, a są przypadki, w których mogą szybciej osiągnąć wyniki.

Dla niektórych niestandardowych i bardziej elastycznych sytuacji fragmenty mogą się zagracać, a zarządzanie nimi będzie trudne. Bezpośrednie zajmowanie się widokami może być bardzo przydatne i pomocne w niektórych przypadkach. Ale wszystko opiera się na wymaganiach.

Uwaga: ma swój własny cykl życia i może przechowywać/odtwarzać stan zapisanej instancji. Trochę więcej pracy, ale ma również opcję.

+0

Niż za odpowiedź. Byłoby miło zobaczyć kilka konkretnych przykładów, które pokazują plusy i minusy używania fragmentów na widokach i odwrotnie, aby lepiej zrozumieć, jakie podejście jest bardziej odpowiednie. Obecnie wydaje mi się, że fragmenty są drogą do zrobienia, ale znowu kilka przykładów może pomóc w zrozumieniu możliwych wad tego podejścia. –

13

Fragmenty mają swój własny cykl życia, który może stanowić przeszkodę lub premię, w zależności od potrzeb.

Fragmenty otrzymują metody cyklu życia, takie jak onResume lub onSavedInstanceState, które mogą pomóc w radzeniu sobie z przejściami stanów w aplikacji. Jeśli korzystasz z niestandardowych widoków, musisz samodzielnie poradzić sobie z takimi rzeczami.

Są ludzie, którzy opowiadają się przeciwko użyciu fragmentów, sugeruję czytanie https://corner.squareup.com/2014/10/advocating-against-android-fragments.html

6

Od Fragment ma swój własny cykl może przetrwać nawet jeśli Activity jest związany został zniszczony. Ta właściwość może być korzystna podczas próby obsługi zdarzeń powodujących zniszczenie działania, takich jak zmiany konfiguracji (np. Zmiana orientacji).

+1

Wiem, że to stara odpowiedź, ale ta odpowiedź wydaje się niepoprawna, ponieważ doc mówi: "Fragment musi zawsze być osadzony w działaniu, a cykl życia fragmentu jest bezpośrednio zależny od cyklu życia aktywności hosta. Na przykład, gdy działanie jest wstrzymane , więc wszystkie są w nim fragmenty, a gdy działanie jest niszczone, tak samo wszystkie fragmenty. Jednak podczas gdy aktywność jest uruchomiona (jest w stanie wznowionego cyklu życia), możesz manipulować każdym fragmentem niezależnie, na przykład dodawać lub usuwać . " Źródło: https://developer.android.com/guide/components/fragments.html – Pelpotronic

10

Niestandardowe widoki mają tę zaletę, że ich głównym celem jest wyświetlanie danych na ekranie.Muszą polegać na innych komponentach, aby zrobić więcej.

Pomyśl o Fragmentach jako jednostce funkcjonalnej, sposobie wyświetlania części interfejsu, która ma określony cel, przy użyciu jednego lub więcej widoków. Fragmenty są połączone z cyklem życia działania i mogą zawierać i kontrolować programy ładujące w celu zapełnienia widoków danymi. Mogą również zawierać pod-fragmenty. Wreszcie można je również dodać do syntetycznego stosu tylnego. Mogą robić wiele rzeczy i są nieco skomplikowane do nauki.

Jak widać, Fragmenty mają znacznie więcej wspólnego z działaniami niż z widokami niestandardowymi.

Na marginesie fragmenty mogą być również bezgłowe (bez interfejsu użytkownika). Fragmenty bezgłowe stanowią sposób na enkapsulację nie-wizualnej funkcjonalności opartej na cyklu życia działania w oddzielnym komponencie.

+3

Wszystko prawda, ale to nie wyjaśnia, jaka jest korzyść z używania fragmentu na widok niestandardowy. – alfasin

+0

W przykładzie podanym w pytaniu nie byłoby żadnej korzyści, ponieważ wyświetla on tylko statyczne dane z układu. W rzeczywistych przykładach, kiedy musisz budować złożone interfejsy, opierając się na interakcji użytkownika, ładować dane, tworzyć sekcje w aplikacji itp., Musisz używać obu jednocześnie. Punktem mojej odpowiedzi jest to, że nie można ich porównywać na tym samym poziomie, ponieważ mają one różne cele. – BladeCoder

-4

Fragment może zawierać pewne widoki, ale widok nie powinien zawierać fragmentu. Więc jako sposób strukturyzacji rzeczy: działalności -> Fragment -> Zobacz

A wszystko to zależy od wymagań i jak można obsługiwać strukturę aplikacji.

Powiązane problemy