Mam dwie klasy. Pierwsza to aktywność, druga to fragment, w którym mam trochę EditText
. W działaniu mam podklasę z zadaniem asynchronicznym, aw metodzie doInBackground
uzyskuję wynik, który zapisuję do zmiennej. Jak mogę wysłać tę zmienną z podklasy „moja aktywność” do tego fragmentu?
android
android-fragments
użytkownik1302569
źródło
źródło
getArguments().getString(key)
Możesz również uzyskać dostęp do danych o aktywności z fragmentu:
Czynność:
Fragment:
źródło
Bundle
klasę do przekazywania informacji. Alternatywnie możesz sprawić, aby tagetMyData()
metoda została odziedziczona i zaimplementowana z interfejsu iFragment
sprawdź, czy getActivity zwracainstanceof
interfejsonAttach()
.Znalazłem wiele odpowiedzi tutaj @ stackoverflow.com, ale zdecydowanie jest to poprawna odpowiedź:
„Wysyłanie danych z aktywności do fragmentu w Androidzie”.
Czynność:
Fragment:
Odczytywanie wartości we fragmencie
Lub tylko
źródło
Ta odpowiedź może być za późno. ale przyda się przyszłym czytelnikom.
Mam kilka kryteriów. Zakodowałem wybranie pliku z zamiarem. i wybrany plik do przekazania do określonego fragmentu w celu dalszego przetwarzania. Mam wiele fragmentów o funkcjonalności pobierania plików. w tym momencie za każdym razem sprawdzanie warunku i pobranie fragmentu i przekazanie wartości jest dość obrzydliwe. więc postanowiłem przekazać wartość za pomocą interfejsu.
Krok 1: Utwórz interfejs dla głównej aktywności.
Krok 2: Utwórz odwołanie SelectedBundle dla tego samego działania
Krok 3: utwórz metodę w tym samym działaniu
Krok 4: Konieczne jest zainicjowanie odwołania SelectedBundle, z których wszystkie są fragmentami, wymaga funkcji pobierania plików. Umieszczasz ten kod na
onCreateView(..)
metodzie fragmentuKrok 5: moim przypadku muszę przekazać obraz Uri z HomeActivity do fragmentu. Użyłem tej funkcji w metodzie onActivityResult.
onActivityResult z MainActivity, przekaż wartości do fragmentów za pomocą interfejsu.
Uwaga: Twoja sprawa może być inna. możesz zadzwonić z dowolnego miejsca w HomeActivity.
To wszystko. Zaimplementuj każdy potrzebny fragment w FragmentClass. Jesteś wspaniały. uczyniłeś. ŁAŁ...
źródło
Podstawową ideą korzystania z Fragmentów (F) jest tworzenie samowystarczalnych komponentów interfejsu użytkownika wielokrotnego użytku w aplikacjach na Androida. Fragmenty te są zawarte w działaniach i istnieje powszechny (najlepszy) sposób tworzenia ścieżek komunikacji od A -> F i FA. Konieczne jest komunikowanie się między FF poprzez działanie, ponieważ wtedy tylko fragmenty zostają oddzielone i samowystarczalne.
Tak więc przekazywanie danych z A -> F będzie takie samo, jak wyjaśnione przez ρяσсρєя K. Oprócz tej odpowiedzi, Po utworzeniu Fragmentów wewnątrz Działania, możemy również przekazać dane do metod wywoływania fragmentów w Fragmentach.
Na przykład:
źródło
Najlepszym i najwygodniejszym podejściem jest wywoływanie instancji fragmentu i wysyłanie danych w tym czasie. każdy fragment domyślnie ma metodę instancji
więc wywołasz swój fragment z takiej aktywności:
* R.id.container jest identyfikatorem mojego FrameLayout
więc w MyFragment.newInstance („data1”, „data2”) możesz wysyłać dane do fragmentu, aw swoim fragmencie otrzymujesz te dane w MyFragment newInstance (String param1, String param2)
a następnie w metodzie fragmentu onCreate otrzymasz dane:
źródło
Chciałbym dodać dla początkujących, że różnica między 2 najbardziej uprzywilejowanymi odpowiedziami tutaj wynika z różnych zastosowań fragmentu.
Jeśli korzystasz z fragmentu w klasie java, w którym masz dane, które chcesz przekazać, możesz zastosować pierwszą odpowiedź, aby przekazać dane:
Jeśli jednak użyjesz na przykład domyślnego kodu podanego przez Android Studio dla fragmentów z kartami, ten kod nie będzie działać.
Nie będzie działać, nawet jeśli zastąpisz domyślny PlaceholderFragment swoimi FragmentClasses, a nawet jeśli poprawisz FragmentPagerAdapter do nowej sytuacji, dodając przełącznik getItem () i inny przełącznik getPageTitle () (jak pokazano tutaj )
Ostrzeżenie: wspomniany wyżej klip zawiera błędy w kodzie, które wyjaśnię poniżej, ale warto zobaczyć, jak przejść od kodu domyślnego do kodu edytowalnego dla fragmentów z zakładkami)! Reszta mojej odpowiedzi ma o wiele większy sens, jeśli weźmiemy pod uwagę klasy Java i pliki XML z tego klipu (reprezentatywne dla pierwszego użycia fragmentów z kartami w scenariuszu dla początkujących).
Głównym powodem, dla którego najbardziej pozytywna odpowiedź z tej strony nie zadziała, jest to, że w tym domyślnym kodzie dla fragmentów z kartami fragmenty są używane w innej klasie Java: FragmentPagerAdapter!
Aby wysłać dane, masz ochotę utworzyć pakiet w MotherActivity i przekazać go w FragmentPagerAdapter, używając odpowiedzi nr 2.
Tyle tylko, że znowu jest źle. ( Prawdopodobnie można to zrobić w ten sposób, ale jest to tylko komplikacja, która tak naprawdę nie jest potrzebna ).
Myślę, że poprawnym / łatwiejszym sposobem jest przekazanie danych bezpośrednio do danego fragmentu przy użyciu odpowiedzi nr 2. Tak, będzie ścisłe powiązanie między Aktywnością a Fragmentem, ALE, dla fragmentów z zakładkami, jest to trochę oczekiwane. Radziłbym nawet utworzyć fragmenty z zakładkami w klasie Java MotherActivity (jako podklasy, ponieważ nigdy nie będą używane poza MotherActivity) - to proste, wystarczy dodać w klasie Java Java MotherActivity tyle fragmentów, ile potrzebujesz:
Tak więc, aby przekazać dane z MotherActivity do takiego fragmentu, musisz utworzyć prywatne Strings / Bundle powyżej OnCreate swojej aktywności Mother - które możesz wypełnić danymi, które chcesz przekazać do fragmentów, i przekazać je za pomocą Metoda utworzona po onCreate (tutaj nazywana getMyData ()).
A następnie w klasie fragmentu korzystasz z getMyData:
Jeśli masz zapytania do bazy danych, radzę wykonać je w MotherActivity (i przekazać wyniki jako Ciągi / liczby całkowite dołączone do kluczy w pakiecie, jak pokazano powyżej), ponieważ wewnątrz fragmentów z kartami twoja składnia stanie się bardziej złożona (staje się to getActivity () na przykład, a getIntent staje się getActivity (). getIntent), ale masz również opcję robienia tego, co chcesz.
Moja rada dla początkujących polega na skupieniu się na małych krokach. Najpierw zdobądź zamiar otwarcia bardzo prostej czynności na kartach, bez przekazywania ŻADNYCH danych. Czy to działa? Czy otwiera zakładki, których oczekujesz? Jeśli nie to dlaczego?
Zacznij od tego, a stosując rozwiązania, takie jak przedstawione w tym klipie , zobacz, czego brakuje. W przypadku tego konkretnego klipu plik mainactivity.xml nigdy nie jest wyświetlany. To z pewnością cię dezorientuje. Ale jeśli zwrócisz uwagę, zobaczysz, że na przykład kontekst (narzędzia: kontekst) jest niepoprawny w plikach fragmentów xml. Każdy fragment XML musi wskazywać prawidłową klasę fragmentu (lub podklasę za pomocą separatora $).
Zobaczysz również, że w głównej klasie java aktywności musisz dodać tabLayout.setupWithViewPager (mViewPager) - tuż po linii TabLayout tabLayout = (TabLayout) findViewById (R.id.tabs); bez tego wiersza widok nie jest faktycznie powiązany z plikami XML fragmentów, ale pokazuje TYLKO plik xml głównej aktywności.
Oprócz wiersza w głównej klasie java działania, w pliku XML głównej czynności musisz zmienić zakładki, aby dopasować je do swojej sytuacji (np. Dodać lub usunąć TabItems). Jeśli nie masz zakładek w głównym pliku XML działania, być może nie wybrałeś poprawnego typu działania, kiedy go utworzyłeś (nowe działanie - działanie z kartami).
Pamiętaj, że w ostatnich 3 akapitach mówię o filmie! Więc kiedy mówię XML głównej aktywności, jest to główny XML aktywności w filmie, którym w twojej sytuacji jest plik XML MotherActivity.
źródło
Po przekazaniu odwołania do fragmentu (konkretnej podklasy) do zadania asynchronicznego można uzyskać bezpośredni dostęp do fragmentu.
Niektóre sposoby przekazywania odwołania do fragmentu do zadania asynchronicznego:
class FooTask extends AsyncTask
), przekaż swój fragment do konstruktora.źródło
Czasami możesz otrzymać zamiar w swojej działalności i musisz przekazać informacje do działającego fragmentu.
Podane odpowiedzi są OK, jeśli chcesz rozpocząć fragment, ale jeśli nadal działa,
setArguments()
nie jest bardzo przydatny.Kolejny problem występuje, jeśli przekazane informacje spowodują interakcję z interfejsem użytkownika. W takim przypadku nie możesz zadzwonić
myfragment.passData()
ponieważ Android szybko powie, że tylko wątek, który utworzył widok, może wchodzić w interakcje.Tak więc moją propozycją jest użycie odbiornika. W ten sposób możesz wysyłać dane z dowolnego miejsca, w tym z działania, ale zadanie zostanie wykonane w kontekście fragmentu.
W twoim fragmencie
onCreate()
:W tobie aktywność:
źródło
Bardzo stary post, wciąż śmiem dodawać małe wyjaśnienie, które byłoby dla mnie pomocne.
Technicznie możesz bezpośrednio ustawić członków dowolnego typu we fragmencie z aktywności.
Dlaczego więc pakiet?
Powód jest bardzo prosty - Pakiet zapewnia jednolity sposób obsługi:
- tworzenie / otwieranie fragmentu
- rekonfiguracja (obracanie ekranu) - po prostu dodaj początkowy / zaktualizowany pakiet do outState w onSaveInstanceState ()
- przywracanie aplikacji po pobraniu śmieci w tle ( jak w przypadku rekonfiguracji).
Możesz (jeśli lubisz eksperymenty) stworzyć obejście w prostych sytuacjach, ale podejście do pakietu po prostu nie widzi różnicy między jednym fragmentem a tysiącem na backstacku - pozostaje proste i jednoznaczne.
Dlatego odpowiedź @Elenasys jest najbardziej eleganckim i uniwersalnym rozwiązaniem.
I dlatego odpowiedź udzielona przez @Martin ma pułapki
źródło
lepszym podejściem do przesyłania danych z klasy aktywności do fragmentu jest przekazywanie metodami ustawiającymi. Lubić
i łatwo uzyskaj te dane z klasy.
źródło
Od
Activity
wysyłasz dane z pakietem jako:A w
Fragment
metodzie onCreateView pobierz dane:źródło
Jeśli po inicjalizacji
activity
konieczne jestfragment
wykonanie akcji, najprostszym sposobem jestactivity
wywołanie metody wfragment
instancji. Wfragment
dodaj metodę:a następnie w
activity
, uzyskać dostęp dofragment
korzystania zfragment
menedżera i wywołaćmethod
:a następnie
activity
mogą komunikować się bezpośrednio zfragment
, wywołując tomethod
.źródło
onCreateView
metodę we fragmencie. był bardzo pomocnyUżyj następującego interfejsu, aby komunikować się między aktywnością a fragmentem
Lub skorzystaj z tego ogólnego odbiornika do dwukierunkowej komunikacji za pomocą interfejsu
metoda pokazu fragmentów
można oddać swój kontekst
GenericConnector
wonAttach(Context)
zbytw twojej działalności
w twoim fragmencie
Uwaga: Nigdy nie używaj go w odpowiedni
"".toString().toString().toString();
sposób.źródło
natknąłem się na to pytanie, podczas gdy większość powyższych metod będzie działać. Chcę tylko dodać, że możesz używać Biblioteki zdarzeń , szczególnie w scenariuszach, w których komponent (działanie lub fragment) nie został utworzony, jest dobry dla wszystkich rozmiarów projektów na Androida i wielu przypadków użycia. Osobiście wykorzystałem go w kilku projektach, które mam w sklepie playstore.
źródło
Możesz utworzyć publiczną metodę statyczną we fragmencie, w której uzyskasz statyczne odniesienie do tego fragmentu, a następnie przekażesz dane do tej funkcji i ustawisz te dane na argument w tej samej metodzie, i otrzymasz dane za pośrednictwem getArgument na oncreate metodą fragmentu, i ustaw te dane na lokalne zmienne.
źródło
Najmądrzejszym wypróbowanym i przetestowanym sposobem przekazywania danych między fragmentami a aktywnością jest utworzenie zmiennych, na przykład:
Następnie, aby przekazać dane z fragmentu do działania, robimy to w metodzie onActivityCreated:
Teraz możesz uzyskać wartość StorageUtil.employees z dowolnego miejsca. Powodzenia!
źródło
Moim rozwiązaniem jest napisanie statycznej metody wewnątrz fragmentu:
W ten sposób jestem pewien, że wszystkie dane, których potrzebuję, znajdują się we fragmencie przed każdą inną możliwą operacją, która mogłaby wymagać pracy z nim. Również moim zdaniem wygląda to na czystsze.
źródło
Wystąpił podobny problem podczas korzystania z najnowszego komponentu architektury Nawigacji. Wypróbowałem cały wyżej wymieniony kod, przekazując pakiet z mojej aktywności wywoływania do Fragment.
Najlepszym rozwiązaniem, zgodnym z najnowszymi trendami rozwojowymi w systemie Android, jest użycie View Model (część Androida Jetpack).
Utwórz i zainicjuj klasę ViewModel w działaniu nadrzędnym. Pamiętaj, że ten ViewModel musi być współużytkowany przez działanie i fragment.
Teraz, wewnątrz onViewCreated () fragmentu, zainicjuj ten sam ViewModel i ustaw Obserwatorów, aby nasłuchiwały pól ViewModel.
Oto przydatny, dogłębny samouczek, jeśli potrzebujesz.
https://medium.com/mindorks/how-to-communicate-between-fragments-and-activity-using-viewmodel-ca733233a51c
źródło
W swojej działalności zadeklaruj zmienną statyczną
Następnie w swoim fragmencie lubię podążać
źródło