Mam dwie czynności: główną i dziecięcą.
Po naciśnięciu przycisku w głównej aktywności uruchamiana jest aktywność podrzędna.
Teraz chcę wysłać niektóre dane z powrotem na ekran główny. Użyłem klasy pakietu, ale to nie działa. Zgłasza pewne wyjątki czasu wykonywania.
Czy jest na to jakieś rozwiązanie?
android
android-intent
Rajapandian
źródło
źródło
Odpowiedzi:
Istnieje kilka sposobów na osiągnięcie tego, co chcesz, w zależności od okoliczności.
Najczęstszym scenariuszem (jak brzmi twój) jest sytuacja, w której Aktywność podrzędna jest wykorzystywana w celu uzyskania danych wejściowych od użytkownika - takich jak wybranie kontaktu z listy lub wprowadzenie danych w oknie dialogowym. W takim przypadku należy użyć
startActivityForResult
do uruchomienia działania dziecka.Zapewnia to potok wysyłania danych z powrotem do głównego działania za pomocą
setResult
. Metoda setResult przyjmuje wartość wyniku int i zamiar, który jest przekazywany z powrotem do działania wywołującego.Aby uzyskać dostęp do zwróconych danych w wywołaniu Aktywność połączenia
onActivityResult
. RequestCode odpowiada liczbie całkowitej przekazanej wstartActivityForResult
wywołaniu, podczas gdy wynikCod i dane zamiaru są zwracane z działania potomnego.źródło
startActivityForResult
funkcji zamiast po prostustartActivity
. Przykładem może byćstartActivityForResult(myIntent, 2);
gdzie 2 to kod wynikowy, który może zastąpićMY_CHILD_ACTIVITY
powyższą instrukcję switch.Działanie 1 wykorzystuje startActivityForResult :
Zostanie uruchomione działanie 2 i można wykonać operację. Aby zamknąć działanie, wykonaj następujące czynności:
Ćwiczenie 1 - powrót z poprzedniego działania wywoła onActivityResult :
AKTUALIZACJA: Odpowiedz na komentarz Seenu69: W ćwiczeniu drugim
Następnie w pierwszym ćwiczeniu
źródło
Wysyłanie danych z powrotem
Pomaga mi widzieć rzeczy w kontekście. Oto kompletny prosty projekt wysyłania danych z powrotem. Zamiast udostępniać pliki układu XML, oto obraz.
Główna aktywność
startActivityForResult
, podając dowolny kod wyniku.onActivityResult
. Jest to wywoływane po zakończeniu drugiego działania. Możesz upewnić się, że tak naprawdę jest to drugie działanie, sprawdzając kod żądania. (Jest to przydatne, gdy zaczynasz wiele różnych działań od tego samego działania głównego).Intent
. Dane są wyodrębniane przy użyciu pary klucz-wartość.MainActivity.java
Druga aktywność
Intent
. Dane są przechowywane przyIntent
użyciu pary klucz-wartość.RESULT_OK
i dodaj zamiar przechowywania danych.finish()
aby zamknąć drugie działanie.SecondActivity.java
Inne notatki
RESULT_OK
. Wystarczy użyć pełnej nazwy:Activity.RESULT_OK
.Zobacz też
źródło
FirstActivity używa startActivityForResult:
W wywołaniu SecondActivity setResult () zdarzenia onClick lub onBackPressed ()
źródło
Wywołaj zamiar działania potomnego za pomocą wywołania metody startActivityForResult ()
Oto przykład: http://developer.android.com/training/notepad/notepad-ex2.html
oraz w „Zwracaniu wyniku z ekranu” tego: http://developer.android.com/guide/faq/commontasks.html#opennewscreen
źródło
Dla lepszego odniesienia stworzyłem prostą klasę demonstracyjną.
źródło
W pierwszym działaniu możesz wysłać zamiar za pomocą,
startActivityForResult()
a następnie uzyskać wynik z drugiego działania po jego zakończeniusetResult
.MainActivity.class
SecondActivity.class
źródło
Wszystkie te odpowiedzi wyjaśniają, że scenariusz drugiego działania musi zostać zakończony po wysłaniu danych.
Ale w przypadku, gdy nie chcesz zakończyć drugiej czynności i chcesz wysłać dane z powrotem do pierwszego, możesz do tego użyć BroadCastReceiver.
W drugiej aktywności -
W pierwszej aktywności
Zarejestruj odbiornik w onCreate () -
Wyrejestruj to w onDestroy ()
źródło
Innym sposobem osiągnięcia pożądanego rezultatu, który może być lepszy w zależności od twojej sytuacji, jest stworzenie interfejsu nasłuchiwania.
Nakłaniając działanie rodzica do nasłuchiwania interfejsu uruchamianego przez działanie potomne podczas przekazywania wymaganych danych jako parametru, można stworzyć podobny zestaw okoliczności
źródło
Można to zrobić na kilka sposobów. 1. za pomocą metody startActivityForResult (), która jest bardzo dobrze wyjaśniona w powyższych odpowiedziach.
tworząc zmienne statyczne w swojej klasie „Utils” lub dowolnej własnej klasie. Na przykład chcę przekazać studentId z ActivityB do ActivityA.Pierwsze moje ActivityA wywołuje ActivityB. Następnie wewnątrz ActivityB ustaw studentId (który jest polem statycznym w Utils.class). W ten sposób Utils.STUDENT_ID = "1234"; następnie wracając do działania A, użyj studentId zapisanego w Utils.STUDENT_ID.
poprzez utworzenie metody pobierającej i ustawiającej w swojej klasie aplikacji.
lubię to:
więc gotowe. wystarczy ustawić dane w środku, gdy jesteś w ActivityB, a po powrocie do ActivityA, pobierz dane.
źródło
Tylko mały szczegół, który moim zdaniem brakuje w powyższych odpowiedziach.
Jeśli aktywność dziecka można otworzyć z wielu zajęć dla rodziców, możesz sprawdzić, czy musisz to zrobić,
setResult
czy nie, w zależności od tego, czy Twoje działanie zostało otwarte przezstartActivity
lubstartActivityForResult
. Możesz to osiągnąć za pomocągetCallingActivity()
. Więcej informacji tutaj .źródło
Użyj sharedPreferences i zapisz swoje dane i uzyskaj do nich dostęp z dowolnego miejsca w aplikacji
zapisz datę w ten sposób
I odbieraj takie dane
źródło