Android Intent’ler ile Veri Alış Verişi

Merhaba Arkadaşlar,
Mobilhanem.com sitemiz üzerinden anlattığımız/yayınladığımız Android Eğitimleri yazı serimizde bu dersimizde Activity Intent Bundle Kullanımı konusuyla devam ediyoruz.

Activity ler arasında veri transferi için bir çok yöntem bulunsa da(database’e veya shared preferances’a veri yazıp, diğer activity’den okumak gibi) genel olarak Bundle kullanırız.

Bundle ile, bir Activity’den diğerine geçmek için oluşturulan Intent’e data ekleriz. Kısaca Intent ile diğer Activity’e geçme işlemini hatırlayacak olursak:

Intent i = new Intent(getApplicationContext(),NewActivity.class); 
startActivity(i);
val intent = Intent(this, NewActivity::class.java)
startActivity(intent)

Yukarıdaki örneklerde sadece yeni bir Activity açtık. Fakat herhangi bir data göndermedik. Activity Intent Bundle Kullanımı için kullanıcı adını alan ve diğer Activity’e gönderen bir yapıya ihtiyacımız olduğunu düşünelim. Bunun için, kullanıcı adını oluşturduğumuz Intent’in içerisine ekleyeceğiz.

Intent intent = new Intent(getApplicationContext(),NewActivity.class);
intent.putExtra("username","Taha Kırca");
startActivity(intent);
val intent = Intent(this, NewActivity::class.java) 
intent.putExtra("username","Taha Kırca")
startActivity(intent)

putExtra metodu ile aşağıdaki veri tiplerini gönderebilirsiniz:

putExtra Metodu ile gönderilebilecek data tipleri

Activity Intent Bundle Kullanımı 

Şimdi ilk sayfa da göndermiş olduğumuz değişkeni ikinci sayfada nasıl alabiliriz bakalım. Gönderdiğimiz veriyi karşılayabilmemiz için ilk sayfadaki değişken adı ile buradaki değişken aynı olmalıdır. Aşağıdaki kod parçasında görüldüğü gibi Bundle fonksiyonunu da kullanarak veriyi başarılı bir şekilde almış oluruz. Intent’in içerisine eklediğimiz “username” i ise, açılacak activity’den şu şekilde alabiliriz:

Bundle bundle = getIntent().getExtras();
if(bundle != null){
String user_name = bundle.getString("username");
}
val bundle :Bundle ?=intent.extras 
if (bundle!=null){ 
val user_name = bundle.getString("username") 
}

Activity ler Arasında Intent ile Object Gönderme

Şimdi sayfalarımız arasında object transferi nasıl olur ona bakalım. User classından oluşturduğumuz applicationUser objesini yine string parametresini gönderdiğimiz şekilde gönderdik.

User applicationUser = new User(name,surname);
Intent i = new Intent(getApplicationContext(),NewActivity.class);
i.putExtra("userObject", applicationUser);
startActivity(i);

val applicationUser = User(userName, mail)
val intent = Intent(this, NewActivity::class.java)
intent.putExtra("userObject", applicationUser as Serializable)
startActivity(intent)

İlk sayfada gönderdiğimiz object i ikinci sayfa alma şekline bakalım. Yeni bir intent oluşturup getIntent() fonksiyonu yardımı ile Activity i çağıran intenti alıyoruz. User class’ı tipinde oluşturduğumuz object’i intent üzerinden getSerializableExtra anahtar nesnesi yardımı ile alıyoruz. Burada dikkat edilmesi gereken gönderdiğimiz class tipi ne ise ona cast etmemiz gerekiyor. User tipinde olduğu için User classına cast etmiş olduk gördüğünüz gibi. Böylece object’i başarılı bir şekilde aldık.

Intent i = getIntent();
User applicationUserSecond = (User)i.getSerializableExtra("userObject");

Intent i = getIntent(); 
val bundle: Bundle? = intent.extras
val applicationUserSecond = bundle.getSerializableExtra("userObject") as? User

NOT: ( User classını ikinci Activity de alabilmek ve classın içindeki verilere ulaşabilmek için aşağıdaki gibi implements Serializable yapmamız gerekmektedir )

@Serializable
data class User(
        public val username: String,
        public val mail: String
) : Serializable
public class User implements Serializable
{
    public String username;
    public String mail;
}

Evet arkadaşlar Android Intent’ler ile Veri Alış Verişi‘ni sizlere detaylıca anlatmaya çalıştım. Umarım hepiniz için faydalı olmuştur.

Sıfırdan android dersleri için tıklayınız.

Mobilhanem.com üzerinden anlattığımız android uygulama geliştirme derslerine devam edeceğiz. Konu hakkında sorunuzu yorum alanından sorabilirsiniz. Konu dışı sorularınızı ve tüm yazılımsal sorularınızı sorucevap.mobilhanem.com sitemizden de sorabilirsiniz.

Bir daha ki dersimizde görüşmek dileğiyle..


91
    
            
    
    		    

Alper Beyler

Yüksek Lisans: Çankaya Üniversitesi / Bilgisayar Mühendisliği
Lisans: Çankaya Üniversitesi / Bilgisayar Mühendisliği (4/3.30) (2010-2014)
Lisans : Viyana Teknik Üniversitesi / Bilgisayar Bilimleri (2013)

19 Yorum

  • Peki ben 1. activity’ den ikinci activity’ me , ikinci activitideki işlemlerim bitince bir sonraki gececeği activity’i putextra ile yollayabılır mıyım ?

    • Merhaba, activity ler arası geçişlerde evet putExtra ile veri gönderebilirsiniz. activity kapandığı anda bir önceki activity e düştüğünde onActivityResult ile kontrol edebilirsin. startActivityForResult ile activity başlatman gerekiyor bu dediğim kavramları bir araştır yine sorun olursa sorabilirsin.

      • Alper Bey dediğiniz araştırmaları yaptım. Ama istediğim sonuca ulasamadım. Benım Sorum basit bir örnekle şu :

        Benim projemde 3 tane aktivitem var adlarıda A,B,C.

        Aktivite A dan B ye gecerken ben B aktivitesine Activity tipinde bir değişken yollamak istiyorum sonra B aktivitesinden işlemlerim bitince B aktivitesinden sonra gececegı aktivity A aktivitesinden Activity tipindeki değişkene gore karar vermek istiyorum.

        Aklımda bir yöntem var ama komplike projemde işe yaramadığı için çözüm olarak kullanamamıyorum.Yöntemimi Anlatayım buda belki sorunu anlatmam için yardımcı olabılır.

        A Aktivitesi ;

        Intent intent=new Intent(A.this,B.class);
        intent.putExtra(“gecilecek_aktivity”,’A’);
        startActivity(intent);

        B Aktivitesi

        //İşlemlerimi Yaptıktan sonra Aktiviteden cıkarken
        Intent intent=getIntent();
        String sonraki_aktivity=intent.getStringExtra(“gecilecek_aktivity”);

        if( sonraki_aktivity==’A’){
        //A aktivitesinden Geri A ya gelecegı geldıgı için geri a ya gelecek
        Intent intent=new Intent(B.this,A.class);
        startActivity(intent);
        }else if(sonraki_aktivity==’C’){
        //A aktivitesinden C ye gelecegı emri geldıgı için C ye gececek
        Intent intent=new Intent(B.this,C.class);
        startActivity(intent);
        }

        Ama bu gelişmiş bir proje için saglıklı bır yontem olduğuna inanmıyorum ben putExtra ile örneğin ;

        Intent intent=new Intent(A.this,B.class);
        intent.putExtra(“gecilecek_aktivity”,C.class);
        startActivity(intent);

        put extra ile direk hedef aktivity yollayıp ;
        Intent intent=getIntent();
        Activity sonraki_aktivity=intent.getExtra(“gecilecek_aktivity”);

        Sonra
        Intent intent=new Intent(A.this,sonraki_activity);
        startActivity(intent);

        yapmak istiyorum çok uzattım yardım edersenız sevınırım.

  • Merhabalar , ben activityler arası nesne dizisi geçirirken sıkıntı alıyorum . Kendi yarattığım bir Channel classım var Serializable implement ettim , bir classta channels[] dizisi üretip aynı yöntemle başka class a geçirirken “java.lang.Object[] cannot be cast to com.mosstech.StarRadio.Models.Channel[]” hatası alıyorum yani (Channel[]) şeklinde cast edemiyorum . İki activity arası nesne dizisini nasıl geçirebilirim ?

  • Merhaba, yazınız oldukça faydalı ve işime yaradı bir kaç kısımda bu sebeple öncelikle teşekkür etmek isterim. Fakat şöyle bir problemim var yardımcı olabilirseniz çok makbule geçer. Benim alttaki gibi bir BloggerApi.class’ım var ben buraya eklediğim linkimdeki veriyi mainactivty’e sorunsuz olarak çekiyorum. Problem ise şurada başlıyor ben sabit tüm içeriği değilde butonlar yardımı ile Yeni Konular, Popüler Konular v.s gibi bir kaç farklı başlıktaki özel konuları çekmek istiyorum. Dolayısıyla bu butonlara link tanımlayacağım ve bu linkleri alttaki kodda yer alan “public static final String url ” içeriğine aktaracağım bu durumu başaramadım. Nasıl yapabileceğim konusunda yardımcı olabilir misiniz? Yani böyle bir şey mümkün müdür? Anlayış ve yardımınız için şimdiden çok teşekkür ederim.

    —-Kod—-
    public class BloggerAPI {
    public static final String key = “buraya_key_kod”;
    public static final String url = “buraya_link”;

    public static PostService postService = null;

    public static PostService getService()
    {
    if(postService == null)
    {
    Retrofit retrofit = new Retrofit.Builder()
    .baseUrl(url)
    .addConverterFactory(GsonConverterFactory.create())
    .build();

    postService = retrofit.create(PostService.class);
    }
    return postService;
    }
    public interface PostService {
    @GET
    Call getPostList(@Url String url);
    }
    }
    —-Kod—–

    • Problemimi araştırmalarım sonucunda büyük oranda çözdüm, bu konuyla alakalı bir durum değilmiş. Teşekkür ederim.

  • Hocam merhabalar uygulamama puan sayacı ekliyeceğim fakat nasıl yapacağım hakkında bi fikrim yok yardımcı olur musunuz?

  • Hocam çok uğraşmıştım bu konuda veriyi ekrana null olarak yazdırıyordu kurstakine göre bu konuda takılıp kalmıştım birkaç gündür çok vaktimi almıştı devam edememiştim kursa artık bi sorun olursa buraya gelip bakıcam önce teşekkürler

  • Hocam, activity den service classına string array gönderme işlemini nasıl yapabiliriz? stackoverflow da geziniyorum kaç gündür olmuyor. yardımcı olabilir misiniz?

    ArrayList şeklinde oncreate içinde itemleri ekliyorum. Ama servis class ı put extra ile, bundle ile bunların hiçbiri ile görmüyor. Deneme amaçlı String[] = {“ahmet”,”mehmet”} şeklinde de constrantlardan veriyi ekleyip gönderdim. nafile . servis görmüyor

Haftalık Bülten

Mobilhanem'de yayınlanan dersleri haftalık mail almak ister misiniz?