Android-potrzebuję kilku wyjaśnień fragmentów a aktywności i poglądów

W Android API 11+ Google wydało nową klasę o nazwie Fragment.

W filmach Google sugeruje, że w miarę możliwości (link1, link2), powinniśmy używać fragmentów zamiast działań, ale nie wyjaśniły one dokładnie dlaczego.

Jaki jest cel fragmentów i jakie są możliwe ich zastosowania(inne niż przykłady interfejsu użytkownika, które można łatwo osiągnąć za pomocą prostych widoków/układów)?

Moje pytanie dotyczy fragmentów:

  1. jakie są cele wykorzystania fragmentu?
  2. jakie są zalety i wady korzystania z fragmentów w porównaniu do korzystania z działań/widoków / układów?

Pytania dodatkowe:

  1. możesz podać kilka naprawdę ciekawych zastosowań fragmentów? Rzeczy, o których Google nie wspomniało w swoich filmach?
  2. jaki jest najlepszy sposób komunikowania się między fragmentami a działaniami, które je zawierają?
  3. jakie są najważniejsze rzeczy do zapamiętania, gdy używasz fragmentów? Dowolne wskazówki i ostrzeżenia z Twojego doświadczenia?
Author: Peter Mortensen, 2012-05-07

12 answers

#1 & #2 Jakie są cele korzystania z fragmentu i jakie są zalety i wady korzystania z fragmentów w porównaniu z używaniem aktywności/widoki / layouty?

Fragmenty są rozwiązaniem Androida do tworzenia interfejsów wielokrotnego użytku. Niektóre z tych samych rzeczy można osiągnąć za pomocą działań i układów (na przykład za pomocą includes). Jednak fragmenty są podłączone do API Androida, od plastra miodu i do góry. Pozwól mi rozwinąć;

  • Na ActionBar. Jeśli chcesz, aby Tab w górze do nawigacji aplikacji, szybko widzisz, że interfejs ActionBar.TabListener daje FragmentTransaction jako argument wejściowy do metody onTabSelected. Prawdopodobnie mógłbyś to zignorować i zrobić coś innego i sprytnego, ale działałbyś przeciwko API, a nie z nim.

  • FragmentManager obsługuje "plecy" dla Ciebie w bardzo sprytny sposób. Powrót nie oznacza powrotu do ostatniej aktywności, jak w przypadku regularnych aktywności. Oznacza powrót do poprzedniego stanu fragmentu.

  • Ty można użyć cool ViewPager z FragmentPagerAdapter do tworzenia interfejsów swipe. Kod FragmentPagerAdapter jest znacznie czystszy niż zwykły adapter i kontroluje instancje poszczególnych fragmentów.

  • Twoje życie będzie o wiele łatwiejsze, jeśli użyjesz fragmentów przy próbie tworzenia aplikacji zarówno na telefony, jak i Tablety. Ponieważ fragmenty są tak powiązane z interfejsami API Honeycomb+, będziesz chciał użyć ich również w telefonach do ponownego użycia kodu. W tym miejscu przydaje się biblioteka zgodności.

  • Możesz nawet i powinieneś używać fragmentów dla aplikacji przeznaczonych tylko dla telefonów. Jeśli masz na myśli przenośność. Używam ActionBarSherlock i bibliotek kompatybilności do tworzenia aplikacji "wyglądających na ICS", które wyglądają tak samo aż do wersji 1.6. Otrzymujesz najnowsze funkcje, takie jak ActionBar, z zakładkami, przepełnieniem, dzielonym paskiem akcji, viewpagerem itp.

Bonus 2

Najlepszym sposobem komunikowania się między fragmentami są intencje. Po naciśnięciu coś w fragmencie, który zazwyczaj nazywamy StartActivity() z danymi na nim. Intencja jest przekazywana na wszystkie fragmenty aktywności, którą uruchamiasz.

 242
Author: Glenn Bech,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-31 11:58:55
  1. Fragment jest częścią aktywności, która wnosi do niej swój własny interfejs użytkownika. Fragment może być uważany za Poddziałanie. Gdzie jako Pełny ekran, z którym użytkownik wchodzi w interakcję, nazywany jest aktywnością. Działanie może zawierać wiele fragmentów.Fragmenty są w większości podrzędną częścią aktywności.

  2. Działanie może zawierać 0 lub wiele fragmentów w zależności od rozmiaru ekranu. Fragment może być ponownie użyty w wielu czynnościach, więc działa jak wielokrotnego użytku Składnik działań.

  3. Fragment nie może istnieć niezależnie. To powinno być zawsze częścią aktywności. Gdzie jako aktywność może istnieć bez żadnego fragmentu w niej.

 88
Author: Jagan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-08 07:29:52

Nie jestem pewien, o jakim filmie(filmach) mówisz, ale wątpię, że mówią, że powinieneś używać fragmentów zamiast działań, ponieważ nie są one bezpośrednio wymienne. W Poradniku dewelopera znajduje się dość szczegółowy wpis , rozważ przeczytanie go po szczegóły.

Krótko mówiąc, fragmenty żyją wewnątrz czynności, a każda czynność może pomieścić wiele fragmentów. Podobnie jak działania, mają określony cykl życia, w przeciwieństwie do działań, nie są to komponenty aplikacji najwyższego poziomu. Zalety fragmentów obejmują ponowne użycie kodu i modułowość (np. używanie tego samego widoku listy w wielu czynnościach), w tym możliwość budowania interfejsów wielopanowych (głównie przydatnych na tabletach). Główną wadą jest (niektóre) dodatkowa złożoność. Ogólnie można osiągnąć to samo z (niestandardowymi) widokami w niestandardowy i mniej solidny sposób.

 63
Author: Nikolay Elenkov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-24 14:25:48

Fragment jest fragmentem interfejsu użytkownika aplikacji lub zachowania, które mogą być umieszczone w aktywności, które umożliwiają bardziej modułowe projektowanie aktywności. Nie będzie źle, jeśli powiemy, że fragment jest rodzajem subaktywności.

Poniżej znajdują się ważne punkty dotyczące fragmentu:

  1. Fragment ma swój własny układ i własne zachowanie z własnymi wywołaniami zwrotnymi cyklu życia.

  2. Możesz dodawać lub usuwać fragmenty w aktywności, gdy aktywność jest bieganie.

  3. Możesz połączyć wiele fragmentów w jednym ćwiczeniu, aby utworzyć interfejs z wieloma panelami.

  4. Fragment może być używany w wielu działaniach.

  5. Cykl życia fragmentu jest ściśle związany z cyklem życia jego aktywności żywiciela.

  6. Gdy aktywność zostanie wstrzymana, wszystkie fragmenty dostępne w acivity również zostaną zatrzymane.

  7. Fragment może zaimplementować zachowanie, które nie ma interfejsu użytkownika komponent.

  8. Fragmenty zostały dodane do API Androida w Android 3 (Honeycomb) z API w wersji 11.

Aby uzyskać więcej informacji, odwiedź oficjalną stronę, fragmenty.

 43
Author: mani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-31 17:05:41

To ważna informacja, którą znalazłem na fragmentach:

Historycznie każdy ekran w aplikacji na Androida został zaimplementowany jako osobne działanie. Stwarza to wyzwanie w przekazywaniu informacji między ekranami, ponieważ mechanizm Android Intent nie pozwala na przekazywanie typu odniesienia (tj. obiektu) bezpośrednio między działaniami. Zamiast tego obiekt musi być serializowany lub dostępny globalnie.

Poprzez zrobienie z każdego ekranu osobnego fragmentu, te dane przechodzą ból głowy jest całkowicie unikany. Fragmenty zawsze istnieją w kontekście danej aktywności i zawsze może uzyskać do niej dostęp. Przechowując informacje interesujące w ramach działalności, Fragment dla każdego ekran może po prostu uzyskać dostęp do odniesienia do obiektu za pośrednictwem aktywności.

 13
Author: Kaveesh Kanwal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-31 17:09:48

Fragmenty są szczególnie przydatne w niektórych przypadkach, np. gdy chcemy zachować szufladę nawigacyjną na wszystkich naszych stronach. Możesz nadmuchać układ ramki dowolnym fragmentem i nadal mieć dostęp do szuflady nawigacyjnej.

Gdybyś użył jakiejś czynności, musiałbyś trzymać szufladę we wszystkich czynnościach, co powoduje, że kod jest zbędny. Jest to jedno z ciekawych zastosowań fragmentu.

Jestem nowy w Androidzie i nadal uważam, że fragment jest pomocny w ten sposób.

 7
Author: Nithin Baby,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-31 17:09:16

Wiem, że to już było dyskutowane na śmierć, ale chciałbym dodać jeszcze kilka punktów:

  • Fragi mogą być używane do wypełniania Menu s i mogą samodzielnie obsługiwać MenuItem kliknięć. W ten sposób daje dalsze opcje modulacji dla Twoich działań. Możesz robić rzeczy ContextualActionBar i tak dalej bez wiedzy Twojej aktywności i zasadniczo możesz oddzielić je od podstawowych rzeczy, które obsługuje Twoja aktywność (Nawigacja/Ustawienia/Informacje).

  • Frag rodzica z dzieckiem fragi mogą dać dalsze opcje modulizacji komponentów. Np. możesz łatwo wymieniać fragów, umieszczać nowe fragów wewnątrz pagera lub usuwać je, zmieniać ich kolejność. Wszystko bez Twojej aktywności, która nic o tym nie wie, skupiając się na rzeczach wyższego poziomu.

 4
Author: einschnaehkeee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-17 08:16:05

Fragment reprezentuje zachowanie lub część interfejsu użytkownika w działaniu. Można łączyć wiele fragmentów w jednym ćwiczeniu, aby utworzyć interfejs z wieloma panelami i ponownie wykorzystać fragment w wielu ćwiczeniach. Fragment można traktować jako modułową sekcję aktywności, która ma swój własny cykl życia, otrzymuje własne zdarzenia wejściowe i którą można dodawać lub usuwać, gdy aktywność jest uruchomiona.

  • Każdy fragment można manipulować niezależnie, np. dodawać lub usuwać. Kiedy wykonujesz taką transakcję fragmentaryczną, możesz również dodać ją do stosu zwrotnego, który jest zarządzany przez aktywność-każdy wpis tylnego stosu w aktywności jest rekordem transakcji fragmentarycznej, która miała miejsce. Tylny stos pozwala użytkownikowi odwrócić transakcję fragmentu (nawigować do tyłu), naciskając przycisk Wstecz.

  • Po dodaniu fragmentu jako części układu aktywności, znajduje się on w grupie widoków wewnątrz hierarchii widoków aktywności, a fragment definiuje swój własny widok układ. Fragment można wstawić do układu aktywności, deklarując go w pliku układu aktywności jako element lub z kodu aplikacji, dodając go do istniejącej grupy widoków. Jednak fragment nie musi być częścią układu aktywności; można również użyć fragmentu bez własnego interfejsu użytkownika jako niewidocznego pracownika dla aktywności.

  • Na przykład: Jeśli miałbyś używać NavigationDrawer bez fragmentów to najlepiej byłoby zachować instancja NavigationDrawer w pojedynczym działaniu, a gdy nawigujesz po aplikacji, wybierając z pozycji w NavigationDrawer, to każde z tych działań, które są uruchomione, nie powinno implementować NavigationDrawer, ale zamiast tego powinno wdrożyć przycisk Wstecz, aby przejść z powrotem do"głównej" /pojedynczego działania, w którym NavigationDrawer został zaimplementowany.

    Uwaga: Jeśli chcesz zaimplementować NavigationDrawer w wielu działaniach, musisz odtworzyć nową instancję Nawigacja w każdej aktywności, którą chcesz wyświetlić.

    Przypuszczam, że byłoby to wadą w porównaniu z używaniem fragmentów, podczas gdy gdybyś użył fragmentu, Nie potrzebowałbyś wielu instancji szuflady, potrzebowałbyś tylko jednego.

    Szuflada z fragmentami zamiast czynności

    Jeśli używasz NavigationDrawer z fragmentami, szuflada powinna być zaimplementowana w jednym ćwiczeniu, a po wybraniu każdego elementu szuflady, ich zawartość jest wyświetlana w każdym z nich bardzo własne fragmenty.

  • Komunikacja pomiędzy fragmentem a jego aktywnością : Aby umożliwić fragmentowi komunikowanie się aż do jego aktywności, możesz zdefiniować interfejs w klasie Fragment i zaimplementować go w ćwiczeniu.Fragment przechwytuje implementację interfejsu podczas swojej metody cyklu życia onAttach () , a następnie może wywołać metody interfejsu w celu komunikacji z działaniem.

    public class YourFragment extends ListFragment {
    OnSelectedListener mCallback;
    
    // Container Activity must implement this interface
    public interface OnSelectedListener {
        public void onItemSelected(int position);
    }
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.your_view, container, false);
    }
    
    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
    
        // This makes sure that the container activity has implemented
        // the callback interface. If not, it throws an exception
        try {
            mCallback = (OnSelectedListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString()
                    + " must implement OnSelectedListener");
        }
    }
    
    }...
    

Teraz fragment może dostarczać wiadomości do działanie poprzez wywołanie metody onItemSelected () (lub innych metod w interfejsie) przy użyciu instancji mCallback interfejsu OnSelectedListener.

public static class MainActivity extends Activity
        implements YourFragment.OnSelectedListener{
    ...

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_activity);
    }

    public void onItemSelected(int position) {
        // The user selected the headline of an article from the YourFragment
        // Do something here to display that article

        YourFragment yourFrag = (YourFragment)
                getSupportFragmentManager().findFragmentById(R.id.your_fragment);

        if (yourFrag != null) {
            // If your frag is available, we're in two-pane layout...

            // Call a method in the YourFragment to update its content
            yourFrag.updateView(position);
        } else {
            // Otherwise, we're in the one-pane layout and must swap frags...

            // Create fragment and give it an argument for the selected item
            YourFragment newFragment = new YourFragment();
            Bundle args = new Bundle();
            args.putInt(YourFragment.ARG_POSITION, position);
            newFragment.setArguments(args);

            FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

            // Replace whatever is in the fragment_container view with this fragment,
            // and add the transaction to the back stack so the user can navigate back
            transaction.replace(R.id.fragment_container, newFragment);
            transaction.addToBackStack(null);

            // Commit the transaction
            transaction.commit();
        }
    }
}
 1
Author: Zealous,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-19 07:33:16

Fragment żyje wewnątrz działania.

Podczas gdy aktywność żyje sama w sobie.

 0
Author: superkytoz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-14 11:15:58

Fragmenty żyją w aktywności i mają:

  • własny cykl życia
  • własny układ
  • własne fragmenty dziecka itp.

Pomyśl o fragmentach jako o podaktywności głównej aktywności, do której należy, nie może istnieć sama i może być wywoływana / ponownie używana ponownie i ponownie. Mam nadzieję, że to pomoże:)

 0
Author: maniix,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-15 12:46:47

1.Cele wykorzystania fragmentu?

  • Ans:
    1. radzenie sobie z różnicami formy urządzenia.
    2. przekazywanie informacji między ekranami aplikacji.
    3. Organizacja interfejsu użytkownika.
    4. Zaawansowane metafory interfejsu użytkownika.
 0
Author: Prithiv Dharmaraj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-28 09:19:50

Activity to pełnoekranowe komponenty w aplikacji z paskiem narzędzi, reszta to najlepiej fragmenty. Jedno pełnoekranowe działanie nadrzędne z paskiem narzędzi może mieć wiele paneli, przewijalnych stron, okien dialogowych itp. (wszystkie fragmenty), z których wszystkie mogą być dostępne od rodzica i komunikować się za pośrednictwem rodzica.

Przykład -

Działanie A, Działanie B, Działanie C -

  • wszystkie czynności muszą mieć powtarzany ten sam kod, aby pokazać podstawowe na przykład pasek narzędzi lub dziedziczyć po aktywności rodzica (staje się uciążliwe w zarządzaniu).
  • aby przejść z jednej czynności do drugiej, albo wszystkie muszą być w pamięci (na górze), albo jedna musi zostać zniszczona, aby druga się otworzyła.
  • [[9]}komunikacja między działaniami może odbywać się poprzez intencje.

Vs

Działanie A, Fragment 1, Fragment 2, Fragment 3 -

  • brak powtarzania kodu, wszystkie ekrany mają paski narzędzi itp. z tej jednej czynności.
  • kilka sposobów na przejście z jednego fragmentu do następnego-widok pagera, wielu okienek itp.
  • aktywność ma najwięcej danych, więc potrzebna jest minimalna komunikacja między fragmentami. Jeśli nadal jest to konieczne, można to łatwo zrobić za pomocą interfejsów.
  • fragmenty nie muszą być pełnoekranowe, obciążające elastyczność w ich projektowaniu.
  • fragmenty nie muszą nadmuchiwać układu, jeśli widoki nie są konieczne.
  • kilka czynności może używać tego samego fragmentu.
 0
Author: Chandrima Bhattacharjee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-28 23:14:09