Frage Wie man `startActivityForResult` auf Android verwaltet?


In meiner Aktivität rufe ich eine zweite Aktivität von der Hauptaktivität an startActivityForResult. In meiner zweiten Aktivität gibt es einige Methoden, die diese Aktivität beenden (vielleicht ohne Ergebnis), aber nur eine von ihnen gibt ein Ergebnis zurück.

Zum Beispiel rufe ich von der Hauptaktivität eine zweite auf. In dieser Aktivität überprüfe ich einige Funktionen des Mobilteils, wie es eine Kamera hat. Wenn dies nicht der Fall ist, schließe ich diese Aktivität. Auch während der Vorbereitung von MediaRecorder oder MediaPlayer Wenn ein Problem auftritt, schließe ich diese Aktivität.

Wenn das Gerät eine Kamera hat und die Aufnahme vollständig ist, dann wird nach dem Aufzeichnen eines Videos, wenn ein Benutzer auf die Schaltfläche Fertig klickt, das Ergebnis (Adresse des aufgezeichneten Videos) zurück an die Hauptaktivität gesendet.

Wie überprüfe ich das Ergebnis der Hauptaktivität?


780
2018-05-02 03:03


Ursprung


Antworten:


Von deiner FirstActivity Ruf den SecondActivity verwenden startActivityForResult() Methode

Beispielsweise:

Intent i = new Intent(this, SecondActivity.class);
startActivityForResult(i, 1);

In deinem SecondActivity Legen Sie die Daten fest, zu denen Sie zurückkehren möchten FirstActivity. Wenn Sie nicht zurückkehren möchten, stellen Sie keine ein.

Beispiel: In secondActivity, wenn Sie Daten zurücksenden möchten:

Intent returnIntent = new Intent();
returnIntent.putExtra("result",result);
setResult(Activity.RESULT_OK,returnIntent);
finish();

Wenn Sie keine Daten zurückgeben möchten:

Intent returnIntent = new Intent();
setResult(Activity.RESULT_CANCELED, returnIntent);
finish();

Schreiben Sie jetzt in Ihrer FirstActivity Klasse folgenden Code für die onActivityResult() Methode.

@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

2071
2018-05-02 03:36



Wie überprüft man das Ergebnis der Hauptaktivität?

Sie müssen überschreiben Activity.onActivityResult() dann überprüfe seine Parameter:

  • requestCode Gibt an, welche App diese Ergebnisse zurückgegeben hat. Dies wird von Ihnen beim Anruf definiert startActivityForResult().
  • resultCode informiert Sie, ob diese App erfolgreich war, fehlgeschlagen ist oder etwas anderes
  • data enthält alle Informationen, die von dieser App zurückgegeben werden. Das mag sein null.

40
2018-05-02 03:07



Ergänzt um die Antwort von @Nishant ist der beste Weg, das Aktivitätsergebnis zurückzugeben:

Intent returnIntent = getIntent();
returnIntent.putExtra("result",result);
setResult(RESULT_OK,returnIntent);
finish();

Ich hatte ein Problem mit

new Intent();

Dann habe ich herausgefunden, dass der richtige Weg benutzt wird

getIntent();

um die aktuelle Absicht zu erhalten


30
2018-05-26 20:40



Beispiel

Um den gesamten Prozess im Kontext zu sehen, folgt hier eine ergänzende Antwort. Sehen meine vollere Antwort für mehr Erklärung.

enter image description here

Hauptaktivität.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);
            }
        }
    }
}

SecondActivity.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();
    }
}

22
2017-12-05 08:36



Wenn Sie die Benutzeroberfläche mit dem Aktivitätsergebnis aktualisieren möchten, können Sie sie nicht verwenden this.runOnUiThread(new Runnable() {} Dadurch wird die Benutzeroberfläche nicht mit einem neuen Wert aktualisiert. Stattdessen können Sie dies tun:

@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;
    }
}

Das scheint albern, funktioniert aber ziemlich gut.


9
2018-03-08 13:54



Für diejenigen, die Probleme mit haben falscher requestCode in onActivityResult

Wenn Sie anrufen startActivityForResult() von deiner Fragment, der requestCode wird von der Aktivität geändert, die das Fragment besitzt.

Wenn Sie in Ihrer Aktivität den richtigen resultCode erhalten möchten, versuchen Sie Folgendes:

Veränderung:

startActivityForResult(intent, 1); Zu:

getActivity().startActivityForResult(intent, 1);


9
2017-10-23 12:58



Zuerst benutzt du startActivityForResult() mit Parametern zuerst Activity und wenn Sie Daten von Sekunde senden möchten Activity zu erst Activity Übergeben Sie dann den Wert mit Intent mit setResult() Methode und holen Sie sich diese Daten rein onActivityResult() Methode zuerst Activity.


2
2017-09-30 12:30



Sehr häufiges Problem bei Android
Es kann in 3 Teile zerlegt werden
1) starte Aktivität B (passiert in Aktivität A)
2) Setze die angeforderten Daten (geschieht in der Aktivität B)
3) Erhalte die angeforderten Daten (passiert in Aktivität A)

1) startActivity B

Intent i = new Intent(A.this, B.class);
startActivity(i);

2) Stellen Sie die angeforderten Daten ein

In diesem Teil entscheiden Sie, ob Sie bei einem bestimmten Ereignis Daten zurücksenden wollen oder nicht.
ZB: In Aktivität B gibt es einen EditText und zwei Buttons b1, b2.
Ein Klick auf Button b1 sendet Daten zurück an die A-Funktion
Ein Klick auf Button b2 sendet keine Daten.

Daten senden 

b1......clickListener
{
   Intent resultIntent = new Intent();
   resultIntent.putExtra("Your_key","Your_value");
   setResult(RES_CODE_A,resultIntent);
   finish();
}

Keine Daten senden

b2......clickListener
    {
       setResult(RES_CODE_B,new Intent());
       finish();
    }

Benutzer klickt auf die Schaltfläche Zurück
Standardmäßig wird das Ergebnis mit dem Activity.RESULT_CANCEL-Antwortcode festgelegt

3) Ergebnis abrufen

Für diese Überschreibung onActivityResult-Methode

@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
2017-12-22 09:54