Come posso ottenere dati extra dalle intenzioni su Android?


750

Come posso inviare dati da un'attività (intento) a un'altra?

Uso questo codice per inviare dati:

Intent i=new Intent(context,SendMessage.class);
i.putExtra("id", user.getUserAccountId()+"");
i.putExtra("name", user.getUserFullName());
context.startActivity(i);

82
Nota a margine di Java: non è mai una buona idea "stringere" numeri interi come quelli (specialmente per scopi di esempio), e sfortunatamente è spesso considerato un buon modo rapido per convertire int in string in java:, user.getUserAccountId()+""poiché ciò creerebbe oggetti non necessari da raccogliere. Prendi in considerazione l'utilizzo String.valueOf(user.getUserAccountId)o Integer.toString(user.getUserAccountId)invece.
pkk,

5
@Andrew S Non è questo il web? Questo è il risultato numero uno per "ottenere dati dagli intenti"
McGuile,

@AndrewS Sono d'accordo con McGuile. Inoltre, questa domanda è stata pubblicata qualche tempo fa, quindi la risposta probabilmente non era così facile da trovare allora. E se una domanda simile non era stata ancora inviata a SO, allora era un post valido.
0xCursore

Risposte:


1212

Innanzitutto, ottieni l'intento che ha avviato la tua attività utilizzando il getIntent()metodo:

Intent intent = getIntent();

Se i tuoi dati extra sono rappresentati come stringhe, puoi usare il intent.getStringExtra(String name)metodo. Nel tuo caso:

String id = intent.getStringExtra("id");
String name = intent.getStringExtra("name");

6
da dove posso tutto questo metodo ??
Adham,

46
@adham: se sei in un'attività, dall'interno di onCreate, chiami getIntent().getStringExtra("id");per ottenere la stringa id
ccheneson

1
Puoi ottenere l'intento che ha iniziato la tua attività chiamando il getIntent()metodo. Ho aggiornato la risposta.
Malcolm,

1
@Eatlon Se hai un problema con una libreria specifica, dovresti creare una domanda separata a riguardo.
Malcolm,

1
@MelColm qual è la differenza tra getExtra (). GetString e getStringExtra ()?
Amit Tripathi,

188

Nell'attività di ricezione

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

if (extras != null) {
    userName = extras.getString("name");
    // and get whatever type user account id is
}

6
Perché è preferibile questogetStringExtra?
IgorGanapolsky

6
La mia ipotesi è: se gli extra possono essere null, l'intero recupero degli extra può essere ignorato. Usando getStringExtra, lo cambi sostanzialmente in una serie di if(extras != null) { return extras.getString(name) }. Uno per ciascuno getStringExtrache chiami. Questa opzione verificherà nulluna volta e, in tal caso, non si preoccuperà di leggere Bundleaffatto. Oltre a ciò, getStringExtraprobabilmente continuerà a chiedere anche getExtrasinternamente ogni volta. Quindi hai semplicemente più chiamate alle funzioni.
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

31

Addizionare

Imposta dati

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

Ottieni dati

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

17

Invece di inizializzare un altro nuovo intento per ricevere i dati, basta fare questo:

String id = getIntent().getStringExtra("id");

11

Se utilizzato in un FragmentActivity, prova questo:

La prima pagina estende FragmentActivity

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

Nel frammento, devi solo chiamare getActivity() prima,

La seconda pagina estende il frammento :

String receive = getActivity().getIntent().getExtras().getString("name");

1
Inoltre potresti usare getStringExtra ("name") invece di getExtras (). GetString ("name")
Trama

7

Se stai cercando di ottenere dati extra in frammenti, puoi provare a usare:

Inserire i dati utilizzando:

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

Ottieni dati usando:

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

}

6

Puoi ottenere qualsiasi tipo di dati extra dall'intento , indipendentemente dal fatto che si tratti di un oggetto o di una stringa o di qualsiasi tipo di dati.

Bundle extra = getIntent().getExtras();

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

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

e la soluzione più breve è:

Boolean isGranted = getIntent().getBooleanExtra("tag", false);

4

** Inserisci dati per intento - **

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

** Ottieni dati per intento - **

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

se inviamo il valore intero per Intento. quando dobbiamo usare il 2o parametro 0 in getIntent (). getIntExtra ("instituteId", 0) altrimenti non usiamo 0 quindi android mi dà errore.


2

Kotlin

Prima attività

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

Seconda attività

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

Suggerimento

Metti sempre le chiavi in ​​un file costante per un modo più gestito.

companion object {
    val PUT_EXTRA_USER = "PUT_EXTRA_USER"
}

1

Solo un suggerimento:

Invece di usare "id" o "name" nel tuo i.putExtra ("id" .....), suggerirei, quando ha senso, di utilizzare i campi standard correnti che possono essere usati con putExtra (), cioè Intent.EXTRA_something.

Un elenco completo è disponibile su Intent (Android Developers).


1

Possiamo farlo con mezzi semplici:

In FirstActivity:

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

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

1

Passa l'intento con valore sulla prima attività:

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

Ricevi intento sulla seconda attività; -

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

Usiamo generalmente due metodi per inviare il valore e ottenere il valore. Per l'invio del valore useremo intent.putExtra("key", Value);e durante ricevere intenti a un'altra attività useremo intent.getStringExtra("key");per ottenere i dati intenti come Stringo utilizzare un altro metodo a disposizione per ottenere altri tipi di dati ( Integer, Boolean, ecc). La chiave può essere qualsiasi parola chiave per identificare il valore significa che quale valore stai condividendo. Spero che funzionerà per te.


0

Puoi anche fare così
// mettere valore nell'intento

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

// ottiene valore dall'intento

    Intent intent = getIntent();
    Bundle bundle = intent.getExtras();
    String filter = bundle.getString("filter");

0

Ottenere diversi tipi di extra dall'intento

Per accedere ai dati da Intent dovresti sapere due cose.

  • CHIAVE
  • DataType dei tuoi dati.

Esistono diversi metodi nella classe Intent per estrarre diversi tipi di tipi di dati. Sembra così

getIntent (). XXXX (KEY) o intent.XXX (KEY);


Quindi se conosci il tipo di dati del tuo varibale che hai impostato in otherActivity puoi usare il rispettivo metodo.

Esempio per recuperare una stringa nell'attività dall'intento

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

Elenco di diverse varianti di metodi per diversi tipi di dati

Puoi vedere l'elenco dei metodi disponibili nella Documentazione ufficiale degli intenti .


0

Questo è per l'adattatore, per l'attività devi solo cambiare mContext con il tuo nome Activty e per il frammento devi cambiare mContext in 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);
        }

-2

Ho appena pubblicato una risposta qui che tratta questo argomento in modo un po 'più dettagliato, incluse alcune alternative.

Utilizza Vapor API , un nuovo framework Android ispirato a jQuery che ho scritto per semplificare gli sviluppatori Android. Guarda l'esempio in quella risposta per come puoi facilmente passare i dati tra le attività.

Inoltre dimostra VaporIntent, che consente di concatenare le chiamate al metodo e utilizzare il .put(...)metodo sovraccarico :

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

Puoi facilmente trasferire i dati su tutta la tua applicazione usando l' API di Vapor , quindi speriamo che sia utile a te e agli altri durante lo sviluppo dell'app.


1
ho visto alcune delle tue risposte sull'API di Vapor. È interessante. Come ottieni quei dati (come Intent.getextras ()) ??
Kalai.G,

Dai un'occhiata a questo , spiega come recuperare gli extra Intent. Maggiori dettagli sono qui . Questo aiuta?
Dario

2
Penso che i metodi di concatenamento abbiano troppi costi generali. Se stai chiamando un metodo che restituisce "questo" solo per essere incatenabile (cioè "setter"), ciò viola i principi di progettazione di OOP. Mi piace la semplicità, ma il debug può anche causare problemi se si dispone di una catena di metodi. Vedo valore nell'API, semplicemente non sono d'accordo con il metodo concatenato.
nckbrz,
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.