Tworzę aplikację za pomocą Fragments
iw jednym z nich utworzyłem konstruktor inny niż domyślny i otrzymałem to ostrzeżenie:
Avoid non-default constructors in fragments: use a default constructor plus Fragment#setArguments(Bundle) instead
Czy ktoś może mi powiedzieć, dlaczego to nie jest dobry pomysł?
Czy możesz również zasugerować, jak mógłbym to osiągnąć:
public static class MenuFragment extends ListFragment {
public ListView listView1;
Categories category;
//this is my "non-default" constructor
public MenuFragment(Categories category){
this.category = category;
}....
Bez użycia konstruktora innego niż domyślny?
android
android-fragments
BlackHatSamurai
źródło
źródło
Odpowiedzi:
Utwórz obiekt pakietu i wstaw swoje dane (w tym przykładzie Twój
Category
obiekt). Uważaj, nie możesz przekazać tego obiektu bezpośrednio do pakietu, chyba że można go serializować. Myślę, że lepiej jest zbudować obiekt we fragmencie i umieścić w pakiecie tylko identyfikator lub coś innego. Oto kod służący do tworzenia i dołączania pakietu:Następnie w danych dostępu do fragmentów:
To wszystko.
źródło
Parcelable
obiekty. Ponadto, nie należy zdaćContext
, ponieważ informacje te można uzyskać za pośrednictwem fragmentu wgetActivity()
metodzie .Type value = getArguments().getType("key");
?newInstance()
metody. Na przykład:public static FragmentName newInstance(your variables){}
. Zgodnie z zaleceniami dokumentacji Androida nie twórz konstruktora z parametrami, ponieważ domyślny (bez parametrów) zostanie wywołany automatycznie po restarcie Twojego fragmentu.Wygląda na to, że żadna z odpowiedzi nie odpowiada „po co używać pakietu do przekazywania parametrów zamiast konstruktorów innych niż domyślne”
Powodem, dla którego powinieneś przekazywać parametry przez pakiet, jest to, że gdy system przywróci plik
fragment
(np. Przy zmianie konfiguracji), automatycznie przywrócibundle
.Wywołania zwrotne, takie jak
onCreate
lubonCreateView
powinny odczytywać parametry zbundle
- w ten sposób masz gwarancję przywrócenia stanufragment
prawidłowego do tego samego stanu, w jakimfragment
został zainicjowany (pamiętaj, że ten stan może się różnić od tego,onSaveInstanceState bundle
który jest przekazywany doonCreate/onCreateView
)Zalecenie stosowania
newInstance()
metody statycznej jest tylko zaleceniem. Możesz użyć konstruktora innego niż domyślny, ale upewnij się, że parametry inicjalizacji zostały wypełnione wbundle
treści tego konstruktora. I przeczytaj te parametry w metodachonCreate()
lubonCreateView()
.źródło
Twój
Fragment
nie powinny mieć konstruktorów z powodu, jakFragmentManager
instancję go. Powinieneś miećnewInstance()
zdefiniowaną metodę statyczną z potrzebnymi parametrami, a następnie spakować je i ustawić jako argumenty fragmentu, do których możesz później uzyskać dostęp za pomocąBundle
parametru.Na przykład:
Przeczytaj te argumenty pod adresem
onCreate
:W ten sposób, jeśli zostanie odłączony i ponownie dołączony, stan obiektu może być przechowywany przez argumenty, podobnie jak
bundles
dołączony doIntent
s.źródło
Jeśli używasz parametru dla jakiejś klasy. Spróbuj tego
źródło
FragmentManager
, utracisz mSomeInstance.Myślę, że nie ma różnicy między konstruktorem statycznym a dwoma konstruktorami (pustym i sparametryzowanym, który przechowuje argumenty w pakiecie argumentów fragmentu), najprawdopodobniej ta praktyczna reguła została stworzona w celu zmniejszenia prawdopodobieństwa zapomnienia o implementacji konstruktora bezargumentowego w Javie , który nie jest generowany niejawnie, gdy występuje przeciążenie.
W moich projektach używam Kotlina i implementuję fragmenty z głównym konstruktorem bez argonu i konstruktorem pomocniczym dla argumentów, który po prostu przechowuje je w paczce i ustawia jako argumenty Fragment, wszystko działa dobrze.
źródło
Jeśli fragment używa konstruktorów innych niż domyślne, po zmianie konfiguracji fragment utraci wszystkie dane.
źródło