Jak zarządzać "startActivityForResult" na Androidzie?
W mojej aktywności nazywam drugą Aktywność od głównej aktywności przez startActivityForResult
. W moim drugim ćwiczeniu jest kilka metod, które kończą to ćwiczenie (może bez rezultatu), jednak tylko jedna z nich zwraca wynik.
Na przykład, z głównego działania nazywam drugą. W tym ćwiczeniu sprawdzam niektóre funkcje telefonu, takie jak czy ma aparat. Jeśli nie ma, zamknę tę działalność. Również podczas przygotowywania MediaRecorder
lub MediaPlayer
jeśli wystąpi problem to Zamknę tę działalność.
Jeśli jego urządzenie ma kamerę i nagrywanie odbywa się całkowicie, to po nagraniu wideo, jeśli użytkownik kliknie przycisk Gotowe, odeślę wynik (adres nagranego wideo) z powrotem do głównej aktywności.
Jak sprawdzić wynik z głównej aktywności?
9 answers
Z twojego FirstActivity
wywołaj SecondActivity
używając metody startActivityForResult()
Na przykład:
Intent i = new Intent(this, SecondActivity.class);
startActivityForResult(i, 1);
W swoim SecondActivity
ustaw dane, do których chcesz wrócić FirstActivity
. Jeśli nie chcesz wracać, Nie ustawiaj żadnych.
Na przykład: w secondActivity jeśli chcesz przesłać dane zwrotne:
Intent returnIntent = new Intent();
returnIntent.putExtra("result",result);
setResult(Activity.RESULT_OK,returnIntent);
finish();
Jeśli nie chcesz zwracać danych:
Intent returnIntent = new Intent();
setResult(Activity.RESULT_CANCELED, returnIntent);
finish();
Teraz w swojej pierwszej klasie Zapisz następujący kod dla metody onActivityResult()
.
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 1) {
if(resultCode == Activity.RESULT_OK){
String result=data.getStringExtra("result");
}
if (resultCode == Activity.RESULT_CANCELED) {
//Write your code if there's no result
}
}
}//onActivityResult
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-12 12:29:59
Jak sprawdzić wynik z głównej aktywności?
Musisz nadpisać Activity.onActivityResult()
następnie sprawdź jego parametry:
-
requestCode
określa, która aplikacja zwróciła te wyniki. Jest to definiowane przez Ciebie, gdy wywołujeszstartActivityForResult()
. -
resultCode
informuje, czy ta aplikacja się powiodła, zawiodła, czy coś innego -
data
przechowuje wszelkie informacje zwracane przez tę aplikację. Może to byćnull
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-13 05:03:27
Uzupełniając odpowiedź od @Nishant, najlepszym sposobem na zwrócenie wyniku aktywności jest:
Intent returnIntent = getIntent();
returnIntent.putExtra("result",result);
setResult(RESULT_OK,returnIntent);
finish();
Miałem problem z
new Intent();
Potem dowiedziałem się, że prawidłowym sposobem jest użycie
getIntent();
Aby uzyskać aktualny zamiar
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-26 20:40:47
Przykład
Aby zobaczyć cały proces w kontekście, oto odpowiedź uzupełniająca. Zobacz moja pełniejsza odpowiedź po więcej wyjaśnień.
główna aktywność.java
public class MainActivity extends AppCompatActivity {
// Add a different request code for every activity you are starting from here
private static final int SECOND_ACTIVITY_REQUEST_CODE = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
// "Go to Second Activity" button click
public void onButtonClick(View view) {
// Start the SecondActivity
Intent intent = new Intent(this, SecondActivity.class);
startActivityForResult(intent, SECOND_ACTIVITY_REQUEST_CODE);
}
// This method is called when the second activity finishes
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// check that it is the SecondActivity with an OK result
if (requestCode == SECOND_ACTIVITY_REQUEST_CODE) {
if (resultCode == RESULT_OK) { // Activity.RESULT_OK
// get String data from Intent
String returnString = data.getStringExtra("keyName");
// set text view with string
TextView textView = (TextView) findViewById(R.id.textView);
textView.setText(returnString);
}
}
}
}
druga aktywność.java
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
}
// "Send text back" button click
public void onButtonClick(View view) {
// get the text from the EditText
EditText editText = (EditText) findViewById(R.id.editText);
String stringToPassBack = editText.getText().toString();
// put the String to pass back into an Intent and close this activity
Intent intent = new Intent();
intent.putExtra("keyName", stringToPassBack);
setResult(RESULT_OK, intent);
finish();
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-17 17:50:33
Jeśli chcesz zaktualizować interfejs użytkownika o wynik aktywności, nie możesz użyć this.runOnUiThread(new Runnable() {}
W ten sposób interfejs użytkownika nie będzie odświeżany z nową wartością. Zamiast tego możesz to zrobić:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_CANCELED) {
return;
}
global_lat = data.getDoubleExtra("LATITUDE", 0);
global_lng = data.getDoubleExtra("LONGITUDE", 0);
new_latlng = true;
}
@Override
protected void onResume() {
super.onResume();
if(new_latlng)
{
PhysicalTagProperties.this.setLocation(global_lat, global_lng);
new_latlng=false;
}
}
To wydaje się głupie, ale działa całkiem dobrze.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-08 13:54:56
Dla tych, którzy mają problem z błędnym requestCode w onActivityResult
Jeśli wywołujesz startActivityForResult()
z Fragment
, kod żądania jest zmieniany przez aktywność, która jest właścicielem fragmentu.
Jeśli chcesz uzyskać poprawny kod wyniku w swojej aktywności, spróbuj tego:
Zmiana:
startActivityForResult(intent, 1);
do:
getActivity().startActivityForResult(intent, 1);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:53
Najpierw używasz startActivityForResult()
z parametrami w first Activity
i jeśli chcesz wysłać dane z second Activity
do first Activity
, następnie przekaż wartość za pomocą metody Intent
z setResult()
i pobierz te dane wewnątrz metody onActivityResult()
W first Activity
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-20 11:57:38
Bardzo częsty problem w Androidzie
można go podzielić na 3 części
1) rozpocznij ćwiczenie B (dzieje się w ćwiczeniu A)
2) ustaw żądane dane (dzieje się w activty B)
3) Odbiór żądanych danych (dzieje się w ćwiczeniu A)
1) startActivity B
Intent i = new Intent(A.this, B.class);
startActivity(i);
2) ustaw wymagane dane
W tej części decydujesz, czy chcesz wysłać dane z powrotem, Czy nie, gdy wystąpi określone zdarzenie.
Np: w ćwiczeniu B jest EditText i dwa przyciski b1, b2.
Kliknięcie na przycisk b1 wysyła dane z powrotem do actvity a
Kliknięcie na przycisk b2 nie wysyła żadnych danych.
Wysyłanie danych
b1......clickListener
{
Intent resultIntent = new Intent();
resultIntent.putExtra("Your_key","Your_value");
setResult(RES_CODE_A,resultIntent);
finish();
}
Nie wysyłanie danych
b2......clickListener
{
setResult(RES_CODE_B,new Intent());
finish();
}
Użytkownik kliknie przycisk Wstecz
Domyślnie wynik jest ustawiony z Activity.RESULT_CANCEL response code
3) retrieve result
Dla tej metody override onActivityResult
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RES_CODE_A) {
// b1 was clicked
String x = data.getStringExtra("RES_CODE_A");
}
else if(resultCode == RES_CODE_B){
// b2 was clicked
}
else{
// back button clicked
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-22 09:54:47
Anwser @Nishant jest poprawny. W moim przypadku onActivityResult nigdy nie został wywołany ze względu na ustawienia w AndroidManifest. Upewnij się, że druga aktywność (lub nadawca) nie ma ustawionej tej linii w manifeście Androida.
<activity android:name=".SecondViewActivity"
android:parentActivityName=".FirstActivity"/>
Jeśli tak, proszę usunąć android:parentActivityName=".FirstActivity"
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-27 12:26:46