Mustafa Ferhan Akman

Android: Program Ayarlarının ve Kullanıcı Tercihlerinin Saklanması

Posted in Android, Makale & Döküman, Programlama by ferhanakman on 12/07/2009

Ön Bilgi: Android uygulamalarında, veri saklama işlemleri için çeşitli yollar vardır. Uygulamamızda verilerimizi saklamamız gerektiğinde database (SQLite) ve dosyalama işlemlerini kullanabiliriz. Fakat basit veriler saklayacağımız zaman, Android’in biz programcılara sağlamış olduğu bir kolaylıktan bashetmek istiyorum.  Kolaylığın ismi; SharedPrefences.

Mesela, bir program yazdık ve bu programımızı kullanacak kişiler için bir “tercihler” (prefences)  menüsü yapmak istiyoruz. Bu menü her program için farklılıklar taşıyabilir, mesela bir oyun tasarlıyorsak, tercihler sayfamızda “zor, orta, kolay” gibisinden oyunun zorluk derecelerine yer verebiliriz, ya da internetten haber okuma (RSS reader) programı tasarlıyorsak, program kullanıcılarına tercihler bölümünde haberlerin güncellenme aralıklarına ilişkin seçenekler sunabiliriz. Bu örnekleri çoğaltmak mümkün…

Giriş: Bu makalemde, database kullanımı olmaksızın, Android uygulamalarında basit verileri nasıl saklayacağımızı göreceğiz. Bunun için, hemen hemen her programda olan “tercihler” menüsü yapıp, program kullanıcısı; programımızı kapatıp tekrar açtığında bile seçmiş olduğu tercihleri programımızın unutmamasını sağlayacağız.

SharedPrefences, bu konuda oldukça kolaylık sağlamaktadır. Yukarda, SharedPrefences ile “basit veriler”’i saklayabileceğimizi söyledik. Peki bu basit veriler neler olabilir? User interface’in state bilgileri, kullanıcı tercihleri, program ayarları.

Senaryo: Şimdi yapacağımız örnekte, kullanıcının karşısına oyunun zorluk derecesini seçebileceği bir menü çıksın ve mesela orta seviyeyi seçerek oyununu oymasın. Oyunu her açıp kapattığında tekrar tekrar “orta seviye”’yi seçmek zorunda kalmadan oyununu oynamaya devam etsin.

Çözüm: 1- Öncelikle programın UI kısımlarını hazırlayalım.

android-terchiler2

Programın Ana ekranı

tercihler menüsü

Tercih Menüsü

Oyunun, “tercihler” menüsüne girildiğinde yukarıdaki bir ekran ile karşılaşıldığını düşünelim. Menünün XML kodlarına yazının sonundaki link içerisindeki kaynak kodlardan ulaşabilirsiniz. Bu programı kullanan kişi, oyunun seviyesi olarak orta zorluğu seçtiğinde ve tekrardan oyundan çıkıp girdiğinde ayarların kaybolmasını istemiyoruz.

Şimdi kod kısmına geçelim ve adım adım işlemlerimizi gerçekleştirmeye başlayalım. Bunun için SharedPrefences classından yararlanacağımızı daha önce belirtmiştim.

2-  Prefences class’ı içerisinde key’lerimizi belirliyoruz.

public static final String USER_PREFENCE = "USER_PREFENCES";
public static final String PREF_HARD	 = "PREF_HARD";
public static final String PREF_MEDIUM 	 = "PREF_MEDIUM";
public static final String PREF_EASY 	 = "PREF_EASY";

ve SharedPrefences’i tanımlıyoruz.

SharedPreferences prefs;

Oynumuzun zorluk derecesini seçtikten sonra “Tamam” butonuna tıkladığımızda listener’ımız çalışacak. Listener içerisinde, o an hangi RadioButton’ın seçili olduğunun bilgisini almamız ve bunu yukarıda tanımladığımız keyler vasıtasıyla kaydetmemiz gerekiyor.

3- Button Listener ve bilgilerin saklanması

okBtn.setOnClickListener(new OnClickListener(){
public void onClick(View e)
{
	savePrefences();
	Prefences.this.setResult(RESULT_OK);
	finish();
}

private void savePrefences() {
	//içeriği aşağıda verilmiştir
}
});
private void savePrefences() {
	boolean hard_checked	 = hardRB.isChecked();
	boolean medium_checked 	 = mediumRB.isChecked();
	boolean easy_checked 	 = easyRB.isChecked();

	Editor editor = prefs.edit();
	editor.putBoolean(PREF_EASY, easy_checked );
	editor.putBoolean(PREF_MEDIUM, medium_checked );
	editor.putBoolean(PREF_HARD, hard_checked );

	editor.commit();

}

Tamam butonuna tıklandığında,  savePrefences() fonksiyonu çağırılacak. Fonksiyonun isminde de anlaşılabileceği üzere, burada o an da tüm RadioButton’ların stateleri (seçili olup olmadıklarına dair durumları) alınıyor. Ve daha sonrada alınmış olan bilgiler, Editor sayesinde, yine gerekli olan keyler ile beraber saklanıyor. Editor içerisinde, integer, boolean, string, float ve long tipindeki değerleri saklayabiliyoruz.

Şuan itibari ile,  kullanıcının oyunumuzu hangi zorluk seviyesinde oynamak istediği bilgisini biliyoruz ve bu bilgiyi depoladık.  savePrefences() fonksiyonundan sonra çalışacak olan

Prefences.this.setResult(RESULT_OK);

ile programımızın asıl acitivty class’ına gerekli olan bilgiyi gönderip, programdaki gerekli düzenlemeleri yaptırırız.

şimdi sıra program tekrar açılıp kapandığında, kaydetmiş olduğumuz ayar bilgisini okumaya geldi…

4- Program tekrar açılıp kapandığında, kaydedilmiş bilgileri okumak

“Tercihler” menüsü açıldığında, kullanıcıya daha önce hangi tercihi seçmiş olduğunu göstermemiz gerekir. Bunun için daha önce kaydetmiş olduğumuz seçimini okuyalım ve seçilmiş olan RadioButton’unun durumunu checked hale getirelim.

Tercihler activity class’ı çalıştığında, onCreate() fonksiyonu otomatik olarak çağrılacak ve içerine bizim yazmış olduğumuz updateUI() fonksiyonu çağırılacaktır.

private void updateUI() {
		boolean easy_checked 	= prefs.getBoolean(PREF_EASY, false);
		boolean medium_checked 	= prefs.getBoolean(PREF_MEDIUM, false);
		boolean hard_checked 	= prefs.getBoolean(PREF_HARD,  false);

		easyRB.setChecked(easy_checked);
		mediumRB.setChecked(medium_checked);
		hardRB.setChecked(hard_checked);
	}

updateUI() fonksiyonu, kaydedilmiş olan RadioButon’ların bilgilerini çağırır. Her bir çağırma işlemindeki default değerimiz “false”. Yani, eğer PREF_EASY key’i kullanılarak herhangi bir bilgi kaydedilmemiş ise, bize dönecek default değer false olacaktır. Ve daha sonrada, bize dönen değerler doğrultusunda, tercihler menümüzün gui’sini update ederek kullanıcıya gösteriyoruz. Kullanıcı tercihler menüsüne tekrar girdiğinde aşağıdaki gibi daha önceki tercihini seçili görmüş oluyor.

android-prefences

Örneğin çalışır haldeki kaynak kodlarını aşağıdaki linkten indirebilirsiniz:
http://rapidshare.com/files/254964798/SharedPrefences_Ornek_-_Ferhan_Akman.rar.html

Database kullanmadan, bazı verileri nasıl saklayacağımızı gördük. Android ile ilgili makalelerim devam edecek…
Faydalı olması dileği ile, hoşcakalın…
Yazan: Mustafa Ferhan Akman

Yorum Yapın