Comment passer les données de la 2ème activité à la 1ère activité lorsque vous appuyez dessus? - Android

186

J'ai 2 activités, Activity1 et Activity2 .

Dans Activity1J'ai un bouton et TextView . Lorsque le bouton est cliqué, Activity2 démarre.

Dans Activity2J'ai un EditText .

Je veux afficher les données extraites de EditText dans Activity2 dans TextView dans Activity1 lorsque back est appuyé sur Activity2 .

quelqu'un peut-il m'aider avec le code pour que cela fonctionne?

kumareloaded
la source
2
lire à proposstartActivityForResult
Dmitry Zaytsev
Une autre façon: Activity2met la valeur dans le stockage persistant et la Activity1lit à partir de là.
Henry
@kumareloaded: Pourriez-vous s'il vous plaît partager la solution ici. Pastebin ne fonctionne pas dans mon pays pour le moment.
user1903022

Réponses:

328

Démarrez Activity2 avec startActivityForResultet utilisez la setResultméthode pour renvoyer les données de Activity2 vers Activity1. Dans Activity1, vous devrez remplacer onActivityResultpour la mise TextViewà jour avec les EditTextdonnées de Activity2.

Par exemple:

Dans Activity1 , démarrez Activity2 en tant que:

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

Dans Activity2 , utilisez setResultpour renvoyer des données:

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

Et dans Activity1 , recevez des données avec 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");
         }     
    }
} 

Si vous le pouvez, utilisez également SharedPreferences pour partager des données entre les activités.

ρяσѕρєя K
la source
1
merci mec, si vous pouvez, pouvez-vous m'aider avec la partie de codage similaire pour SharedPreferences pour faire de même :)
kumareloaded
1
@kumareloaded: l'ami le plus apprécié. si vous voulez faire de même en utilisant, SharedPreferencesvoyez cet exemple
ρяσѕρєя K
2
@kumareloaded: si vous me donnez des liens de code des deux classes avec ce que vous avez essayé en utilisant pastebin.com alors je modifierai votre code
ρяσѕρєя K
1
@kumareloaded: utilisez maintenant ce code et cela fonctionnera
ρяσѕρєя K
1
@ ρяσѕρєяK: Pourriez-vous s'il vous plaît partager le code du scénario ci-dessus en utilisant SharedPref dans votre réponse. Pastebin ne s'ouvre pas dans de nombreux pays. Le partager ici serait d'une grande aide, merci.
user1903022
27

Activity1 doit démarrer Activity2 avec startActivityForResult().

Activity2 doit être utilisé setResult()pour renvoyer les données à Activity1 .

Dans Activity2 ,

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

Dans Activity1 ,

onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == 1) {
        if(resultCode == RESULT_OK) {
            String myStr=data.getStringExtra("MyData");
            mTextView.setText(myStr);
        }
    }
}
Swayam
la source
@Swayam Je suppose que parce que vous n'avez pas mentionné activity1 devrait démarrer activity2 avec startactivityforresult.
LutfiTekin
1
@LutfiTekin: Cela pourrait très bien être ça! Merci de l'avoir signalé! J'ai modifié ma réponse. :)
Swayam
17

D' autres réponses ne fonctionnaient pas quand je mets setResulten onBackPressed. Commenter l'appel à super onBackPressedet appeler finishmanuellement résout le problème:

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

Et en première activité:

@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;
        }
    }
}
FindOut_Quran
la source
6

Prenez ceci comme une alternative à startActivityforResult, mais gardez à l'esprit que dans de tels cas, cette approche peut être coûteuse en termes de performances, mais dans certains cas, vous devrez peut-être l'utiliser.

Dans Activity2,

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

Dans Activity1,

 @Override
public void onResume() {
SharedPreferences sp = getSharedPreferences("LoginInfos", 0);
String  dataFromOtherAct= sp.getString("email", "no email");
} 
Katmanco
la source
Cela ne peut pas être utilisé pour un objet (uniquement chaîne, booléen, etc.)
FindOut_Quran
1
Dans mon cas, je lancais une activité à partir d'un élément de liste dans MainActivity et je voulais récupérer les données créées par l'utilisateur vers cet élément de liste. startActivityForResult () n'était pas disponible pour moi dans ce cas où j'utilisais mContext.startActivity (). L'exemple @katmanco ici a été un travail utile.
2017 défectueux
pour mon c'est une mauvaise élection. exist actionForResult
marlonpya
3

Depuis votre FirstActivity, appelez SecondActivity à l'aide de la méthode startActivityForResult ().

Par exemple:

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

Dans votre SecondActivity, définissez les données que vous souhaitez renvoyer à FirstActivity. Si vous ne souhaitez pas revenir en arrière, n'en définissez aucun.

Par exemple: dans secondActivity si vous souhaitez renvoyer des données:

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

Si vous ne souhaitez pas renvoyer de données:

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

Maintenant, dans votre classe FirstActivity, écrivez le code suivant pour la méthode 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
        }
    }
}
Manoj Reddy
la source
2

ceci est votre première activité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");
    }
}
}

De là, vous démarrez votre Activity2.class en utilisant startActivityForResult (mRequestCode, Activity2.class);

Maintenant, c'est votre deuxième activité, le nom est 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);
}

}

Maintenant, lorsque vous avez terminé votre deuxième activité, vous appelez la méthode setResult (), à partir de onBackPress () ou à partir de n'importe quel bouton, cliquez lorsque votre Activity2 sera détruit, la méthode de rappel de votre Activity1 onActivityResult () appellera à partir de là, vous pouvez obtenir vos données de l'intention ..

J'espère que cela vous aidera ... :)

Vishesh Chandra
la source
1

TL; DR Utilisation Activity.startActivityForResult

Longue réponse:

Vous devriez commencer par lire la documentation du développeur Android. Plus précisément, le sujet de votre question est traité dans la Starting Activities and Getting Resultssection de la Activitydocumentation.

Comme exemple de code, le SDK Android fournit de bons exemples. En outre, d'autres réponses ici vous donnent de courts extraits de code à utiliser.

Cependant, si vous recherchez des alternatives, lisez cette question SO . Ceci est une bonne discussion sur la façon d'utiliser startActivityForResultsavec des fragments, ainsi que sur quelques approches pour transmettre des données entre les activités.

Franci Penov
la source
0

et j'ai un problème pour lequel je voulais faire ce type de données d'envoi dans un Soft Button que j'avais créé et la softKey qui est la valeur par défaut dans chaque appareil Android, donc je l'ai fait, j'ai d'abord créé un Intentdans mon "A" Activity:

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

Puis dans ma deuxième activité, j'ai déclaré un champ dans mon "B" Activity:

private static int resultCode = 40;

puis après avoir fait ma demande avec succès ou chaque fois que je voulais dire à l'activité "A" que ce travail est terminé avec succès ici, changez la valeur de resultCode pour la même que j'ai dit dans "A" Activityqui dans mon cas est "60" et puis:

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

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

PS: n'oubliez pas de supprimer le Superde la méthode onBackPressed si vous souhaitez que cela fonctionne correctement.

alors je devrais également appeler la onActivityResultméthode dans mon activité «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();
            }
        }
    }

c'est tout, j'espère que cela vous aidera. #HappyCoding;

Arash Afsharpour
la source