Comment puis-je obtenir des données supplémentaires de l'intention sur Android?

751

Comment envoyer des données d'une activité (intention) à une autre?

J'utilise ce code pour envoyer des données:

Intent i=new Intent(context,SendMessage.class);
i.putExtra("id", user.getUserAccountId()+"");
i.putExtra("name", user.getUserFullName());
context.startActivity(i);
Adham
la source
82
Note latérale Java: Ce n'est jamais une bonne idée de "stringifier" un entier comme ça (surtout à des fins d'exemple), et malheureusement c'est souvent considéré comme un bon moyen rapide de convertir int en chaîne en java:, user.getUserAccountId()+""car cela créerait des objets inutiles à collecter. Pensez à utiliser String.valueOf(user.getUserAccountId), ou à la Integer.toString(user.getUserAccountId)place.
pkk
5
@Andrew S N'est-ce pas le Web? Ceci est le résultat numéro un pour "obtenir des données à partir de l'intention"
McGuile
@AndrewS Je suis d'accord avec McGuile. De plus, cette question a été publiée il y a quelque temps, donc la réponse n'était probablement pas aussi facile à trouver à l'époque. Et si une question similaire n'avait pas encore été publiée sur SO, c'était un message valide.
0xCursor

Réponses:

1213

Tout d'abord, obtenez l'intention qui a commencé votre activité en utilisant la getIntent()méthode:

Intent intent = getIntent();

Si vos données supplémentaires sont représentées sous forme de chaînes, vous pouvez utiliser la intent.getStringExtra(String name)méthode. Dans ton cas:

String id = intent.getStringExtra("id");
String name = intent.getStringExtra("name");
Malcolm
la source
6
d'où puis-je utiliser toute cette méthode ??
Adham
46
@adham: Si vous êtes dans une activité, depuis onCreate, vous appelez getIntent().getStringExtra("id");pour obtenir la chaîne d'identification
ccheneson
1
Vous pouvez obtenir l'intention qui a démarré votre activité en appelant la getIntent()méthode. J'ai mis à jour la réponse.
Malcolm
1
@Eatlon Si vous avez un problème avec une bibliothèque spécifique, vous devez créer une question distincte à ce sujet.
Malcolm
1
@MelColm quelle est la différence entre getExtra (). GetString et getStringExtra ()?
Amit Tripathi
188

Dans l'activité de réception

Bundle extras = getIntent().getExtras(); 
String userName;

if (extras != null) {
    userName = extras.getString("name");
    // and get whatever type user account id is
}
NickT
la source
6
Pourquoi est-ce préférablegetStringExtra?
IgorGanapolsky
6
Ma conjecture est la suivante: si les extras peuvent l'être null, tous les extras récupérés peuvent être ignorés. En utilisant getStringExtra, vous le changez essentiellement en une série de if(extras != null) { return extras.getString(name) }. Un pour chacun que getStringExtravous appelez. Cette option vérifiera une nullfois et si c'est le cas, cela ne dérangera pas du Bundletout la lecture . En plus de cela, getStringExtracontinuera probablement à getExtraschaque fois de demander en interne. Vous avez donc simplement plus d'appels aux fonctions.
Daniël Sonck
39
//  How to send value using intent from one class to another class
//  class A(which will send data)
    Intent theIntent = new Intent(this, B.class);
    theIntent.putExtra("name", john);
    startActivity(theIntent);
//  How to get these values in another class
//  Class B
    Intent i= getIntent();
    i.getStringExtra("name");
//  if you log here i than you will get the value of i i.e. john
Sumit Sharma
la source
31

Complément

Définir les données

String value = "Hello World!";
Intent intent = new Intent(getApplicationContext(), NewActivity.class);
intent.putExtra("sample_name", value);
startActivity(intent);

Obtenir des données

String value;
Bundle bundle = getIntent().getExtras();
if (bundle != null) {
    value = bundle.getString("sample_name");
}
kenju
la source
17

Au lieu d'initialiser une autre nouvelle intention pour recevoir les données, procédez comme suit:

String id = getIntent().getStringExtra("id");
r_allela
la source
11

Si utilisé dans une FragmentActivity, essayez ceci:

La première page étend FragmentActivity

Intent Tabdetail = new Intent(getApplicationContext(), ReceivePage.class);
Tabdetail.putExtra("Marker", marker.getTitle().toString());
startActivity(Tabdetail);

Dans le fragment, il vous suffit d'appeler d' getActivity()abord,

La deuxième page étend Fragment :

String receive = getActivity().getIntent().getExtras().getString("name");
Bundit Ng
la source
1
Vous pouvez également utiliser getStringExtra ("nom") au lieu de getExtras (). GetString ("nom")
Plot
7

Si vous essayez d'obtenir des données supplémentaires en fragments, vous pouvez essayer d'utiliser:

Placer des données en utilisant:

Bundle args = new Bundle();
args.putInt(DummySectionFragment.ARG_SECTION_NUMBER);

Obtenez des données en utilisant:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {


  getArguments().getInt(ARG_SECTION_NUMBER);
  getArguments().getString(ARG_SECTION_STRING);
  getArguments().getBoolean(ARG_SECTION_BOOL);
  getArguments().getChar(ARG_SECTION_CHAR);
  getArguments().getByte(ARG_SECTION_DATA);

}
star18bit
la source
6

Vous pouvez obtenir tout type de données supplémentaires à partir de l'intention , qu'il s'agisse d'un objet ou d'une chaîne ou de tout type de données.

Bundle extra = getIntent().getExtras();

if (extra != null){
    String str1 = (String) extra.get("obj"); // get a object

    String str2 =  extra.getString("string"); //get a string
}

et la solution la plus courte est:

Boolean isGranted = getIntent().getBooleanExtra("tag", false);
Hasib Akter
la source
4

** Mettre les données par intention - **

 Intent intent = new Intent(mContext, HomeWorkReportActivity.class);
            intent.putExtra("subjectName","Maths");
            intent.putExtra("instituteId",22);
            mContext.startActivity(intent);

** Obtenez des données par intention - **

  String subName = getIntent().getStringExtra("subjectName");
  int insId  getIntent().getIntExtra("instituteId",0);

si nous envoyons une valeur entière par intention. quand nous devons utiliser le 2e paramètre 0 dans getIntent (). getIntExtra ("instituteId", 0) sinon nous n'utilisons pas 0 alors android me donne une erreur.

Om Prakash Sharma
la source
2

Kotlin

Première activité

val intent = Intent(this, SecondActivity::class.java)
intent.putExtra("key", "value")
startActivity(intent)

Deuxième activité

val value = getIntent().getStringExtra("key")

Suggestion

Mettez toujours les clés dans un fichier constant pour une manière plus gérée.

companion object {
    val PUT_EXTRA_USER = "PUT_EXTRA_USER"
}
Khemraj
la source
1

Juste une suggestion:

Au lieu d'utiliser "id" ou "nom" dans votre i.putExtra ("id" .....), je suggère, quand cela a du sens, d'utiliser les champs standard actuels qui peuvent être utilisés avec putExtra (), c'est-à-dire Intent.EXTRA_something.

Une liste complète se trouve sur Intent (Développeurs Android).

Eva
la source
1

Nous pouvons le faire par des moyens simples:

Dans FirstActivity:

Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("uid", uid.toString());
intent.putExtra("pwd", pwd.toString());
startActivity(intent);

Dans SecondActivity:

    try {
        Intent intent = getIntent();

        String uid = intent.getStringExtra("uid");
        String pwd = intent.getStringExtra("pwd");

    } catch (Exception e) {
        e.printStackTrace();
        Log.e("getStringExtra_EX", e + "");
    }
sam
la source
1

Passez l'intention avec valeur sur la première activité:

Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("uid", uid.toString());
intent.putExtra("pwd", pwd.toString());
startActivity(intent);

Recevoir l'intention de la deuxième activité; -

Intent intent = getIntent();
String user = intent.getStringExtra("uid");
String pass = intent.getStringExtra("pwd");

Nous utilisons généralement deux méthodes dans l'intention d'envoyer la valeur et d'obtenir la valeur. Pour l' envoi de la valeur que nous utiliserons intent.putExtra("key", Value);et pendant l' intention de recevoir une autre activité que nous utiliserons intent.getStringExtra("key");pour obtenir les données d' intention que Stringou utiliser une autre méthode disponible pour obtenir d' autres types de données ( Integer, Boolean, etc.). La clé peut être n'importe quel mot clé pour identifier la valeur signifie que la valeur que vous partagez. J'espère que cela fonctionnera pour vous.

Pradeep Sheoran
la source
0

Vous pouvez également faire comme ceci
// mettre de la valeur dans l'intention

    Intent in = new Intent(MainActivity.this, Booked.class);
    in.putExtra("filter", "Booked");
    startActivity(in);

// tirer parti de l'intention

    Intent intent = getIntent();
    Bundle bundle = intent.getExtras();
    String filter = bundle.getString("filter");
Savita Sharma
la source
0

Obtenir différents types d'extra de l'intention

Pour accéder aux données de Intent, vous devez savoir deux choses.

  • CLÉ
  • Type de données de vos données.

Il existe différentes méthodes dans la classe Intent pour extraire différents types de types de données. Ça ressemble à ça

getIntent (). XXXX (KEY) ou intention.XXX (KEY);


Donc, si vous connaissez le type de données de votre varibale que vous avez défini dans otherActivity, vous pouvez utiliser la méthode correspondante.

Exemple pour récupérer de la chaîne dans votre activité depuis l'intention

String profileName = getIntent().getStringExtra("SomeKey");

Liste des différentes variantes de méthodes pour différents types de données

Vous pouvez voir la liste des méthodes disponibles dans la documentation officielle d' intention .

Rohit Singh
la source
0

C'est pour l'adaptateur, pour l'activité, vous avez juste besoin de changer mContext en votre nom Activty et pour le fragment, vous devez changer mContext pour getActivity ()

 public static ArrayList<String> tags_array ;// static array list if you want to pass array data

      public void sendDataBundle(){
            tags_array = new ArrayList();
            tags_array.add("hashtag");//few array data
            tags_array.add("selling");
            tags_array.add("cityname");
            tags_array.add("more");
            tags_array.add("mobile");
            tags_array.add("android");
            tags_array.add("dress");
            Intent su = new Intent(mContext, ViewItemActivity.class);
            Bundle bun1 = new Bundle();
            bun1.putString("product_title","My Product Titile");
            bun1.putString("product_description", "My Product Discription");
            bun1.putString("category", "Product Category");
            bun1.putStringArrayList("hashtag", tags_array);//to pass array list 
            su.putExtras(bun1);
            mContext.startActivity(su);
        }
Android Geek
la source
-2

Je viens de poster ici une réponse qui couvre ce sujet de manière un peu plus détaillée, y compris quelques alternatives.

Il utilise Vapor API , un nouveau framework Android inspiré de jQuery que j'ai écrit pour simplifier le développement Android. Consultez l'exemple de cette réponse pour savoir comment vous pouvez facilement transmettre des données entre les activités.

Il montre également ce VaporIntentqui vous permet d'enchaîner les appels de méthode et d'utiliser la .put(...)méthode surchargée :

$.Intent().put("data", "myData").put("more", 568)...

Vous pouvez facilement transmettre des données à l'ensemble de votre application à l'aide de l' API Vapor , alors j'espère que cela vous sera utile, ainsi qu'aux autres, pendant le développement de l'application.

Darius
la source
1
j'avais vu certaines de vos réponses sur Vapor API. C'est intéressant. Comment obtenez-vous ces données (comme Intent.getextras ()) ??
Kalai.G
Découvrez cela , il explique comment récupérer les extras d'intention. Plus de détails ici . Est ce que ça aide?
Darius
2
Je pense que l'enchaînement des méthodes a trop de frais généraux. Si vous appelez une méthode qui renvoie "this" juste pour être chaînable (c'est-à-dire "setters"), cela viole les principes de conception de la POO. J'aime la simplicité, mais le débogage peut aussi être gênant si vous avez une chaîne de méthodes. Je vois de la valeur dans l'API, je ne suis tout simplement pas d'accord avec le chaînage des méthodes.
nckbrz