Android'de niyetten nasıl fazla veri alabilirim?


749

Bir etkinlikten (niyetten) diğerine nasıl veri gönderebilirim?

Veri göndermek için bu kodu kullanıyorum:

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

82
: Java yan Not: Bu (özellikle örnek amaçlı) böyle "stringify" tamsayı için iyi bir fikir asla ve ne yazık ki sık sık dönüştürmek int için iyi, hızlı bir yöntemdir dizeye java kabul edilir user.getUserAccountId()+""bu gereksiz nesneler yaratacak şekilde, Toplanacak. Bunun yerine String.valueOf(user.getUserAccountId)veya Integer.toString(user.getUserAccountId)kullanmayı düşünün .
pkk

5
@Andrew S Bu web değil mi? Bu "
niyetten

@AndrewS McGuile ile aynı fikirdeyim. Ayrıca, bu soru bir süre önce gönderildi, bu yüzden cevap o zamanlar bulmak o kadar kolay değildi. Ve benzer bir soru henüz SO'ya gönderilmemişse, geçerli bir gönderiydi.
0xCursor

Yanıtlar:


1211

İlk olarak, etkinliğinizi başlatan niyeti şu getIntent()yöntemi kullanarak alın :

Intent intent = getIntent();

Fazladan verileriniz dize olarak temsil ediliyorsa, intent.getStringExtra(String name)yöntemi kullanabilirsiniz . Senin durumunda:

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

6
Nereden i tüm bu yöntem olabilir?
Adham

46
@adham: onCreate içinden bir etkinliğiniz varsa getIntent().getStringExtra("id");, id stringini almak için arayın
ccheneson

1
Etkinliğinizi başlatan amacı, çağrı getIntent()yöntemiyle alabilirsiniz. Cevabı güncelledim.
Malcolm

1
@Eatlon Belirli bir kitaplıkla ilgili bir sorununuz varsa, bununla ilgili ayrı bir soru oluşturmanız gerekir.
Malcolm

1
@MelColm getExtra (). GetString ve getStringExtra () arasındaki fark nedir?
Amit Tripathi

188

Alıcı aktivitede

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

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

6
Bu neden tercih edilirgetStringExtra?
IgorGanapolsky

6
Benim tahminim: eğer ekstralar olabiliyorsa null, tüm ekstralar atlanabilir. Kullanarak getStringExtra, bunu temel olarak bir dizi olarak değiştirirsiniz if(extras != null) { return extras.getString(name) }. getStringExtraAradığınız her biri için bir tane . Bu seçenek bir nullkez kontrol eder ve eğer öyleyse, okumayı hiç rahatsız etmez Bundle. Bunun yanı sıra, getStringExtramuhtemelen getExtrasher seferinde dahili olarak sormaya devam edecektir . Böylece işlevlere daha fazla çağrı yapabilirsiniz.
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

Verileri Ayarla

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

Veri Al

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

17

Verileri almak için başka bir yeni Amaç başlatmak yerine bunu yapın:

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

11

Bir FragmentActivity'de kullanılıyorsa şunu deneyin:

İlk sayfa FragmentActivity'yi genişletir

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

Parçada, getActivity()önce aramalısınız ,

İkinci sayfa uzanır Fragment :

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

1
Ayrıca getExtras () yerine getStringExtra ("name") kullanabilirsiniz. GetString ("name")
çizin

7

Parçalarda fazladan veri almaya çalışıyorsanız, kullanmayı deneyebilirsiniz:

Verileri aşağıdakileri kullanarak yerleştirin:

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

Aşağıdakileri kullanarak veri alın:

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

Nesne ya da dize ya da herhangi bir veri türü ne olursa olsun, herhangi bir türden ekstra veri alabilirsiniz .

Bundle extra = getIntent().getExtras();

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

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

ve En Kısa çözüm :

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

4

** Verileri Niyete Göre Koy - **

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

** Niyete Göre Veri Alın - **

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

Intger tarafından Tamsayı değeri gönderirsek . getIntent () 'de 2nd Parameter 0 kullanmamız gerektiğinde getIntExtra ("instituteId", 0) aksi takdirde 0 kullanmayız, ardından android bana hata verir.


2

Kotlin

İlk Etkinlik

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

İkinci Etkinlik

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

Öneri

Daha yönetilen bir yol için anahtarları her zaman sabit dosyaya koyun.

companion object {
    val PUT_EXTRA_USER = "PUT_EXTRA_USER"
}

1

Sadece bir öneri:

İ.putExtra ("id" .....) "id" veya "name" kullanmak yerine, mantıklı olduğunda, putExtra () ile kullanılabilen geçerli standart alanları kullanarak öneririm. Intent.EXTRA_something.

Tam liste Intent'te (Android Geliştiricileri) bulunabilir.


1

Bunu basit yollarla yapabiliriz:

FirstActivity'de:

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

SecondActivity'de:

    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

İlk Aktivitede değeri olan amacı iletin:

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

İkinci Faaliyette niyet almak; -

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

Değeri göndermek ve değeri elde etmek için genellikle iki yöntem kullanırız. Değeri göndermek için kullanacağımız intent.putExtra("key", Value);ve başka etkinlik niyet alma sırasında kullanacağımız intent.getStringExtra("key");olarak niyet veri almak için Stringya da veri (diğer türleri elde etmek için başka bir uygun yöntemi kullanmak Integer, Booleanvb.) Anahtar, değeri tanımlamak için herhangi bir anahtar kelime olabilir, hangi değeri paylaştığınız anlamına gelir. Umarım sizin için çalışır.


0

Bunu
// // değeri niyetine de ekleyebilirsiniz.

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

// niyetten değer al

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

0

Niyetten Farklı Ekstra Türleri Almak

Niyet'ten verilere erişmek için iki şey bilmeniz gerekir.

  • ANAHTAR
  • Verilerinizin veri türü.

Intent sınıfında farklı türde veri türlerini ayıklamak için farklı yöntemler vardır. Şuna benziyor

getIntent (). XXXX (ANAHTAR) veya niyet.XXX (ANAHTAR);


Dolayısıyla, otherActivity'de ayarladığınız değişkeninizin veri tipini biliyorsanız, ilgili yöntemi kullanabilirsiniz.

Etkinliğinizdeki Dizeyi Niyet'ten almak için örnek

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

Farklı veriler için farklı yöntemlerin listesi

Mevcut yöntemlerin listesini Resmi Niyet Belgeleri'nde görebilirsiniz .


0

Bu bağdaştırıcı içindir, etkinlik için mContext'i Activty adınıza değiştirmeniz ve parça için mContext'i alActivity () için değiştirmeniz gerekir

 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

Burada , bazı alternatifler de dahil olmak üzere, bu konuyu biraz daha ayrıntılı bir şekilde ele alan bir cevap gönderdim .

Android geliştirmeyi basitleştirmek için yazdığım yeni bir jQuery'den ilham alan Android çerçevesi olan Vapor API'yi kullanıyor . Verileri aktiviteler arasında nasıl kolayca aktarabileceğinizi öğrenmek için bu cevaptaki örneğe göz atın.

Ayrıca VaporIntentyöntem çağrılarını zincirlemenize ve aşırı yüklenmiş .put(...)yöntemi kullanmanıza izin verir :

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

Vapor API'yi kullanarak tüm uygulamanızın çevresine kolayca veri aktarabilirsiniz , bu yüzden umarım uygulama geliştirme sırasında size ve başkalarına yardımcı olacaktır.


1
Vapor API.It ilginç bazı cevaplar görmüştü.Nasıl bu verileri (Intent.getextras () gibi) olsun ??
Kalai.G

Check out bu , o Niyet ekstralar almak açıklar. Daha fazla ayrıntı burada . Bu yardımcı olur mu?
Darius

2
Zincirleme yöntemlerinin çok fazla yükü olduğunu düşünüyorum. "Bu" değerini sadece zincirlenebilir olarak (yani "ayarlayıcılar") döndüren herhangi bir yöntemi çağırıyorsanız, OOP'un tasarım ilkelerini ihlal eder. Basitliği seviyorum, ancak bir yöntem zinciriniz varsa hata ayıklama da bir acı olabilir. API değeri görüyorum, sadece yöntem zincirleme kabul etmiyorum.
nckbrz
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.