it-swarm.com.de

Senden von Daten an die Hauptaktivität in Android

Ich habe zwei Aktivitäten: Hauptaktivität und Kinderaktivität.
Wenn ich eine Taste in der Hauptaktivität drücke, wird die untergeordnete Aktivität gestartet. 

Nun möchte ich einige Daten zum Hauptbildschirm zurückschicken. Ich habe die Bundle-Klasse verwendet, aber es funktioniert nicht. Es gibt einige Laufzeitausnahmen.

Gibt es dafür eine Lösung? 

246
Rajapandian

Je nach den Umständen gibt es mehrere Möglichkeiten, das zu erreichen, was Sie möchten. 

Das häufigste Szenario (wie es sich anhört) ist, wenn eine untergeordnete Aktivität verwendet wird, um Benutzereingaben zu erhalten, z. B. das Auswählen eines Kontakts aus einer Liste oder das Eingeben von Daten in ein Dialogfeld. In diesem Fall sollten Sie startActivityForResult verwenden, um Ihre untergeordnete Aktivität zu starten.

Dies bietet eine Pipeline für das Senden von Daten an die Hauptaktivität mit setResult . Die setResult-Methode akzeptiert einen int-Ergebniswert und einen Intent, der an die aufrufende Aktivität zurückgegeben wird.

Intent resultIntent = new Intent();
// TODO Add extras or a data URI to this intent as appropriate.
resultIntent.putExtra("some_key", "String data"); 
setResult(Activity.RESULT_OK, resultIntent);
finish();

Um auf die zurückgegebenen Daten in der aufrufenden Aktivität zuzugreifen, überschreiben Sie onActivityResult. Der requestCode entspricht der im startActivityForResult-Aufruf übergebenen Ganzzahl, während resultCode und data Intent von der untergeordneten Aktivität zurückgegeben werden.

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
  super.onActivityResult(requestCode, resultCode, data);
  switch(requestCode) {
    case (MY_CHILD_ACTIVITY) : {
      if (resultCode == Activity.RESULT_OK) {
        // TODO Extract the data returned from the child Activity.
        String returnValue = data.getStringExtra("some_key");
      }
      break;
    } 
  }
}
421
Reto Meier

Aktivität 1 verwendet startActivityForResult :

startActivityForResult(ActivityTwo, ActivityTwoRequestCode);

Aktivität 2 wird gestartet und Sie können den Vorgang ausführen, um die Aktivität zu schließen.

Intent output = new Intent();
output.putExtra(ActivityOne.Number1Code, num1);
output.putExtra(ActivityOne.Number2Code, num2);
setResult(RESULT_OK, output);
finish();

Aktivität 1 - Wenn Sie von der vorherigen Aktivität zurückkehren, wird onActivityResult aufgerufen:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == ActivityTwoRequestCode && resultCode == RESULT_OK && data != null) {
        num1 = data.getIntExtra(Number1Code);
        num2 = data.getIntExtra(Number2Code);
    }
}

UPDATE: Antwort auf Seenu69s Kommentar: In Aktivität zwei,

int result = Integer.parse(EditText1.getText().toString()) 
           + Integer.parse(EditText2.getText().toString());
output.putExtra(ActivityOne.KEY_RESULT, result);

Dann in Tätigkeit eins,

int result = data.getExtra(KEY_RESULT);
167
jimmithy

Daten zurücksenden

Es hilft mir, die Dinge im Zusammenhang zu sehen. Hier ist ein komplettes einfaches Projekt zum Zurücksenden von Daten. Anstatt die XML-Layoutdateien bereitzustellen, gibt es hier ein Bild.

 enter image description here

Hauptaktivität

  • Starten Sie die zweite Aktivität mit startActivityForResult und geben Sie einen beliebigen Ergebniscode an.
  • Überschreiben Sie onActivityResult. Dies wird aufgerufen, wenn die zweite Aktivität abgeschlossen ist. Sie können sicherstellen, dass es sich tatsächlich um die zweite Aktivität handelt, indem Sie den Anforderungscode überprüfen. (Dies ist nützlich, wenn Sie mehrere verschiedene Aktivitäten aus derselben Hauptaktivität starten.)
  • Extrahieren Sie die Daten, die Sie aus der Rückgabe Intent erhalten haben. Die Daten werden mit einem Schlüssel-Wert-Paar extrahiert.

MainActivity.Java

public class MainActivity extends AppCompatActivity {

    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) {

                // 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);
            }
        }
    }
}

Zweite Aktivität

  • Geben Sie die Daten, die Sie zur vorherigen Aktivität zurückschicken möchten, in eine Intent ein. Die Daten werden in der Variablen Intent mit einem Schlüssel-Wert-Paar gespeichert.
  • Setzen Sie das Ergebnis auf RESULT_OK und fügen Sie die Absicht hinzu, die Ihre Daten enthält.
  • Rufen Sie finish() auf, um die zweite Aktivität zu schließen.

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

Weitere Hinweise

  • Wenn Sie sich in einem Fragment befinden, ist die Bedeutung von RESULT_OK nicht bekannt. Verwenden Sie einfach den vollständigen Namen: Activity.RESULT_OK.

Siehe auch

56
Suragch

FirstActivity verwendet startActivityForResult:

Intent intent = new Intent(MainActivity.this,SecondActivity.class);
startActivityForResult(intent, int resultCode); // suppose resultCode == 2

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 2)
    {
        String message=data.getStringExtra("MESSAGE");
    }
}

Bei SecondActivity-Aufruf setResult () onClick-Ereignisse oder onBackPressed ()

Intent intent=new Intent();
intent.putExtra("MESSAGE",message);
setResult(2,intent);
19
Vijay

Rufen Sie die untergeordnete Aktivität Intent mit dem Methodenaufruf startActivityForResult () auf

Hier ein Beispiel: http://developer.Android.com/training/notepad/notepad-ex2.html

und im "Ergebnis von einem Bildschirm zurückgeben": http://developer.Android.com/guide/faq/commontasks.html#opennewscreen

15
Intrications

Ich habe eine einfache Demo-Klasse für Ihre bessere Referenz erstellt.

ErsteAktivität.Java

 public class FirstActivity extends AppCompatActivity {

    private static final String TAG = FirstActivity.class.getSimpleName();
    private static final int REQUEST_CODE = 101;
    private Button btnMoveToNextScreen;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btnMoveToNextScreen = (Button) findViewById(R.id.btnMoveToNext);
        btnMoveToNextScreen.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent mIntent = new Intent(FirstActivity.this, SecondActivity.class);
                startActivityForResult(mIntent, REQUEST_CODE);
            }
        });
    }

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

        if(resultCode == RESULT_OK){
            if(requestCode == REQUEST_CODE && data !=null) {
                String strMessage = data.getStringExtra("keyName");
                Log.i(TAG, "onActivityResult: message >>" + strMessage);
            }
        }

    }
}

Und hier ist SecondActivity.Java

public class SecondActivity extends AppCompatActivity {

    private static final String TAG = SecondActivity.class.getSimpleName();
    private Button btnMoveToPrevious;
    private EditText editText;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        editText = (EditText) findViewById(R.id.editText);

        btnMoveToPrevious = (Button) findViewById(R.id.btnMoveToPrevious);
        btnMoveToPrevious.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                String message = editText.getEditableText().toString();

                Intent mIntent = new Intent();
                mIntent.putExtra("keyName", message);
                setResult(RESULT_OK, mIntent);
                finish();

            }
        });

    }
}
7
Kuls

In der ersten Aktivität können Sie eine Absicht mit startActivityForResult() senden und dann das Ergebnis der zweiten Aktivität abrufen, nachdem sie mit setResult fertig ist.

MainActivity.class

public class MainActivity extends AppCompatActivity {

    private static final int SECOND_ACTIVITY_RESULT_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);
        // send intent for result 
        startActivityForResult(intent, SECOND_ACTIVITY_RESULT_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_RESULT_CODE) {
            if (resultCode == 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.class

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();
    }
}
4
Yogesh Adhe

Es gibt einige Möglichkeiten, dies zu tun .. 1. durch die Verwendung von startActivityForResult (), das in den obigen Antworten sehr gut erklärt wird.

  1. indem Sie die statischen Variablen in Ihrer "Utils" -Klasse oder in einer anderen eigenen Klasse erstellen. Zum Beispiel möchte ich studentId von ActivityB an ActivityA übergeben. Zuerst ruft meine ActivityA die ActivityB auf. Dann setzen Sie in ActivityB die studentId (die ein statisches Feld in Utils.class ist). Verwenden Sie anschließend die studentId, die in Utils.STUDENT_ID gespeichert ist.

  2. erstellen Sie eine Getter- und Setter-Methode in Ihrer Anwendungsklasse.

so was: 

public class MyApplication extends Application {

    private static MyApplication instance = null;
    private String studentId="";

    public static MyApplication getInstance() {
        return instance;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        instance = this;
    }

    public void setStudentId(String studentID){
        this.studentId=studentID;
    }

    public String getStudentId(){
        return this.studentId;
    }
}

also bist du fertig Setzen Sie einfach die Daten in, wenn Sie sich in ActivityB befinden und nachdem Sie zu ActivityA zurückgekehrt sind, holen Sie die Daten ab.

0
swetabh suman

Verwenden Sie sharedPreferences , speichern Sie Ihre Daten und greifen Sie von überall in der Anwendung darauf zu

datum so speichern

SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPreferences.edit();
    editor.putString(key, value);
    editor.commit();

Und Daten wie diese erhalten

SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);
    String savedPref = sharedPreferences.getString(key, "");
    mOutputView.setText(savedPref);

Alle diese Antworten erklären, dass das Szenario Ihrer zweiten Aktivität nach dem Senden der Daten abgeschlossen sein muss.

Falls Sie die zweite Aktivität jedoch nicht beenden möchten und die Daten zuerst an diese zurücksenden möchten, können Sie BroadCastReceiver verwenden.

In der zweiten Aktivität -

Intent intent = new Intent("data");
intent.putExtra("some_data", true);
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);

In der ersten Aktivität

private BroadcastReceiver tempReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        // do some action
    }
};

Registrieren Sie den Empfänger in onCreate () -

 LocalBroadcastManager.getInstance(this).registerReceiver(tempReceiver,new IntentFilter("data"));

Registrierung in onDestroy () aufheben

0
Shivam Yadav