Aklımda Kalası Kelimeler

* давайте работать вместе
* Zarf ve Mazruf, Zerafet(xHoyratlık) ile aynı kökten(za-ra-fe) gelir
* Bedesten
* Suç subuta ermiştir - Suç sabit olmuştur

17 Temmuz 2011 Pazar

Bir sınıfa Parcelable uyarlamak


package cem.examples.reminder;

import java.util.ArrayList;
import java.util.List;
import android.os.Parcel;
import android.os.Parcelable;
import android.text.Html;
import android.text.Spanned;

public class Information implements Parcelable {
public Spanned MTitle;
public Spanned MContent;
public List<String> MTags;

// Her property sırayla yazılır
public void writeToParcel(Parcel dest, int flag) {
dest.writeString(MTitle.toString());
dest.writeString(MContent.toString());
dest.writeStringList(MTags);
}

// Parcel tipinde içinde objemiz olan in parametresini yazdığımız sırada
// okuyacağız
void readFromParcel(Parcel in) {
MTitle = Html.fromHtml(in.readString()); // String tipini Spanned tipine
// HTML.fromHtml() metoduyla
// döndüreceğiz
MContent = Html.fromHtml(in.readString());

// Eğer MTags yaratılmamışsa hata almamak için yaratacağız
if (MTags == null) {
MTags = new ArrayList<String>();
}
// ve içine Parcel tipindeki in objemizde ne buluyorsak yazacağız
in.readStringList(MTags);
}

// Parcalable dan geliyor, nedir bilemiyorum şimdilik
public int describeContents() {
return 0;
}

// Bunu da şimdilik neden oluşturuyoruz bilemiyorum
public static final Parcelable.Creator<Information> CREATOR = new Creator<Information>() {

public Information[] newArray(int size) {
return new Information[size];
}

public Information createFromParcel(Parcel source) {
return new Information(source);
}
};

// Varsayılan yapıcı metodumu bu
public Information() {
}

// Bunu da Parcel objesinden Information objesine giderken kullanıyor
public Information(Parcel in) {
this();
readFromParcel(in);
}

public Information(String _title, String _content) {
MTitle = Html.fromHtml(_title);
MContent = Html.fromHtml(_content);
}

// Information sınıfına yazdığım metot
public void f_AddTag(String... _tags) {
if (MTags == null) {
MTags = new ArrayList<String>();
}

for (String tag : _tags) {
MTags.add(tag);
}
}

// Biraz objem olsun diye kullanacağım
static public ArrayList<Information> TestInfos() {
ArrayList<Information> infos = new ArrayList<Information>();

String title = "<font color='red'>Basics of Android Intents</font>";
String content = "Although an intent is easily understood as a mechanism to invoke components(activities, services, broadcast receivers, and content providers), Android folds multiple ideas into the concept of an intent. You can use intents to invoke external applications from your application. You can use intents to invoke internal or external components from your application. You can use intents to raise events so that others can respond in a manner similar to a publish-and-subscribe model. You can use intents to raise alarms.";
Information info = new Information(title, content);
info.f_AddTag("Intent", "invoke");

infos.add(info);

title = "<b>The list of components in Android</b>";
content = "The list of components in Android include <i>activities</i> (UI components), <i>services</i> (background code), <i>broadcast receivers</i> (code that responds to broadcast messages), and <i>content providers</i> (code that abstracts data)";
info = new Information(title, content);
info.f_AddTag("component", "Android", "service");

infos.add(info);

return infos;
}

// Information sınıfına yazdığım metot
static public ArrayList<Information> BagliBasliklar(String _tag) {
ArrayList<Information> infos = TestInfos();

for (Information info : infos) {
if (!info.MTags.contains(_tag)) {
infos.remove(info);
}
}

return infos;
}
}


Information sınıfını Parcelable olarak ayarladık.
Şimdi bir ArrayList<Information> değişkenini Bundle içine koyup bir sonraki aktiviteye gönderelim.

public void onClick(View v) {
// Butonun Text'inde etiket adı var ve BagliBasliklar metodundan bu etiketleri süzüyoruz
Button btnTag = (Button) v;
ArrayList<Information> infos = Information.BagliBasliklar(btnTag.getText().toString());

// Intent'din ilgili aktivitesini belirlemek için aynı uygulamada olduğundan Activity Sınıfının adıylada çalıştırabiliriz
// Ya da .manifest dosyasında <Intent-Filter> içinde <action> etiketinin içine "cem.examples.reminder.intent.action.INFO_LIST" yazarakta aktiviteyi bulmayı sağlayabiliriz.
//
// <activity android:name=".Liste">
// <intent-filter>
// <action android:name="cem.examples.reminder.intent.action.INFO_LIST" />
// <category android:name="android.intent.category.DEFAULT" />
// </intent-filter>
//</activity>
Intent baslikListe = new Intent("cem.examples.reminder.intent.action.INFO_LIST");

// Veri aktarımı için putXXX(YYY) metodunu kullanıyoruz.
// Bizimkisi jenerik(generic olduğu için Parcelable tipini atadan alan) bir ArrayList olduğu için
// putParcelableArrayListExtra metodunu kullanacağız.
baslikListe.putParcelableArrayListExtra("baslikListe", infos);

// ve aktiviteyi bulup çalıştırması için Android sistemine emanet edeceğiz
startActivity(baslikListe);
}


Peki Aktivite bu bilgiyi aldığında Parcelable veriyi nasıl açacak?

Bundle extras = getIntent().getExtras();
ArrayList<Information> infos = extras.getParcelableArrayList("baslikListe");

// InformationTagsAdapter Adapter sınıfından türettiğimiz Liste yi istediğimiz bileşenlerin içinde
// göstermek için customize(özelleştirebildiğimiz) edebildiğimiz bir sınıf.
// Bu sınıf gelen veriyi yazdığımız bilgilere göre ekrandaki elemanlara bağlayan bir sınıf olacak.
setListAdapter(new InformationTagsAdapter(this, infos));