Podczas programowania dla Android
możesz ustawić docelowy (lub minimalny) pakiet SDK na 4 (API 1.6) i dodać pakiet zgodności dla systemu Android (v4), aby dodać obsługę Fragments
. Wczoraj zrobiłem to i pomyślnie zaimplementowałem Fragments
wizualizację danych z niestandardowej klasy.
Moje pytanie brzmi: jaka jest korzyść z używania Fragments
w przeciwieństwie do zwykłego uzyskiwania widoku z niestandardowego obiektu i nadal obsługującego API 1.5?
Na przykład, powiedzmy, że mam klasę Foo.java:
public class Foo extends Fragment {
/** Title of the Foo object*/
private String title;
/** A description of Foo */
private String message;
/** Create a new Foo
* @param title
* @param message */
public Foo(String title, String message) {
this.title = title;
this.message = message;
}//Foo
/** Retrieves the View to display (supports API 1.5. To use,
* remove 'extends Fragment' from the class statement, along with
* the method {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)})
* @param context Used for retrieving the inflater */
public View getView(Context context) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = inflater.inflate(R.layout.foo, null);
TextView t = (TextView) v.findViewById(R.id.title);
t.setText(this.title);
TextView m = (TextView) v.findViewById(R.id.message);
m.setText(this.message);
return v;
}//getView
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if (container == null) {
return null;
}
View v = inflater.inflate(R.layout.foo, null);
TextView t = (TextView) v.findViewById(R.id.title);
t.setText(this.title);
TextView m = (TextView) v.findViewById(R.id.message);
m.setText(this.message);
return v;
}//onCreateView
}//Foo
Obie metody są bardzo proste do utworzenia i pracy w działaniu, które, powiedzmy, ma List<Foo>
do wyświetlenia (na przykład programowe dodawanie każdej z nich do a ScrollView
), więc są Fragments
naprawdę bardzo przydatne, czy też są po prostu przesadnym uproszczeniem uzyskiwanie widoku, na przykład za pomocą powyższego kodu?
Odpowiedzi:
Głównym powodem używania fragmentów są funkcje backstack i cyklu życia. W przeciwnym razie widoki niestandardowe są lżejsze i prostsze do wdrożenia.
Początkowo próbowałem zbudować aplikację na telefon / tablet, używając niestandardowych widoków. Wszystko wydawało się działać na telefonach ORAZ tabletach, nawet przełączając się z jednego panelu na podzielony panel. Problem dotyczył przycisku Wstecz i cyklu życia. Ponieważ po prostu aktualizowałem widoki ręcznie ... nic nie śledziło historii widoków i ich stanów. Dlatego przycisk Wstecz nie działał zgodnie z oczekiwaniami i trudno było odtworzyć nawet najnowszy stan podczas wydarzeń cyklu życia, takich jak obracanie aplikacji. Aby to naprawić, musiałem zawinąć moje widoki niestandardowe we fragmenty i użyć FragmentManager, aby poprzednie stany zostały zapisane i odtworzone.
Po udzieleniu odpowiedzi zdałem sobie sprawę, że rok wcześniej wysłałem na podobne pytanie: https://stackoverflow.com/a/11126397/618881
źródło
Powiedziałbym, że fragmenty są przydatne w dwóch scenariuszach: jeśli podzielisz widoki na niektóre urządzenia / orientacje i pokażesz je w dwóch działaniach i pokażesz całą zawartość w jednym na innych urządzeniach. Byłby to przypadek użycia, jeśli korzystasz z tabletu, a może nawet w trybie poziomym na telefonie: np. Pokazujesz listę elementów i szczegóły na jednym ekranie. na telefonie lub w trybie portretowym po prostu pokazujesz jedną część.
Innym przypadkiem użycia są widoki wielokrotnego użytku. Więc jeśli masz jakieś widoki, które są widoczne w różnych działaniach, a także wykonujesz pewne czynności, możesz umieścić to zachowanie we fragmencie, a następnie użyć go ponownie. Oczywiście możesz to zrobić również za pomocą niestandardowych widżetów.
Nie widzę żadnego powodu, by używać Fragmentów do każdego widoku i myślę, że byłby to tylko narzut. Używam ich tylko w pierwszym przypadku użycia i powiedziałbym, że jest to uproszczenie.
źródło
Tutaj możesz przeczytać więcej.
źródło
Scenariusz pierwszy jest dobry, jeśli masz prostą aplikację.
Scenariusz drugi jest dobry, jeśli chcesz mieć wiele fragmentów i wiele działań fragmentarycznych i możesz połączyć każdy z nich. Możesz także dokonywać interakcji między fragmentami.
Mam podzielony ekran Fragmentactivity, mogę to nazwać „Intent Extras” i powiedzieć fragmentActivity, który fragment ma zostać załadowany. Fragmenty są dobre, ponieważ nie są widoczne, więc możesz utworzyć fragmenty wielokrotnego użytku i FragmentActvity.
Ale to sprawia, że twój projekt jest większy. Ale jeśli zrobisz duży projekt, możesz zaoszczędzić wiele. Ponieważ możesz użyć tych samych fragmentów lub tej samej aktywności fragmentów.
I wydaje mi się, że te fragmenty przychodzą trochę późno, więc musisz spróbować myśleć w nowy sposób. Może po prostu spróbuj przekonwertować swoją aktywność na FragmentActivity. Później spróbuj znaleźć kod wielokrotnego użytku i utwórz z niego fragment.
Jest to przydatne, ale teraz nie wiem jak. Ale mam kilka pomysłów.
To zawsze jest problem. Android Team coś wymyślił i nikt nie wie, do czego służy. Ponieważ prawie nie uczymy się tak, jak było, a tu pojawia się kilka nowych rzeczy.
Moim zdaniem to dobrze, ale nie z tego powodu, że Google mówi nam.
źródło
Dodaj jeden przypadek, gdy używasz fragmentu lub działania zamiast widoku niestandardowego:
Gdy używasz CursorLoader do obserwowania pewnych widoków, ListView lub TextView i chcesz zaktualizować ich wartość wyświetlaną za każdym razem, gdy dane Twojego ContentProvidera aktualizują się na zapleczu (najczęściej masz usługę, która aktualizuje lokalną bazę danych przez okresowe odpytywanie danych ze zdalnej bazy danych / chmury )
źródło
Jedną wielką rzeczą, o której wszystkie powyższe komentarze nie wspominają, jest to, że fragment pozostaje w pamięci, nawet jeśli Android zabije aktywność i uruchomi ją ponownie, gdy zrobisz coś takiego, jak zmiana orientacji urządzenia. Odbywa się to ze względu na wydajność, ale może również prowadzić do nieoczekiwanych rezultatów, jeśli spodziewasz się, że fragmenty zostaną zniszczone tylko po to, aby stwierdzić, że są odtwarzane znikąd.
źródło