Come trasferire i dati dalla 2a attività alla 1a attività quando viene premuto? - Android


186

Ho 2 attività, Activity1 e Activity2 .

In Activity1Ho un pulsante e TextView . Quando si fa clic sul pulsante, viene avviata Activity2 .

In Activity2Ho un EditText .

Voglio visualizzare i dati recuperati da EditText in Activity2 in TextView in Activity1 quando si preme indietro da Activity2 .

qualcuno può aiutarmi con il codice per farlo funzionare?


2
leggistartActivityForResult
Dmitry Zaytsev il


Un altro modo: Activity2inserisce il valore nell'archivio permanente e lo Activity1legge da lì.
Henry,

@kumareloaded: potresti condividere la soluzione qui. Pastebin non funziona nel mio paese al momento.
user1903022

Risposte:


328

Avviare Activity2 con startActivityForResulte utilizzare il setResultmetodo per inviare nuovamente i dati da Activity2 ad Activity1. In Activity1 dovrai eseguire l'override onActivityResultper l'aggiornamento TextViewcon i EditTextdati di Activity2.

Per esempio:

in Activity1 , avvia Activity2 come:

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

In Activity2 , utilizzare setResultper inviare nuovamente i dati:

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

E in Activity1 , ricevi i dati con 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");
         }     
    }
} 

Se possibile, utilizzare anche SharedPreferences per condividere i dati tra le attività.


1
grazie amico, se puoi potresti aiutarmi con la parte di codifica simile per SharedPreferences a fare lo stesso :)
kumareloaded

1
@kumareloaded: amico graditissimo. se vuoi fare lo stesso usando SharedPreferencesallora vedi questo esempio
ρяσѕρєя K

2
@kumareloaded: se mi dai collegamenti in codice di entrambe le classi con quello che hai provato a utilizzare pastebin.com, allora modificherò il tuo codice
ρяσѕρєя K

1
@kumareloaded: ora usa questo codice e questo funzionerà
ρяσѕρєя K

1
@ ρяσѕρєяK: potresti condividere il codice per lo scenario sopra usando SharedPref nella tua risposta. Pastebin non si apre in molti paesi. Condividerlo qui sarebbe di grande aiuto, grazie.
user1903022

27

Activity1 dovrebbe iniziare Activity2 con startActivityForResult().

Activity2 dovrebbe usare setResult()per inviare i dati a Activity1 .

In Activity2 ,

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

In Activity1 ,

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

@Swayam Immagino che perché non hai menzionato attività1 dovrebbe iniziare l'attività2 con startactivityforresult.
LutfiTekin

1
@LutfiTekin: potrebbe benissimo essere! Grazie per segnalarlo! Modificato la mia risposta. :)
Swayam

17

Altre risposte non stavano lavorando quando ho messo setResultin onBackPressed. Commentare la chiamata a super onBackPressede chiamare finishmanualmente risolve il problema:

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

E nella prima attività:

@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

Prendi questo in alternativa a startActivityforResult, ma tieni presente che in questi casi questo approccio può essere costoso in termini di prestazioni ma in alcuni casi potrebbe essere necessario utilizzarlo.

In Activity2,

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

In Activity1,

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

Questo non può essere utilizzato per l'oggetto (solo stringa, booleano, ecc.)
FindOut_Quran

1
Nel mio caso stavo lanciando un'attività da una voce di elenco in MainActivity e volevo riportare i dati creati dall'utente a quella voce di elenco. startActivityForResult () non era disponibile per me in questo caso in cui stavo usando mContext.startActivity (). L'esempio di @katmanco qui è stato di aiuto.
Guasto il

per me è una cattiva elezione. esiste actionForResult
marlonpya il

3

Dal tuo FirstActivity chiama SecondActivity usando il metodo startActivityForResult ().

Per esempio:

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

In SecondActivity impostare i dati che si desidera tornare a FirstActivity. Se non vuoi tornare indietro, non impostarne nessuno.

Ad esempio: in secondActivity se si desidera inviare nuovamente i dati:

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

Se non si desidera restituire dati:

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

Ora nella tua classe FirstActivity scrivi il seguente codice per il metodo 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
        }
    }
}

2

questa è la tua prima attività 1.

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

Da qui stai avviando Activity2.class usando startActivityForResult (mRequestCode, Activity2.class);

Ora questa è la tua seconda attività, il nome è Activity2

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

}

Ora, quando hai terminato con la tua seconda attività, chiami il metodo setResult (), da onBackPress () o da qualsiasi pulsante quando fai clic su Activity2, il metodo di richiamata di Activity1 onActivityResult () chiamerà da lì, puoi ottenere i tuoi dati dall'intento ..

Spero che ti possa aiutare ... :)



1

TL; uso DR Activity.startActivityForResult

Risposta lunga:

Dovresti iniziare leggendo la documentazione per sviluppatori Android. Nello specifico l'argomento della tua domanda è trattato nella Starting Activities and Getting Resultssezione della Activitydocumentazione.

Come per esempio il codice, l'SDK di Android fornisce buoni esempi. Inoltre, altre risposte qui forniscono brevi frammenti di codice di esempio da utilizzare.

Tuttavia, se stai cercando alternative, leggi questa domanda SO . Questa è una buona discussione su come usare startActivityForResultscon i frammenti, nonché accoppiare altri approcci per il passaggio di dati tra le attività.


0

e ho un problema che ho voluto fare questo inviando tipo di dati in un pulsante Soft che avevo fatto e il softkey che è il default in ogni dispositivo Android, quindi ho fatto questo, prima ho fatto un Intentmio "A" Activity:

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

Quindi nella mia seconda attività, ho dichiarato un campo nella mia "B" Activity:

private static int resultCode = 40;

poi dopo che ho fatto la mia richiesta con successo o ogni volta che volevo dire all'attività "A" che questo lavoro è stato fatto con successo qui cambia il valore di resultCode con lo stesso che ho detto in "A" Activityche nel mio caso è "60" e poi:

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

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

PS: ricorda di rimuovere il Supermetodo onBackPressed se vuoi che funzioni correttamente.

quindi dovrei chiamare il onActivityResultmetodo anche nella mia attività "A":

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

questo è tutto, spero che ti aiuti. #HappyCoding;

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.