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?

Author: Jonik, 2012-05-02

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
 2122
Author: Nishant,
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łujesz startActivityForResult().
  • 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.
 41
Author: Sam,
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

 31
Author: Julian Alberto Piovesan Ruiz D,
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ń.

Tutaj wpisz opis obrazka

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();
    }
}
 23
Author: Suragch,
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.
 9
Author: DaviF,
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);

 9
Author: Tomasz Mularczyk,
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.

 2
Author: Dharmendra Pratap,
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 
}
}
 0
Author: Rohit Singh,
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"

 -2
Author: Catluc,
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