web-dev-qa-db-fra.com

Envoi de données à l'activité principale sous Android

J'ai deux activités: l'activité principale et l'activité des enfants.
Lorsque j'appuie sur un bouton de l'activité principale, l'activité enfant est lancée. 

Maintenant, je veux envoyer des données à l'écran principal. J'ai utilisé la classe Bundle, mais cela ne fonctionne pas. Il jette des exceptions d'exécution.

Existe-t-il une solution à ça? 

246
Rajapandian

Selon les circonstances, il y a plusieurs façons de réaliser ce que vous voulez. 

Le scénario le plus courant (ce à quoi vous ressemblez) est celui où une activité enfant est utilisée pour obtenir une entrée de l'utilisateur, telle que la sélection d'un contact dans une liste ou la saisie de données dans une boîte de dialogue. Dans ce cas, vous devez utiliser startActivityForResult pour lancer l'activité de votre enfant.

Cela fournit un pipeline pour renvoyer des données à l'activité principale à l'aide de setResult . La méthode setResult prend une valeur de résultat int et une intention qui sont renvoyées à l'activité appelante.

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

Pour accéder aux données renvoyées dans l'activité appelante, remplacez onActivityResult. Le requestCode correspond à l'entier transmis dans l'appel startActivityForResult, alors que le resultCode et les données Intent sont renvoyés par l'activité enfant.

@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

L'activité 1 utilise startActivityForResult :

startActivityForResult(ActivityTwo, ActivityTwoRequestCode);

L'activité 2 est lancée et vous pouvez effectuer l'opération. Pour la fermer, procédez comme suit:

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

L'activité 1 - en revenant de l'activité précédente appelle onActivityResult :

@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: Réponse au commentaire de Seenu69, dans l'activité deux,

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

Puis dans l'activité un,

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

Envoi de données en retour

Cela m'aide à voir les choses dans leur contexte. Voici un projet simple et complet pour renvoyer des données. Plutôt que de fournir les fichiers de mise en page XML, voici une image.

 enter image description here

Activité principale

  • Commencez la deuxième activité avec startActivityForResult en lui fournissant un code de résultat arbitraire.
  • Remplacer onActivityResult. Ceci est appelé à la fin de la deuxième activité. Vous pouvez vous assurer qu'il s'agit bien de la deuxième activité en vérifiant le code de la demande. (Ceci est utile lorsque vous démarrez plusieurs activités différentes à partir de la même activité principale.)
  • Extrayez les données que vous avez obtenues à partir de la déclaration Intent. Les données sont extraites à l'aide d'une paire clé-valeur.

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

Deuxième activité

  • Placez les données que vous souhaitez renvoyer à l'activité précédente dans une variable Intent. Les données sont stockées dans Intent à l'aide d'une paire clé-valeur.
  • Définissez le résultat sur RESULT_OK et ajoutez l’intention contenant vos données.
  • Appelez finish() pour fermer la deuxième activité.

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

Autres notes

  • Si vous êtes dans un fragment, il ne saura pas la signification de RESULT_OK. Utilisez simplement le nom complet: Activity.RESULT_OK.

Voir également

56
Suragch

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

Sur SecondActivity, appelez les événements onClick setResult () ou onBackPressed ()

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

Appelez l'intention de l'activité enfant à l'aide de l'appel de la méthode startActivityForResult ()

Voici un exemple de ceci: http://developer.Android.com/training/notepad/notepad-ex2.html

et dans la section "Retour d'un résultat à partir d'un écran" de ceci: http://developer.Android.com/guide/faq/commontasks.html#opennewscreen

15
Intrications

J'ai créé un cours de démonstration simple pour votre meilleure référence.

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

    }
}

Et voici 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

Dans la première activité, vous pouvez envoyer une intention à l'aide de startActivityForResult(), puis obtenir le résultat de la deuxième activité après son utilisation de setResult.

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

Il y a plusieurs façons de le faire ... 1. en utilisant startActivityForResult (), ce qui est très bien expliqué dans les réponses ci-dessus.

  1. en créant les variables statiques dans votre classe "Utils" ou dans une autre classe de votre choix. Par exemple, je souhaite transmettre studentId d’ActivityB à ActivityA. Tout d’abord, mon ActivityA appelle l’ActivityB. Ensuite, dans ActivityB, définissez studentId (qui est un champ statique dans Utils.class) . Comme ceci, Utils.STUDENT_ID = "1234"; ensuite, en revenant à ActivityA, utilisez studentId qui est stocké dans Utils.STUDENT_ID.

  2. en créant une méthode getter et setter dans votre classe d'application.

comme ça: 

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

alors vous avez terminé. Il suffit de définir les données à l'intérieur lorsque vous êtes dans ActivityB et après être revenu à ActivityA, récupérez les données.

0
swetabh suman

Utilisez sharedPreferences et enregistrez vos données et accédez-les où que vous soyez dans l'application.

enregistrer la date comme ça

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

Et recevoir des données comme celle-ci

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

Toutes ces réponses expliquent que le scénario de votre deuxième activité doit être terminé après l'envoi des données.

Mais si vous ne souhaitez pas terminer la deuxième activité et que vous souhaitez renvoyer les données en premier, vous pouvez utiliser BroadCastReceiver.

En deuxième activité -

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

En première activité-

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

Enregistrez le destinataire dans onCreate () -

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

Annuler son enregistrement dans onDestroy ()

0
Shivam Yadav