Bu örnekte bir sınıf türünden oluşturulmuş olan listelerin activity’ ler arası nasıl transfer edileceğini göreceksiniz.
Örneğimizde Mekan isminde bir Class oluşturarak bu sınıfa Parcelable arayüzünü implement edeceğiz.
Parcelable arayüzü, bir nesneyi başka bir aktivite veya süreç arasında geçirmek için kullanılan bir arayüzdür.
Bu arayüzü uygulayan bir sınıf, nesnelerini bir veri paketine yazabilir ve daha sonra bu veri paketini başka bir nesneye veya aktiviteye aktarabilir. Parcelable arayüzü, Android uygulama geliştirme sürecinde sıklıkla kullanılır ve uygulamalar arasında veri aktarımı sağlar.
Bu sınıfın Parcelable arayüzünü uyguladığını belirtmesi, bu sınıfın nesnelerinin Android uygulamaları arasında kolayca geçirilebileceği anlamına gelir. Bu sınıfın nesneleri, Intent’ler aracılığıyla diğer aktivitelere veya süreçlere aktarılabilir veya Bundle objelerinde depolanabilir ve daha sonra geri yüklenebilir.
Mekan sınıfımız resim, ad ve açıklama alanlarından oluşmaktadır.
Parcelable arayüzü, nesnelerin veri paketlerine yazılması ve daha sonra okunması için gerekli yöntemleri tanımlar. Bu yöntemler, aşağıdaki gibi eklenir:
describeContents()
yöntemi: Bu yöntem, nesne için bir açıklama içeren bir int değeri döndürür. Bu değer, 0’dan farklı bir değer döndürürse, nesnenin yazılması veya okunması sırasında özel işlemler yapılacağını gösterir.writeToParcel(Parcel dest, int flags)
yöntemi: Bu yöntem, nesne verilerini birParcel
objesine yazarak nesneyi serileştirir.dest
parametresi, verilerin yazılacağı hedefParcel
objesini belirtir.flags
parametresi, serileştirme sırasında kullanılacak seçenekleri belirtir.CREATOR
sabiti: Bu sabit,Parcelable.Creator
arayüzünü uygulayan bir sınıfın örneğini belirtir veParcel
objesindeki verileri kullanarak nesne örneklerini oluşturmak için kullanılır.
Bu yöntemler, Parcelable arayüzünü uygulayan bir sınıfa eklenir. Ayrıca, nesne için gerekli tüm verilerin uygun şekilde serileştirilmesi gerektiğini unutmayın. Bu veriler, writeToParcel
yöntemi aracılığıyla Parcel
objesine yazılmalıdır.
Şimdi kodlarımızın tam haline bakalım. Projemizde MainActivity.java, DetailActivity.java ve Mekan.java dosyalarımız bulunmaktadır. Ayrıca kullanacağımız açıklamaları strings.xml dosyasında saklayacağız.
Mekan.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | package com.example.intentparcelableornek; import android.os.Parcel; import android.os.Parcelable; import android.support.annotation.NonNull; public class Mekan implements Parcelable { int resim; String ad; String aciklama; public Mekan(int resim, String ad, String aciklama) { this.resim = resim; this.ad = ad; this.aciklama = aciklama; } protected Mekan(Parcel in) { resim = in.readInt(); ad = in.readString(); aciklama = in.readString(); } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(resim); dest.writeString(ad); dest.writeString(aciklama); } @Override public int describeContents() { return 0; } public static final Creator<Mekan> CREATOR = new Creator<Mekan>() { @Override public Mekan createFromParcel(Parcel in) { return new Mekan(in); } @Override public Mekan[] newArray(int size) { return new Mekan[size]; } }; public int getResim() { return resim; } public void setResim(int resim) { this.resim = resim; } public String getAd() { return ad; } public void setAd(String ad) { this.ad = ad; } public String getAciklama() { return aciklama; } public void setAciklama(String aciklama) { this.aciklama = aciklama; } } |
activity_main.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="15dp" tools:context=".MainActivity"> <Button android:id="@+id/button_ayasofya" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="20dp" android:background="@color/teal_200" android:textColor="@color/white" android:textSize="18sp" android:text="Ayasofya" /> <Button android:id="@+id/button_galata" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="20dp" android:textSize="18sp" android:layout_marginTop="5dp" android:layout_marginBottom="5dp" android:background="@color/teal_200" android:textColor="@color/white" android:text="GALATA KULESİ" /> <Button android:id="@+id/button_kucuksu" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="20dp" android:textSize="18sp" android:background="@color/teal_200" android:textColor="@color/white" android:text="Küçüksu Kasrı" /> </LinearLayout> |
activity_detail.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="5dp" tools:context=".DetailActivity"> <ImageView android:id="@+id/iv_mekan_resim" android:layout_width="match_parent" android:layout_height="250dp" tools:srcCompat="@tools:sample/backgrounds/scenic" /> <TextView android:id="@+id/tv_baslik" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="30dp" android:text="TextView" android:textAlignment="center" android:textSize="30sp" android:textStyle="bold" /> <ScrollView android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" > <TextView android:id="@+id/tv_aciklama" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="20dp" android:gravity="fill_horizontal" android:text="TextView" android:textSize="18sp" /> </LinearLayout> </ScrollView> </LinearLayout> |
MainActivity.java dosyamız:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | package com.example.intentparcelableornek; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import java.util.ArrayList; public class MainActivity extends AppCompatActivity { ArrayList<Mekan> liste=new ArrayList<Mekan>(); Button btnAyasofya,btnGalata,btnKucuksu; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnAyasofya=findViewById(R.id.button_ayasofya); btnGalata=findViewById(R.id.button_galata); btnKucuksu=findViewById(R.id.button_kucuksu); liste.add(new Mekan(R.drawable.ayasofya,"Ayasofya Cami",getResources().getString(R.string.aciklama_ayasofya))); liste.add(new Mekan(R.drawable.galata,"Galata Kulesi",getResources().getString(R.string.aciklama_galata))); liste.add(new Mekan(R.drawable.kucuksu,"Küçüksu Kasrı",getResources().getString(R.string.aciklama_kucuk_su))); btnAyasofya.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { DetayGoster(0); } }); btnGalata.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { DetayGoster(1); } }); btnKucuksu.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { DetayGoster(2); } }); } private void DetayGoster(int i) { Intent intent=new Intent(MainActivity.this,DetailActivity.class); intent.putExtra("index",liste.get(i)); startActivity(intent); } } |
DetailActivity.java dosyamız:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | package com.example.intentparcelableornek; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.ImageView; import android.widget.TextView; public class DetailActivity extends AppCompatActivity { ImageView imageView; TextView textViewBaslik,textViewAciklama; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_detail); imageView=findViewById(R.id.iv_mekan_resim); textViewBaslik=findViewById(R.id.tv_baslik); textViewAciklama=findViewById(R.id.tv_aciklama); Intent intent = getIntent(); Mekan mekan = intent.getParcelableExtra("index"); imageView.setImageResource(mekan.getResim()); textViewBaslik.setText(mekan.getAd()); textViewAciklama.setText(mekan.getAciklama()); } } |
strings.xml dosyamız
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | <resources> <string name="app_name">IntentParcelableOrnek</string> <string name="aciklama_galata">Galata Kulesi ya da müze olarak kullanılmaya başlaması sonrasındaki adıyla Galata Müzesi, İstanbul\'un Beyoğlu ilçesinde bulunan bir kuledir. Adını, bulunduğu Galata semtinden alır. \n\n Galata Surları dahilinde bir gözetleme kulesi olarak inşa edilen kule, farklı dönemlerde farklı amaçlarla kullanılmasının ardından 2020\'den itibaren, bir sergi mekânı ve müze olarak hizmet verir. Hem Beyoğlu\'nun hem de İstanbul\'un sembol yapılarındandır. \n\nBizans İmparatorluğu ile ittifak hâlinde olan Cenevizliler 1267\'de, Haliç\'in kuzeyinde bulunan Galata\'da \"Pera\" adlı bir koloni kurmuş, bu koloninin hâkimiyet alanını da zaman içinde Bizans tarafından verilen izinlerle genişletmişti. Tepesindeki haçtan ötürü o dönem \"Kutsal Haç Kulesi\" (Turris Sancte Crucis) olarak adlandırılan kule, bu izinlere aykırı bir şekilde kuzeydoğu yönündeki tepeye doğru hâkimiyet alanı arttırılarak 1335-1349 yılları arasında bölgede yapılan tahkimatın bir parçası olarak inşa edildi.</string> <string name="aciklama_ayasofya">Ayasofya (anlamı: \"Kutsal Bilgelik\"; Grekçe: Ἁγία Σοφία, romanize: Agia Sofia), eski adıyla Kutsal Bilgelik Kilisesi ve Ayasofya Müzesi veya günümüzdeki resmî adıyla Ayasofya-i Kebîr Câmi-i Şerîfi (Kutsal Büyük Ayasofya Camii), İstanbul\'da yer alan bir cami ve eski bazilika, katedral ve müzedir.\n\n Bizans İmparatoru I. Justinianus tarafından, 532-537 yılları arasında İstanbul\'un tarihî yarımadasındaki eski şehir merkezine inşa ettirilmiş bazilika planlı bir patrik katedrali olmuştur. 1453 yılında İstanbul\'un Osmanlılar tarafından fethedilmesinden sonra II. Mehmed tarafından camiye dönüştürülmüştür. Mustafa Kemal Atatürk tarafından 1934 yılında yayımlanan Bakanlar Kurulu Kararnamesi ile müzeye dönüştürülmüş, kazı ve tadilat çalışmaları başlatılmış ve 1935\'ten 2020\'ye kadar müze olarak hizmet vermiştir.\n\n 2020 yılında ise müze statüsü iptal edilerek cami statüsü verilmiştir.\n\n Bizans İmparatorluğu döneminde Ayasofya, büyük bir \"kutsal emanetler\" zenginliğine sahipti. Bu emanetlerden biri de 15 metre yüksekliğindeki gümüş ikonostasis idi. Konstantinopolis Patriği\'nin kilisesi ve Doğu Ortodoks Kilisesi\'nin 1000 yıl boyunca merkezi olan Ayasofya, 1054 yılında Patrik I. Mihail\'in Papa IX. Leo tarafından aforoz edilmesine şahitlik etmiş olup, bu olay, genel olarak \"Schisma\"nın, yani Hristiyanlık tarihindeki en önemli olaylardan biri olan Doğu ve Batı kiliselerinin ayrılmasının başlangıcı sayılır. </string> <string name="aciklama_kucuk_su">Küçüksu Kasrı veya Göksu Kasrı, İstanbul\'un Küçüksu semtinde, Göksu Deresi ile Küçüksu Deresi arasında, Boğaziçi\'nde Üsküdar-Beykoz sahilyolu üzerinde yer alan kasır. \n\nSultan Abdülmecit tarafından[1] Nigoğos Balyan\'a yaptırılmış, inşaatı 1856 yılında tamamlanmıştır. \n\nEski adı "Göksu Kasrı" olan bu yapı, padişahların, Boğaziçi kıyılarındaki biniş kasırlarından biridir. \n\nKasırlar sadece hünkârların malı sayılan ve sarayların haricinde inşa edilen, köşkten büyük binalardır. \n\nDevamlı ikamet için kullanılmayan kasırlar, padişahların dinlenmeleri için vakit geçirdikleri yerdir.</string> </resources> |
Ekran Çıktısı: