it-swarm.com.de

Wie verwalte ich startActivityForResult auf Android?

In meiner Aktivität rufe ich eine zweite Aktivität aus der Hauptaktivität von startActivityForResult auf. In meiner zweiten Aktivität gibt es einige Methoden, die diese Aktivität beenden (möglicherweise ohne Ergebnis), jedoch gibt nur eine von ihnen ein Ergebnis zurück.

Zum Beispiel rufe ich aus der Hauptaktivität eine zweite an. In dieser Aktivität überprüfe ich einige Funktionen des Mobilteils, z. B. eine Kamera. Wenn nicht, schließe ich diese Aktivität. Während der Vorbereitung von MediaRecorder oder MediaPlayer wird diese Aktivität geschlossen, wenn ein Problem auftritt.

Wenn das Gerät über eine Kamera verfügt und die Aufzeichnung vollständig ist, wird nach der Aufzeichnung eines Videos, wenn ein Benutzer auf die Schaltfläche "Fertig" klickt, das Ergebnis (Adresse des aufgezeichneten Videos) an die Hauptaktivität zurückgesendet.

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

910
Hesam

Rufen Sie von Ihrem FirstActivity aus die SecondActivity -Methode mit startActivityForResult() auf

Zum Beispiel:

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

Stellen Sie in Ihrem SecondActivity die Daten ein, die Sie an FirstActivity zurückgeben möchten. Wenn Sie nicht zurückkehren möchten, legen Sie keine fest.

Zum 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 nun in Ihrer Klasse FirstActivity folgenden Code für die Methode 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
2323
Nishant

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

Sie müssen Activity.onActivityResult() überschreiben und dann die Parameter überprüfen:

  • requestCode gibt an, welche App diese Ergebnisse zurückgegeben hat. Dies wird von Ihnen festgelegt, wenn Sie startActivityForResult() aufrufen.
  • resultCode informiert Sie, ob diese App erfolgreich war, fehlgeschlagen ist oder etwas anderes
  • data enthält alle von dieser App zurückgegebenen Informationen. Dies kann null sein.
47
Sam

Ergänzt man 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 fand ich heraus, dass der richtige Weg verwendet wird

getIntent();

die aktuelle Absicht zu bekommen

42
Julian Alberto

Beispiel

Um den gesamten Prozess im Kontext zu sehen, finden Sie hier eine ergänzende Antwort. Siehe meine ausführlichere Antwort für weitere Erklärungen.

enter image description here

MainActivity.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();
    }
}
40
Suragch

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

Wenn Sie startActivityForResult() von Ihrem Fragment aufrufen, wird der requestCode von der Aktivität geändert, der das Fragment gehört.

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

Veränderung:

startActivityForResult(intent, 1); An:

getActivity().startActivityForResult(intent, 1);

11

Wenn Sie die Benutzeroberfläche mit dem Aktivitätsergebnis aktualisieren möchten, können Sie this.runOnUiThread(new Runnable() {} nicht verwenden. 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.

10
DaviF

Zuerst verwenden Sie startActivityForResult() mit Parametern in first Activity und wenn Sie Daten von second Activity an first Activity senden möchten, übergeben Sie den Wert mit Intent mit setResult() -Methode und erhalten Sie diese Daten in der onActivityResult() -Methode in der ersten Activity.

2

Sehr häufiges Problem in Android
Es kann in 3 Teile zerlegt werden
1) Aktivität B starten (geschieht in Aktivität A)
2) Festlegen der angeforderten Daten (geschieht in Aktivität B)
3) Erhalten Sie angeforderte Daten (geschieht in Aktivität A)

1) startActivity B

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

2) Stellen Sie die gewünschten Daten ein

In diesem Teil entscheiden Sie, ob Sie Daten zurücksenden möchten oder nicht, wenn ein bestimmtes Ereignis eintritt.
ZB: In Aktivität B gibt es einen EditText und zwei Buttons b1, b2.
Wenn Sie auf die Schaltfläche b1 klicken, werden die Daten an Aktivität A zurückgesendet
Durch Klicken auf die Schaltfläche b2 werden keine Daten gesendet.

Daten senden

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

Daten werden nicht gesendet

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

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

3) Ergebnis abrufen

Überschreiben Sie dazu die 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 
}
}
1
Rohit Singh
You need to override Activity.onActivityResult()

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);

if (resultCode == RESULT_CODE_ONE) {


   String a = data.getStringExtra("RESULT_CODE_ONE");

}
else if(resultCode == RESULT_CODE_TWO){

   // b was clicked

}
else{

}
}
0