Jak uzyskać dodatkowe dane z intencji na Androida?


749

Jak mogę wysłać dane z jednego działania (zamiaru) do innego?

Używam tego kodu do wysyłania danych:

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

82
Uwaga poboczna Java: Nigdy nie jest dobrym pomysłem na „stringowanie” liczb całkowitych w ten sposób (szczególnie na przykład w celach), i niestety często uważa się je za dobry, szybki sposób konwersji int na string w java: user.getUserAccountId()+""ponieważ spowodowałoby to powstanie niepotrzebnych obiektów będą zebrane. Rozważ użycie String.valueOf(user.getUserAccountId)lub Integer.toString(user.getUserAccountId)zamiast tego.
pkk

5
@Andrew S Czy to nie jest sieć? Jest to wynik numer jeden dla „pobierz dane z zamiaru”
McGuile,

@AndrewS Zgadzam się z McGuile. Pytanie to zostało zadane jakiś czas temu, więc odpowiedź prawdopodobnie nie była wtedy tak łatwa do znalezienia. A jeśli podobne pytanie nie zostało jeszcze opublikowane w SO, to był to prawidłowy post.
0x Kursor

Odpowiedzi:


1211

Najpierw uzyskaj zamiar, który rozpoczął Twoją aktywność, stosując getIntent()metodę:

Intent intent = getIntent();

Jeśli twoje dodatkowe dane są reprezentowane jako ciągi, możesz użyć intent.getStringExtra(String name)metody. W Twoim przypadku:

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

6
skąd mogę całą tę metodę?
Adham,

46
@adham: Jeśli prowadzisz działalność, z poziomu usługi onCreate dzwonisz, getIntent().getStringExtra("id");aby uzyskać ciąg identyfikatora
ccheneson,

1
Możesz uzyskać zamiar, który rozpoczął Twoją aktywność, wywołując getIntent()metodę. Zaktualizowałem odpowiedź.
Malcolm,

1
@Eatlon Jeśli masz problem z określoną biblioteką, powinieneś utworzyć osobne pytanie na ten temat.
Malcolm

1
@MelColm jaka jest różnica między getExtra (). GetString i getStringExtra ()?
Amit Tripathi,

188

W działalności odbiorczej

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

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

6
Dlaczego jest to lepsze niżgetStringExtra?
IgorGanapolsky

6
Domyślam się: jeśli dodatki mogą być null, można pominąć pobieranie wszystkich dodatków. Używając getStringExtra, zasadniczo zmieniasz go na serię if(extras != null) { return extras.getString(name) }. Jeden za każde getStringExtrapołączenie. Ta opcja sprawdzi się nullraz, a jeśli tak, to wcale nie będzie kłopotać się czytaniem Bundle. Poza tym getStringExtraprawdopodobnie za getExtraskażdym razem będzie też pytał wewnętrznie. Masz więc po prostu więcej wywołań funkcji.
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

Add-up

Ustaw dane

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

Otrzymać dane

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

17

Zamiast inicjować kolejny nowy zamiar odebrania danych, po prostu wykonaj następujące czynności:

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

11

Jeśli jest używany w FragmentActivity, spróbuj tego:

Pierwsza strona rozszerza FragmentActivity

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

W tym fragmencie musisz getActivity()najpierw zadzwonić ,

Druga strona zawiera fragment :

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

1
Możesz także użyć getStringExtra („nazwa”) zamiast getExtras (). GetString („nazwa”)
Drukuj

7

Jeśli próbujesz uzyskać dodatkowe dane we fragmentach, możesz spróbować użyć:

Umieść dane, używając:

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

Uzyskaj dane, używając:

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

Możesz uzyskać dowolny rodzaj dodatkowych danych z zamiaru , bez względu na to, czy jest to obiekt, ciąg znaków, czy dowolny rodzaj danych.

Bundle extra = getIntent().getExtras();

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

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

a najkrótszym rozwiązaniem jest:

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

4

** Umieść dane według zamiaru - **

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

** Uzyskaj dane według zamiaru - **

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

jeśli wyślemy wartość całkowitą przez zamiar. kiedy musimy użyć 2. parametru 0 w getIntent (). getIntExtra („instituteId”, 0), w przeciwnym razie nie użyjemy 0, wtedy Android daje mi błąd.


2

Kotlin

Pierwsza aktywność

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

Druga aktywność

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

Sugestia

Zawsze przechowuj klucze w stałym pliku, aby lepiej zarządzać.

companion object {
    val PUT_EXTRA_USER = "PUT_EXTRA_USER"
}

1

Tylko sugestia:

Zamiast używać „id” lub „name” w i.putExtra („id” .....) sugerowałbym, gdy ma to sens, użycie bieżących standardowych pól, które mogą być używane z putExtra (), tj. Intent.EXTRA_something.

Pełna lista znajduje się na stronie Intent (programiści Androida).


1

Możemy to zrobić w prosty sposób:

W FirstActivity:

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

W 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

Przekaż cel z wartością przy Pierwszej Aktywności:

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

Otrzymać zamiar na drugie działanie; -

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

Używamy zasadniczo dwóch metod w celu przesłania wartości i uzyskania wartości. Do wysyłania wartości użyjemy intent.putExtra("key", Value);oraz podczas odbierania intencji innej działalności będziemy używać intent.getStringExtra("key");, aby uzyskać dane jak zamiarem Stringlub użyć innej dostępnej metody, aby uzyskać inne rodzaje danych ( Integer, Booleanetc.). Kluczem może być dowolne słowo kluczowe w celu identyfikacji wartości oznacza, jaką wartość udostępniasz. Mam nadzieję, że to zadziała.


0

Możesz także zrobić w ten sposób
// zamierzenie wartości

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

// uzyskać wartość z zamiaru

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

0

Uzyskiwanie różnych rodzajów dodatkowych od zamierzonych

Aby uzyskać dostęp do danych z Intent, powinieneś wiedzieć dwie rzeczy.

  • KLUCZ
  • DataType Twoich danych.

Istnieją różne metody w klasie Intent, aby wyodrębnić różnego rodzaju typy danych. To wygląda tak

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


Więc jeśli znasz typ danych swojego varibale, który ustawiłeś w otherActivity, możesz użyć odpowiedniej metody.

Przykład pobierania ciągu znaków z działania z zamiaru

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

Lista różnych wariantów metod dla różnych dataType

Możesz zobaczyć listę dostępnych metod w oficjalnej dokumentacji intencji .


0

To jest dla adaptera, dla działania wystarczy zmienić mContext na nazwę Activty, a dla fragmentu zmienić mContext na 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

Właśnie opublikowałem tutaj odpowiedź , która obejmuje ten temat bardziej szczegółowo, w tym niektóre alternatywy.

Wykorzystuje Vapor API , nową platformę Android inspirowaną przez jQuery, którą napisałem, aby uprościć tworzenie Androida. Sprawdź przykład w tej odpowiedzi, w jaki sposób możesz łatwo przekazywać dane między działaniami.

Pokazuje także VaporIntent, co pozwala ci łączyć wywołania metod i wykorzystywać przeciążoną .put(...)metodę:

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

Możesz łatwo przekazywać dane do całej aplikacji za pomocą Vapor API , więc mam nadzieję, że będzie to pomocne dla ciebie i innych podczas tworzenia aplikacji.


1
Widziałem niektóre z twoich odpowiedzi na temat Vapor API. To ciekawe. Jak uzyskać te dane (jak Intent.getextras ())?
Kalai.G

Sprawdź to , wyjaśnia, jak odzyskać dodatki Intent. Więcej szczegółów tutaj . To pomaga?
Dariusz

2
Myślę, że metody łączenia są zbyt duże. Jeśli wywołujesz dowolną metodę, która zwraca „to” tylko po to, aby była łańcuchowa (tj. „Ustawiające”), narusza to zasady projektowania OOP. Podoba mi się prostota, ale debugowanie może być również uciążliwe, jeśli masz szereg metod. Widzę wartość w API, po prostu nie zgadzam się z łańcuchem metod.
nckbrz
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.