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:
- jakie są cele wykorzystania fragmentu?
- jakie są zalety i wady korzystania z fragmentów w porównaniu do korzystania z działań/widoków / układów?
Pytania dodatkowe:
- możesz podać kilka naprawdę ciekawych zastosowań fragmentów? Rzeczy, o których Google nie wspomniało w swoich filmach?
- jaki jest najlepszy sposób komunikowania się między fragmentami a działaniami, które je zawierają?
- jakie są najważniejsze rzeczy do zapamiętania, gdy używasz fragmentów? Dowolne wskazówki i ostrzeżenia z Twojego doświadczenia?
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 interfejsActionBar.TabListener
dajeFragmentTransaction
jako argument wejściowy do metodyonTabSelected
. 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
zFragmentPagerAdapter
do tworzenia interfejsów swipe. KodFragmentPagerAdapter
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 jakActionBar
, 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.
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
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.
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ń.
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.
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.
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:
Fragment ma swój własny układ i własne zachowanie z własnymi wywołaniami zwrotnymi cyklu życia.
Możesz dodawać lub usuwać fragmenty w aktywności, gdy aktywność jest bieganie.
Możesz połączyć wiele fragmentów w jednym ćwiczeniu, aby utworzyć interfejs z wieloma panelami.
Fragment może być używany w wielu działaniach.
Cykl życia fragmentu jest ściśle związany z cyklem życia jego aktywności żywiciela.
Gdy aktywność zostanie wstrzymana, wszystkie fragmenty dostępne w acivity również zostaną zatrzymane.
Fragment może zaimplementować zachowanie, które nie ma interfejsu użytkownika komponent.
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.
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.
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.
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.
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();
}
}
}
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.
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:)
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:
- radzenie sobie z różnicami formy urządzenia.
- przekazywanie informacji między ekranami aplikacji.
- Organizacja interfejsu użytkownika.
- Zaawansowane metafory interfejsu użytkownika.
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.
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