Wie erhalte ich zusätzliche Daten von Intent auf Android?

750

Wie kann ich Daten von einer Aktivität (Absicht) an eine andere senden?

Ich benutze diesen Code, um Daten zu senden:

Intent i=new Intent(context,SendMessage.class);
i.putExtra("id", user.getUserAccountId()+"");
i.putExtra("name", user.getUserFullName());
context.startActivity(i);
Adham
quelle
82
Java-Randnotiz: Es ist nie eine gute Idee, eine solche Ganzzahl (insbesondere zum Beispiel) so zu "stringifizieren", und leider wird sie häufig als eine gute und schnelle Möglichkeit angesehen, int in Java in String zu konvertieren : user.getUserAccountId()+"", da dies unnötige Objekte erzeugen würde gesammelt werden. Erwägen Sie die Verwendung von String.valueOf(user.getUserAccountId)oder Integer.toString(user.getUserAccountId)stattdessen.
pkk
5
@ Andrew S Ist das nicht das Web? Dies ist das Ergebnis Nummer eins für "Daten aus Absicht
abrufen
@ Andrews Ich stimme McGuile zu. Außerdem wurde diese Frage vor einiger Zeit gestellt, sodass die Antwort damals wahrscheinlich nicht so leicht zu finden war. Und wenn eine ähnliche Frage noch nicht an SO gesendet wurde, war es ein gültiger Beitrag.
0xCursor

Antworten:

1212

Ermitteln Sie zunächst die Absicht, mit der Ihre Aktivität gestartet wurde, mithilfe der folgenden getIntent()Methode:

Intent intent = getIntent();

Wenn Ihre zusätzlichen Daten als Zeichenfolgen dargestellt werden, können Sie die intent.getStringExtra(String name)Methode verwenden. In Ihrem Fall:

String id = intent.getStringExtra("id");
String name = intent.getStringExtra("name");
Malcolm
quelle
6
von wo kann ich all diese Methode?
Adham
46
@adham: Wenn Sie in einer Aktivität sind, rufen Sie innerhalb von onCreate an, getIntent().getStringExtra("id");um die ID-Zeichenfolge zu erhalten
ccheneson
1
Sie können die Absicht, die Ihre Aktivität gestartet hat, durch Aufrufen der getIntent()Methode erhalten. Ich habe die Antwort aktualisiert.
Malcolm
1
@Eatlon Wenn Sie ein Problem mit einer bestimmten Bibliothek haben, sollten Sie eine separate Frage dazu erstellen.
Malcolm
1
@ MelColm Was ist der Unterschied zwischen getExtra (). GetString und getStringExtra ()?
Amit Tripathi
188

In der empfangenden Aktivität

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

if (extras != null) {
    userName = extras.getString("name");
    // and get whatever type user account id is
}
NickT
quelle
6
Warum ist das vorzuziehengetStringExtra?
IgorGanapolsky
6
Meine Vermutung ist: Wenn die Extras sein können, nullkann der gesamte Extras-Abruf übersprungen werden. Durch die Verwendung getStringExtraändern Sie es im Grunde in eine Reihe von if(extras != null) { return extras.getString(name) }. Eine für jeden, den getStringExtraSie anrufen. Diese Option wird nulleinmal überprüft und wenn ja, wird das Lesen Bundleüberhaupt nicht gestört . Außerdem getStringExtrawerde ich wahrscheinlich getExtrasjedes Mal auch intern nachfragen . Sie haben also einfach mehr Funktionsaufrufe.
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
quelle
31

Add-up

Daten einstellen

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

Daten empfangen

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

Anstatt eine andere neue Absicht zum Empfangen der Daten zu initialisieren, gehen Sie einfach wie folgt vor:

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

Wenn Sie in einer FragmentActivity verwendet werden, versuchen Sie Folgendes:

Die erste Seite erweitert FragmentActivity

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

In dem Fragment müssen Sie nur getActivity()zuerst aufrufen ,

Die zweite Seite erweitert Fragment :

String receive = getActivity().getIntent().getExtras().getString("name");
Bundit Ng
quelle
1
Sie können auch getStringExtra ("name") anstelle von getExtras () verwenden. GetString ("name")
Plot
7

Wenn Sie versuchen, zusätzliche Daten in Fragmenten abzurufen, können Sie Folgendes verwenden:

Platzieren Sie Daten mit:

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

Holen Sie sich Daten mit:

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
quelle
6

Sie können jede Art von zusätzlichen Daten aus der Absicht abrufen , unabhängig davon, ob es sich um ein Objekt, eine Zeichenfolge oder eine beliebige Art von Daten handelt.

Bundle extra = getIntent().getExtras();

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

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

und die kürzeste Lösung ist:

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

** Daten nach Absicht setzen - **

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

** Daten nach Absicht abrufen - **

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

wenn wir einen Integer-Wert durch Intent senden . Wenn wir den 2. Parameter 0 in getIntent () verwenden müssen. getIntExtra ("instituteId", 0), sonst verwenden wir keine 0, dann gibt Android mir einen Fehler.

Om Prakash Sharma
quelle
2

Kotlin

Erste Aktivität

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

Zweite Aktivität

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

Vorschlag

Legen Sie die Schlüssel immer in einer konstanten Datei ab, um sie besser verwalten zu können.

companion object {
    val PUT_EXTRA_USER = "PUT_EXTRA_USER"
}
Khemraj
quelle
1

Nur ein Vorschlag:

Anstatt "id" oder "name" in Ihrem i.putExtra ("id" .....) zu verwenden, würde ich vorschlagen, wenn es sinnvoll ist, die aktuellen Standardfelder zu verwenden, die mit putExtra () verwendet werden können, d. H. Intent.EXTRA_something.

Eine vollständige Liste finden Sie unter Intent (Android Developers).

eva
quelle
1

Wir können es mit einfachen Mitteln tun:

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 + "");
    }
Sam
quelle
1

Übergeben Sie die Absicht mit Wert auf Erste Aktivität:

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

Absicht auf zweite Aktivität erhalten; -

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

Wir verwenden im Allgemeinen zwei Methoden, um den Wert zu senden und den Wert zu erhalten. Für den Wert zu senden verwenden wir intent.putExtra("key", Value);und die Absicht während auf einer anderen Tätigkeit erhalten , werden wir verwenden , um intent.getStringExtra("key");die Absicht Daten zu erhalten , wie zu Stringoder verwenden Sie eine andere verfügbare Methode , um andere Arten von Daten ( Integer, Booleanusw.). Der Schlüssel kann ein beliebiges Schlüsselwort sein, um den Wert zu identifizieren. Dies bedeutet, welchen Wert Sie teilen. Hoffe es wird für dich funktionieren.

Pradeep Sheoran
quelle
0

Sie können dies auch tun
// Wert in Absicht setzen

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

// Wert aus Absicht abrufen

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

Verschiedene Arten von Extra von Intent erhalten

Um von Intent auf Daten zuzugreifen, sollten Sie zwei Dinge wissen.

  • SCHLÜSSEL
  • Datentyp Ihrer Daten.

In der Intent-Klasse gibt es verschiedene Methoden, um verschiedene Arten von Datentypen zu extrahieren. Es sieht aus wie das

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


Wenn Sie also den Datentyp Ihrer Varibale kennen, den Sie in otherActivity festgelegt haben, können Sie die entsprechende Methode verwenden.

Beispiel zum Abrufen eines Strings in Ihrer Aktivität von Intent

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

Liste verschiedener Methodenvarianten für verschiedene Datentypen

Die Liste der verfügbaren Methoden finden Sie in der offiziellen Dokumentation der Absicht .

Rohit Singh
quelle
0

Dies ist für den Adapter, für Aktivitäten müssen Sie nur mContext in Ihren Activty-Namen ändern und für Fragmente müssen Sie mContext in getActivity () ändern.

 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
quelle
-2

Ich habe gerade hier eine Antwort gepostet , dass deckt dieses Thema etwas ausführlicher, darunter auch einige Alternativen.

Es verwendet die Vapor API , ein neues von jQuery inspiriertes Android-Framework, das ich geschrieben habe, um die Android-Entwicklung zu vereinfachen. Sehen Sie sich das Beispiel in dieser Antwort an, um zu erfahren, wie Sie Daten einfach zwischen Aktivitäten übertragen können.

Außerdem wird gezeigt VaporIntent, wie Sie Methodenaufrufe verketten und die überladene .put(...)Methode verwenden können:

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

Mit der Vapor-API können Sie problemlos Daten in Ihrer gesamten Anwendung weitergeben. Hoffentlich sind sie für Sie und andere bei der App-Entwicklung hilfreich.

Darius
quelle
1
Ich hatte einige Ihrer Antworten zu Vapor API gesehen. Es ist interessant. Wie erhalten Sie diese Daten (wie Intent.getextras ())?
Kalai.G
Schauen Sie sich diese , erklärt, wie Intent Extras abgerufen werden . Weitere Details finden Sie hier . Hilft das?
Darius
2
Ich denke, Verkettungsmethoden haben zu viel Aufwand. Wenn Sie eine Methode aufrufen, die "this" zurückgibt, nur um verkettbar zu sein (dh "Setter"), verstößt dies gegen die Entwurfsprinzipien von OOP. Ich mag die Einfachheit, aber das Debuggen kann möglicherweise auch schmerzhaft sein, wenn Sie eine Kette von Methoden haben. Ich sehe Wert in der API, ich bin einfach nicht mit der Methodenverkettung einverstanden.
Nckbrz