Wie werden Daten von der 2. Aktivität zur 1. Aktivität übergeben, wenn sie zurückgedrückt werden? - Android


183

Ich habe 2 Aktivitäten, Aktivität1 und Aktivität2 .

In Activity1habe ich einen Button und eine Textansicht . Wenn Sie auf die Schaltfläche klicken, wird Aktivität2 gestartet.

In Activity2habe ich einen EditText .

Ich möchte die aus EditText in Aktivität2 abgerufenen Daten in der Textansicht in Aktivität1 anzeigen, wenn von Aktivität2 auf Zurück gedrückt wird .

Kann mir jemand mit dem Code helfen, damit dies funktioniert?


2
Lesen Sie mehr überstartActivityForResult
Dmitry Zaytsev


Ein anderer Weg: Activity2Setzt den Wert in einen dauerhaften Speicher und Activity1liest ihn von dort.
Henry

@kumareloaded: Könnten Sie bitte die Lösung hier teilen. Pastebin arbeitet derzeit nicht in meinem Land.
user1903022

Antworten:


325

Starten Sie Activity2 mit startActivityForResultund verwenden Sie die setResultMethode zum Zurücksenden von Daten von Activity2 an Activity1. In Aktivität1 müssen Sie onActivityResultfür die Aktualisierung TextViewmit EditTextDaten aus Aktivität2 überschreiben .

Beispielsweise:

In Activity1 starten Activity2 als:

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

Im Verwenden Sie Aktivität 2 Folgendes , um setResultDaten zurückzusenden:

Intent intent = new Intent();
intent.putExtra("editTextValue", "value_here")
setResult(RESULT_OK, intent);        
finish();

Und in Aktivität1 erhalten Sie Daten mit onActivityResult:

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 1) {
         if(resultCode == RESULT_OK) {
             String strEditText = data.getStringExtra("editTextValue");
         }     
    }
} 

Wenn Sie können, verwenden Sie SharedPreferences auch zum Teilen von Daten zwischen Aktivitäten.


1
Danke Mann, wenn du kannst, kannst du mir mit dem ähnlichen Codierungsteil für SharedPreferences helfen, dasselbe zu tun :)
kumareloaded

1
@ kumareloaded: herzlich willkommener Freund. Wenn Sie dasselbe mit verwenden möchten, SharedPreferencessehen Sie sich dieses Beispiel an
ρяσsρєя K

2
@kumareloaded: wenn du mir Code Links beider Klassen mit dem, was u versucht haben , mit pastebin.com dann werde ich Ihren Code bearbeiten
ρяσѕρєя K

1
@ kumareloaded: Verwenden Sie jetzt diesen Code und dies wird funktionieren
ρяσsρєя K

1
@ ρяσsρєяK: Könnten Sie bitte den Code für das obige Szenario mit SharedPref in Ihrer Antwort teilen. Pastebin öffnet sich in vielen Ländern nicht. Es wäre eine große Hilfe, es hier zu teilen, danke.
user1903022

25

Aktivität1 sollte Aktivität2 mit starten startActivityForResult().

Aktivität2 sollte verwendet werden setResult(), um Daten an Aktivität1 zurückzusenden .

In Activity2 ,

@Override
public void onBackPressed() {
    String data = mEditText.getText();
    Intent intent = new Intent();
    intent.putExtra("MyData", data);
    setResult(resultcode, intent);
}

In Aktivität1 ,

onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == 1) {
        if(resultCode == RESULT_OK) {
            String myStr=data.getStringExtra("MyData");
            mTextView.setText(myStr);
        }
    }
}

@Swayam Ich denke, weil Sie nicht erwähnt haben, dass Aktivität1 Aktivität2 mit Startaktivität für Ergebnis starten sollte.
LutfiTekin

1
@LutfiTekin: Das könnte es sehr gut sein! Vielen Dank für den Hinweis! Ich habe meine Antwort bearbeitet. :)
Swayam

17

Andere Antworten waren nicht funktioniert , wenn ich lege setResultin onBackPressed. Das Kommentieren von call to super onBackPressedund das finishmanuelle Anrufen löst das Problem:

@Override
public void onBackPressed() {
    //super.onBackPressed();
    Intent i = new Intent();
    i.putExtra(EXTRA_NON_DOWNLOADED_PAGES, notDownloaded);
    setResult(RESULT_OK, i);
    finish();
}

Und in der ersten Aktivität:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == QUEUE_MSG) {
        if (resultCode == RESULT_OK) {
            Serializable tmp = data.getSerializableExtra(MainActivity.EXTRA_NON_DOWNLOADED_PAGES);
            if (tmp != null)
                serializable = tmp;
        }
    }
}

6

Nehmen Sie dies als Alternative zu startActivityforResult. Beachten Sie jedoch, dass dieser Ansatz in solchen Fällen in Bezug auf die Leistung teuer sein kann, in einigen Fällen jedoch möglicherweise verwendet werden muss.

In Aktivität 2

@Override
public void onBackPressed() {
String data = mEditText.getText();
SharedPreferences sp = getSharedPreferences("LoginInfos", 0);
Editor editor = sp.edit();
editor.putString("email",data);
editor.commit();
}

In Aktivität1,

 @Override
public void onResume() {
SharedPreferences sp = getSharedPreferences("LoginInfos", 0);
String  dataFromOtherAct= sp.getString("email", "no email");
} 

Dies kann nicht für Objekte verwendet werden (nur Zeichenfolge, Boolescher
Wert

1
In meinem Fall habe ich eine Aktivität von einem Listenelement in MainActivity aus gestartet und wollte vom Benutzer erstellte Daten zurück zu diesem Listenelement bringen. startActivityForResult () war in diesem Fall, in dem ich mContext.startActivity () verwendete, nicht verfügbar. @katmanco Beispiel hier war eine hilfreiche Lösung.
Fehlerhafter

Für mich ist das eine schlechte Wahl. exist actionForResult
marlonpya

2

Dies ist Ihre erste Aktivität1.

public class Activity1 extends Activity{
private int mRequestCode = 100;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    Intent intent = new Intent(this, Activity2.class);
    startActivityForResult(intent, mRequestCode);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode == mRequestCode && resultCode == RESULT_OK){
        String editTextString = data.getStringExtra("editText");
    }
}
}

Von hier aus starten Sie Ihre Activity2.class mit startActivityForResult (mRequestCode, Activity2.class).

Dies ist Ihre zweite Aktivität. Der Name lautet Aktivität2

public class Activity2 extends Activity {
private EditText mEditText;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    //mEditText = (EditText)findViewById(R.id.edit_text);

    Intent intent = new Intent();
    intent.putExtra("editText", mEditText.getText().toString());
    setResult(RESULT_OK, intent);
}

}

Wenn Sie mit Ihrer zweiten Aktivität fertig sind, rufen Sie die setResult () -Methode von onBackPress () aus oder klicken Sie auf eine Schaltfläche, wenn Ihre Aktivität2 die Rückrufmethode Ihrer Aktivität1 zerstört. OnActivityResult () ruft von dort aus Ihre Daten aus der Absicht ab ..

Hoffe es wird dir helfen ... :)



2

Rufen Sie in Ihrer FirstActivity die SecondActivity mit der Methode startActivityForResult () auf.

Beispielsweise:

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

Legen Sie in Ihrer SecondActivity die Daten fest, die Sie an FirstActivity zurückgeben möchten. 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 nun in Ihrer FirstActivity-Klasse den 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
        }
    }
}

1

TL; DR Verwendung Activity.startActivityForResult

Lange Antwort:

Sie sollten zunächst die Android-Entwicklerdokumentation lesen. Insbesondere das Thema Ihrer Frage wird im Starting Activities and Getting ResultsAbschnitt der ActivityDokumentation behandelt.

Als Beispiel Code bietet das Android SDK gute Beispiele. Andere Antworten hier geben Ihnen kurze Ausschnitte aus dem zu verwendenden Beispielcode.

Wenn Sie jedoch nach Alternativen suchen, lesen Sie diese SO-Frage . Dies ist eine gute Diskussion über die Verwendung startActivityForResultsmit Fragmenten sowie über einige Ansätze zum Übertragen von Daten zwischen Aktivitäten.


0

und ich habe ein Problem, bei dem ich diesen Datentyp in einem von mir erstellten Soft Button und dem SoftKey, der die Standardeinstellung in jedem Android-Gerät ist, senden wollte. Also habe ich dies getan, zuerst habe ich einen Intentin meinem erstellt "A" Activity:

            Intent intent = new Intent();
            intent.setClass(context, _AddNewEmployee.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
            startActivityForResult(intent, 6969);
            setResult(60);

Dann habe ich in meiner zweiten Aktivität ein Feld in meinem "B" deklariert Activity:

private static int resultCode = 40;

Nachdem ich meine Anfrage erfolgreich gestellt habe oder wann immer ich der Aktivität "A" mitteilen wollte, dass dieser Job hier erfolgreich ausgeführt wurde, ändern Sie den Wert von resultCode auf den Wert, den ich in "A" angegeben habe Activity, in meinem Fall "60" und dann:

private void backToSearchActivityAndRequest() {
    Intent data = new Intent();
    data.putExtra("PhoneNumber", employeePhoneNumber);
    setResult(resultCode, data);
    finish();
}

@Override
public void onBackPressed() {
    backToSearchActivityAndRequest();
}

PS: Denken Sie daran, die SuperMethode aus der onBackPressed-Methode zu entfernen, wenn dies ordnungsgemäß funktionieren soll.

dann sollte ich die onActivityResultMethode auch in meiner "A" -Aktivität aufrufen :

   @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 6969 && resultCode == 60) {
            if (data != null) {
                    user_mobile = data.getStringExtra("PhoneNumber");
                    numberTextField.setText(user_mobile);
                    getEmployeeByNumber();
            }
        }
    }

das war's, hoffe es hilft dir. #HappyCoding;

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.