Comment transmettre les valeurs d'une activité à une activité précédente

99

Comment passer une valeur d'un écran à son écran précédent?

Considérez ce cas: j'ai deux activités. Le premier écran a un TextViewet un bouton et la deuxième activité a un EditTextet un bouton.

Si je clique sur le premier bouton, il doit passer à la deuxième activité et ici l'utilisateur doit taper quelque chose dans la zone de texte. S'il appuie sur le bouton à partir du deuxième écran, les valeurs de la zone de texte doivent passer à la première activité et qui doivent être affichées dans la première activité TextView.

Kumar
la source

Réponses:

244

Pour capturer les actions effectuées sur une activité dans une autre, il faut trois étapes.

Lancez l'activité secondaire (votre activité «Modifier le texte») en tant que sous-activité à l'aide startActivityForResultde votre activité principale.

Intent i = new Intent(this,TextEntryActivity.class);    
startActivityForResult(i, STATIC_INTEGER_VALUE);

Dans la sous-activité, plutôt que de simplement fermer l'activité lorsqu'un utilisateur clique sur le bouton, vous devez créer une nouvelle intention et inclure la valeur de texte saisie dans son ensemble d'extras. Pour le renvoyer à l'appel du parent setResultavant d'appeler finishpour fermer l'activité secondaire.

Intent resultIntent = new Intent();
resultIntent.putExtra(PUBLIC_STATIC_STRING_IDENTIFIER, enteredTextValue);
setResult(Activity.RESULT_OK, resultIntent);
finish();

La dernière étape est dans l'activité d'appel: Remplacer onActivityResultpour écouter les rappels de l'activité d'entrée de texte. Obtenez le supplément de l'intention renvoyée pour obtenir la valeur de texte que vous devriez afficher.

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) {     
  super.onActivityResult(requestCode, resultCode, data); 
  switch(requestCode) { 
    case (STATIC_INTEGER_VALUE) : { 
      if (resultCode == Activity.RESULT_OK) { 
      String newText = data.getStringExtra(PUBLIC_STATIC_STRING_IDENTIFIER);
      // TODO Update your TextView.
      } 
      break; 
    } 
  } 
} 
Reto Meier
la source
27
Tout cela a fonctionné pour moi, sauf qu'il new Intent(null);était "trop ​​ambigu" et j'ai dû le changer new Intent();.
Richard Tingle
1
Il convient également de noter que cela ne fonctionnera que dans le même contexte. Si vous démarrez l'activité à partir d'un fragment par exemple, cela ne fonctionnera pas car le requestCode sera différent à chaque fois. Vous devrez utiliser getActivity (). StartActivityForResult () dans le fragment.
stef du
10

Il existe deux façons d'accéder à des variables ou à des objets dans d'autres classes ou activités.

A. Base de données

B. préférences partagées.

C. Sérialisation d'objets.

D. Une classe qui peut contenir des données communes peut être nommée comme utilitaires communs, cela dépend de vous.

E. Transmission des données via les intentions et l'interface parcelable.

Cela dépend des besoins de votre projet.

A. Base de données

SQLite est une base de données Open Source intégrée à Android. SQLite prend en charge les fonctionnalités de base de données relationnelles standard telles que la syntaxe SQL, les transactions et les instructions préparées.

Tutoriels - http://www.vogella.com/articles/AndroidSQLite/article.html

B. Préférences partagées

Supposons que vous souhaitiez stocker le nom d'utilisateur. Il y aura donc maintenant deux choses: un nom d' utilisateur clé , une valeur de valeur.

Comment conserver

 // Create object of SharedPreferences.
 SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
 //now get Editor
 SharedPreferences.Editor editor = sharedPref.edit();
 //put your value
 editor.putString("userName", "stackoverlow");

 //commits your edits
 editor.commit();

En utilisant putString (), putBoolean (), putInt (), putFloat (), putLong (), vous pouvez enregistrer votre dtatype souhaité.

Comment récupérer

SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
String userName = sharedPref.getString("userName", "Not Available");

http://developer.android.com/reference/android/content/SharedPreferences.html

C. Sérialisation d'objets

La sérialisation d'objet est utilisée si nous voulons enregistrer un état d'objet pour l'envoyer sur le réseau ou si vous pouvez également l'utiliser à vos fins.

Utilisez java beans et stockez-y comme l'un de ses champs et utilisez des getters et des setter pour cela

Les JavaBeans sont des classes Java qui ont des propriétés. Considérez les propriétés comme des variables d'instance privées. Puisqu'ils sont privés, le seul moyen d'y accéder depuis l'extérieur de leur classe est d'utiliser les méthodes de la classe. Les méthodes qui modifient la valeur d'une propriété sont appelées méthodes de définition et les méthodes qui récupèrent la valeur d'une propriété sont appelées méthodes de lecture.

public class VariableStorage implements Serializable  {

    private String inString ;

    public String getInString() {
        return inString;
    }

    public void setInString(String inString) {
        this.inString = inString;
    }


}

Définissez la variable dans votre méthode de messagerie en utilisant

VariableStorage variableStorage = new VariableStorage();
variableStorage.setInString(inString);

Utilisez ensuite la sérialisation d'objet pour sérialiser cet objet et dans votre autre classe désérialisez cet objet.

Dans la sérialisation, un objet peut être représenté comme une séquence d'octets qui comprend les données de l'objet ainsi que des informations sur le type de l'objet et les types de données stockées dans l'objet.

Une fois qu'un objet sérialisé a été écrit dans un fichier, il peut être lu à partir du fichier et désérialisé, c'est-à-dire que les informations de type et les octets qui représentent l'objet et ses données peuvent être utilisés pour recréer l'objet en mémoire.

Si vous voulez un tutoriel pour cela, reportez-vous à ce lien

http://javawithswaranga.blogspot.in/2011/08/serialization-in-java.html

Obtenir une variable dans d'autres classes

D. Services courants

Vous pouvez créer vous-même une classe qui peut contenir des données communes dont vous avez fréquemment besoin dans votre projet.

Échantillon

public class CommonUtilities {

    public static String className = "CommonUtilities";

}

E. Transmission de données par des intentions

Veuillez consulter ce tutoriel pour cette option de transmission de données.

http://shri.blog.kraya.co.uk/2010/04/26/android-parcel-data-to-pass-between-activities-using-parcelable-classes/

Nikhil Agrawal
la source
6

vous n'avez pas à ...

Appelez simplement newIntent () à partir de la deuxième activité

Intent retData=new Intent();

Ajouter des données à renvoyer

putExtras (retData.putExtra("userName", getUsrName()));

Allez-y avec setResult

setResult(RESULT_OK, retData);

Et peut alors finir

finish();
Sora
la source
2

J'utilise souvent des variables statiques dans l'activité d'appel avec des méthodes de définition statiques pour les définir.

De cette façon, je peux changer les valeurs de n'importe quelle activité à volonté, quel que soit le flux de contrôle exact entre les différentes activités.

Notez que cette astuce ne peut être utilisée que si vous ne vous souciez pas de l'instanciation de plus d'une copie de la même activité (classe) dans l'application, mais j'ai trouvé que c'était la plus simple à implémenter, et je l'utilise le plus .

Ohad Aloni
la source
Pas une bonne solution. Cela va à l'encontre des meilleures pratiques d'Android. Vous ne pouvez pas garantir qu'une activité ne sera pas tuée et une nouvelle instance démarrée par le système.
SIr Codealot
0

La meilleure façon de faire ici est de placer une variable dans une classe commune qui est définie en dehors de la portée

public class Utils 
{
    public static String mPosition;
}

à l'intérieur de votre code (par exemple OnButtonClick etc ...)

Intent intent = new Intent(Intent.ACTION_PICK, 
ContactsContract.Contacts.CONTENT_URI);
Utils.mPosition = mViewData.mPosition + "";
LogHelper.e(TAG, "before intent: " + Utils.mPosition);
startActivityForResult(intent, Keys.PICK_CONTACT);

à l'intérieur du code de

@Override public void onActivityResult (int requestCode, int resultCode, Intent data) {if (requestCode == Keys.PICK_CONTACT) {if (resultCode == Activity.RESULT_OK) {Uri contactData = data.getData ();

            //you may use the variable here after intent result
            LogHelper.e(TAG, "after intent: " + Utils.mPosition);
....
Alp Altunel
la source