W mojej aktywności nazywam drugą aktywność z aktywności głównej przez startActivityForResult
. W mojej drugiej aktywności są metody, które kończą tę aktywność (być może bez wyniku), jednak tylko jedna z nich zwraca wynik.
Na przykład z głównej działalności nazywam drugą. W tym ćwiczeniu sprawdzam niektóre funkcje telefonu, takie jak aparat. Jeśli nie, to zamknę tę aktywność. Również podczas przygotowywania MediaRecorder
lub w MediaPlayer
przypadku wystąpienia problemu zamknę to działanie.
Jeśli jego urządzenie ma kamerę, a nagrywanie zostało zakończone całkowicie, to po nagraniu wideo, jeśli użytkownik kliknie przycisk Gotowe, wyślę wynik (adres nagranego wideo) z powrotem do głównej czynności.
Jak sprawdzić wynik z głównej aktywności?
Odpowiedzi:
Z twojego
FirstActivity
wywołania zaSecondActivity
pomocąstartActivityForResult()
metodyNa przykład:
W twoim
SecondActivity
zestawie dane, do których chcesz wrócićFirstActivity
. Jeśli nie chcesz wracać, nie ustawiaj żadnych.Na przykład: W,
SecondActivity
jeśli chcesz odesłać dane:Jeśli nie chcesz zwracać danych:
Teraz w swojej
FirstActivity
klasie napisz następujący kod dlaonActivityResult()
metody.źródło
SecondActivity
jakimś wyjątku wystąpił, w takim przypadku musisz również zwrócić wynik doFirstActivity
, abyś mógł ustawić wynik jak"RESULT_CANCELLED"
w bloku catch i powrócić doFirstActivty
iFirstActivity's' 'onActivityResult()
można sprawdzić, czy uzyskałeś wynik sukcesu lub niepowodzenia.Musisz zastąpić,
Activity.onActivityResult()
a następnie sprawdzić jego parametry:requestCode
określa, która aplikacja zwróciła te wyniki. Jest to definiowane przez Ciebie podczas rozmowystartActivityForResult()
.resultCode
informuje, czy ta aplikacja się powiodła, czy nie, czy coś innegodata
przechowuje wszelkie informacje zwrócone przez tę aplikację. To może byćnull
.źródło
Uzupełniając odpowiedź z @ Nishant, najlepszym sposobem na zwrócenie wyniku działania jest:
Miałem problem
Potem dowiedziałem się, że używa prawidłowego sposobu
uzyskać aktualne zamiary
źródło
Intent
który istnieje tylko do przechowywania aBundle
i nie ma normalnych wartości, takich jak akcja lub komponent. Ale modyfikowanie tego,Intent
który został użyty do uruchomienia bieżącej aktywności, wydaje się nieco dziwne (i potencjalnie niebezpieczne?) . Przeszukałem więc źródło dla samego Androida i stwierdziłem, że zawsze tworzą nowy, któregoIntent
można użyć w rezultacie. Na przykład github.com/aosp-mirror/platform_frameworks_base/blob/…getIntent()
wydają się być doskonałym sposobem na powrót danych do nieznanej aktywności, skąd ta aktywność została wywołana. Dzięki!Przykład
Aby zobaczyć cały proces w kontekście, oto dodatkowa odpowiedź. Zobacz moją pełniejszą odpowiedź, aby uzyskać więcej wyjaśnień.
MainActivity.java
SecondActivity.java
źródło
Dla tych, którzy mają problem ze złym requestCode w onActivityResult
Jeśli dzwonisz
startActivityForResult()
ze swojegoFragment
, requestCode jest zmieniany przez działanie, które jest właścicielem fragmentu.Jeśli chcesz uzyskać poprawny wynikKod swojej aktywności, spróbuj tego:
Zmiana:
startActivityForResult(intent, 1);
Do:getActivity().startActivityForResult(intent, 1);
źródło
Jeśli chcesz zaktualizować interfejs użytkownika o wynik działania, nie możesz użyć. Po wykonaniu
this.runOnUiThread(new Runnable() {}
tej czynności interfejs użytkownika nie odświeży się z nową wartością. Zamiast tego możesz to zrobić:To wydaje się głupie, ale działa całkiem dobrze.
źródło
Najpierw używasz
startActivityForResult()
z parametrami na początku,Activity
a jeśli chcesz wysyłać dane od drugiejActivity
do pierwszej,Activity
następnie przekaż wartość zaIntent
pomocąsetResult()
metody ionActivityResult()
najpierw pobierz te dane do metodyActivity
.źródło
Bardzo częsty problem w Androidzie
Można go podzielić na 3 części
1) rozpocząć działanie B (dzieje się w działaniu A)
2) ustawić żądane dane (dzieje się w działaniu B)
3) otrzymywać wymagane dane (dzieje się w działaniu A)
W tej części decydujesz, czy chcesz odesłać dane z powrotem, gdy wystąpi określone zdarzenie.
Np .: W ćwiczeniu B znajduje się EditText i dwa przyciski b1, b2.
Kliknięcie przycisku b1 odsyła dane z powrotem do działania.
Kliknięcie przycisku b2 nie powoduje wysłania żadnych danych.
Wysyłanie danych
Nie wysyłam danych
użytkownik klika przycisk Wstecz
Domyślnie wynik jest ustawiany za pomocą kodu odpowiedzi Activity.RESULT_CANCEL
Do tego zastąpienia metody onActivityResult
źródło
ActivityResultRegistry jest zalecanym podejściem
ComponentActivity
teraz zapewnia opcję,ActivityResultRegistry
która pozwala obsługiwać zarówno przepływystartActivityForResult()
+,onActivityResult()
jak irequestPermissions()
+onRequestPermissionsResult()
bez nadpisywania metod w twoimActivity
lubFragment
, zapewnia zwiększone bezpieczeństwo typu poprzezActivityResultContract
, i zapewnia zaczepy do testowania tych przepływów.Zdecydowanie zaleca się stosowanie interfejsów API wyników wyników wprowadzonych w AndroidX Activity 1.2.0-alpha02 i Fragment 1.3.0-alpha02.
Dodaj to do swojego
build.gradle
Jak korzystać z gotowej umowy?
Ten nowy interfejs API ma następujące wstępnie zbudowane funkcje
Przykład wykorzystujący umowę takePicture:
Co się tu dzieje? Rozbijmy to lekko.
takePicture
jest tylko wywołaniem zwrotnym, które zwraca zerowalną bitmapę - to, czy jest ona pusta, zależy od tego, czyonActivityResult
proces się powiódł, czy nie .prepareCall
następnie rejestruje to wywołanie w nowej funkcji oComponentActivity
nazwieActivityResultRegistry
- wrócimy do tego później.ActivityResultContracts.TakePicture()
jest jednym z wbudowanych pomocników, które Google dla nas stworzyło, a wreszcie wywołanietakePicture
faktycznie wyzwala zamiar w taki sam sposób, jak wcześniejActivity.startActivityForResult(intent, REQUEST_CODE)
.Jak napisać niestandardową umowę?
Prosty kontrakt, który przyjmuje Int jako dane wejściowe i zwraca ciąg znaków, który zażądał działania, zwraca wynik Intent.
Sprawdź tę oficjalną dokumentację, aby uzyskać więcej informacji.
źródło
źródło