Merhaba arkadaşlar uzun bir aranın ardından tekrar yazmaya başladım.İnşallah bundan sonra daha sık yazıp siteyi daha aktif hale getirmeye çalışacam. Bu dersimizde Android üzerinde SharedPreferences kullanımını anlatacağım.Her zamanki gibi ufak bir uygalama üzerinde anlatmaya çalışacağım.Öncelikle SharedPreferences nedir,ne işe yarar ve niçin kullanılır bunlardan bahsedeceğim.
Eğer uygulamamızda ufak veriler tutmak istiyorsak ve en önemlisi bu verileri uygulama kapansada kaybetmek istemiyorsak sharedpreferences tam bizim işimize yarayan HashMap yapısına(key-value) benzeyen bir yapıdır. Ufak veriler için database kullanmak pek mantıklı değildir. Aynı şekilde büyük veriler içinde sharedpreferences kullanmak mantıklı değildir. Sharedpreference içinde primitive(string,int,boolean,float,long) data tipinde veriler tutulabilir ve dediğim gibi bu veriler uygulama kapansada kaybolmaz.
Nasıl yaptığını merak ediyorsanız kısaca şöyle açıklayayım. Sizin kaydettiğiniz verileri bir XML dosyasına yazar ve oradan geri çeker. İOS ta NSUserDefault ve Plist bu yapıdadır.Veriyi key-value tipinde tutar.
Arkadaşlar şimdi uygulamamıza geçelim. Uygulamamız üç aktivity den oluşuyor. Login ekranı ,kayıt ekranı ve anasayfa dan oluşuyor.Kayıt olan bir kişinin verileri sharedPreferences a kaydediliyor. Uygulamadan çıkış yapmadan home yada back tuşuyla çıkarsa sharedPreferences verileri tuttuğu için bir dahaki girişinde Login ekranında veriler istenmiyor ve diren anasayfaya yönlendiriliyor. Uygulamada iki tane çıkış butonu var birincisi sharedPreferences değerlerini silmeden sadece login değerini true false yapıyor ve aynı kayıt bilgileriyle bir daha uygulamaya girmesi sağlanıyor.İkinci çıkış butonu ise tüm verileri siliyor ve tekrardan kayıt olmasını istiyor.
Gerekli açıklamaları kod üzerinde yapmaya çalıştım.
[wpdm_file id=9]Login Ekranı:
import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import android.preference.PreferenceManager; import android.view.View; import android.widget.Button; import android.widget.EditText; public class LoginSayfa extends Activity { Button kayit,giris; EditText mail,sifre; String mail_string,sifre_string; SharedPreferences preferences;//preferences referansı SharedPreferences.Editor editor; //preferences editor nesnesi referansı .prefernces nesnesine veri ekleyip cıkarmak için @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.login_sayfa); preferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());//preferences objesi editor = preferences.edit(); //aynı şekil editor nesnesi oluşturuluyor //Burda sharedPreferencas üzerine kayıtlı login değerini alıyoruz. //Login değeri doğru giriş yapıldığında veya kayıt olduğunda true olarak kaydedilir //Amacı ise kullanıcı uygulamadan cıkarken direk çıkıs demeden cıktıysa yanı direk home veya back tusuyla uygulamadan çıktıysa //Geri geldiğinde tekrar giriş bilgilerini istemeden anasayfaya yönlendiriyoruz //Bu değer ancak anasayfa üzerinde cıkış butonuna basılırsa diğer bilgiler silinmeden bu değer false yapılır //ve uygulamaya tekrar girildiğinde kayıt olurken kullandığı şifre ve emaili ister if(preferences.getBoolean("login", false)){ Intent i = new Intent(getApplicationContext(),Anasayfa.class); startActivity(i); finish(); } mail = (EditText)findViewById(R.id.editText1); sifre = (EditText)findViewById(R.id.editText2); kayit = (Button) findViewById(R.id.button1); kayit.setOnClickListener(new View.OnClickListener() {//kayıt ekranı açılır @Override public void onClick(View v) { Intent i = new Intent(getApplicationContext(),Kayit.class); startActivity(i); } }); giris = (Button) findViewById(R.id.button2); giris.setOnClickListener(new View.OnClickListener() {//giriş butonu tıklandığı zaman @Override public void onClick(View v) { mail_string = mail.getText().toString(); sifre_string = sifre.getText().toString(); if(mail_string.matches("") || sifre_string.matches("")){//bilgiler eksik ise AlertDialog.Builder alertDialog = new AlertDialog.Builder(LoginSayfa.this); alertDialog.setTitle("Uyar˝"); alertDialog.setMessage("Eksiksiz Doldurunz!"); alertDialog.setPositiveButton("Tamam", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog,int which) { } }); alertDialog.show(); }else{//Bilgiler doğru ise String email = preferences.getString("email", "");//preferences objesinden kaydettiğimiz değerleri key leri ile geri alıyoruz String sifre = preferences.getString("sifre", "");//preferences objesinden kaydettiğimiz değerleri key leri ile geri alıyoruz if(email.matches(mail_string) && sifre.matches(sifre_string)){//edittextlerden alınan şifre ve mail değerleri shared preferencesdan alınan değerlerle eşleşiyorsa //Giriş başarılı ise sharedpreferences login değerini true yapıyoruz. editor.putBoolean("login", true); Intent i = new Intent(getApplicationContext(),Anasayfa.class);//Anasayfa aktivity si açılır startActivity(i); finish(); }else{//şifre ve mail uyuşmuyorsa hata bastırılır AlertDialog.Builder alertDialog = new AlertDialog.Builder(LoginSayfa.this); alertDialog.setTitle("Hata"); alertDialog.setMessage("Mailiniz veya Şifreniz Uyuşmuyor!"); alertDialog.setPositiveButton("Tamam", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog,int which) { } }); alertDialog.show(); } } } }); } }
Kayıt Ekranı:
import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import android.preference.PreferenceManager; import android.view.View; import android.widget.Button; import android.widget.EditText; public class Kayit extends Activity{ Button kayit_ol; EditText isim,email,sifre; String isim_string,email_string,sifre_string; SharedPreferences preferences; //preferences nesne referansı SharedPreferences.Editor editor; //preferences editor nesnesi referansı .prefernces nesnesine veri ekleyip cıkarmak için @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.kayit); kayit_ol = (Button) findViewById(R.id.button1); isim = (EditText)findViewById(R.id.editText1); email = (EditText)findViewById(R.id.editText2); sifre = (EditText)findViewById(R.id.editText3); kayit_ol.setOnClickListener(new View.OnClickListener() {//Kayıt ol butonu tıklanınca @Override public void onClick(View v) { isim_string = isim.getText().toString(); email_string = email.getText().toString(); sifre_string = sifre.getText().toString(); if(isim_string.matches("") || email_string.matches("") || sifre_string.matches("")){//Veriler Boş ise AlertDialog.Builder alertDialog = new AlertDialog.Builder(Kayit.this); alertDialog.setTitle("Uyarı"); alertDialog.setMessage("Eksiksiz Doldurunz!"); alertDialog.setPositiveButton("Tamam", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog,int which) { } }); alertDialog.show(); }else{//veriler boş değilse kayıt işlemine geçilir preferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());//preferences nesnesi oluşturuluyor ve prefernces referansına bağlanıyor editor = preferences.edit(); //aynı şekil editor nesnesi oluşturuluyor editor.putString("isim", isim_string); //isim değeri editor.putString("email", email_string);//email değeri editor.putString("sifre", sifre_string);//şifre değeri editor.putBoolean("login", true);//uygulamaya tekrar girdiğinde kontrol için kullanılcak //editor.putInt("sayısalDeger", 1000);// uygulamamızda kullanılmıyor ama göstermek amacıyla editor.commit();//yapılan değişiklikler kaydedilmesi için editor nesnesinin commit() metodu çağırılır. //Değerlerimizi sharedPreferences a kaydettik.Artık bu bilgiler ile giriş yapabiliriz. Intent i = new Intent(getApplicationContext(),Anasayfa.class); startActivity(i); finish(); } } }); } }
Anasayfa Ekranı
import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import android.preference.PreferenceManager; import android.view.View; import android.widget.Button; public class Anasayfa extends Activity { Button cikis,kayit_sil_cikis; SharedPreferences preferences; //preferences nesne referansı SharedPreferences.Editor editor; //preferences editor nesnesi referansı .prefernces nesnesine veri ekleyip cıkarmak için @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.anasayfa); preferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());//preferences nesnesi oluşturuluyor ve prefernces referansına bağlanıyor editor = preferences.edit(); //aynı şekil editor nesnesi oluşturuluyor cikis = (Button) findViewById(R.id.button1); cikis.setOnClickListener(new View.OnClickListener() {//çıkış butonu tıklanınca @Override public void onClick(View v) { AlertDialog.Builder alertDialog = new AlertDialog.Builder(Anasayfa.this);//Bilgi alert ediliyor alertDialog.setTitle("Bilgi"); alertDialog.setMessage("Çıkış Yaptıktan Sonra Aynı Bilgilerle Giriş Yapabilirsiniz"); alertDialog.setPositiveButton("Tamam", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog,int which) { //Burdaki amaç çıkış butonu ile kullanıcı bilgilerini silmeden çıkış yapmaktır. //Kullanıcı bilgileri silinmeyip sharedpreference üzerinde tutulduğu için aynı bilgilerie tekrardan giriş yapılabilir. //login değerini değiştirerek cıkıs yaptığı için değeri false yapıyoruz. editor.putBoolean("login", false);//uygulamaya tekrar girdiğinde kontrol için kullanılcak editor.commit(); Intent i = new Intent(getApplicationContext(),LoginSayfa.class); startActivity(i); finish(); } }); alertDialog.show(); } }); kayit_sil_cikis = (Button) findViewById(R.id.button2); kayit_sil_cikis.setOnClickListener(new View.OnClickListener() {//SharedPreferences değerlerini tamamen siler @Override public void onClick(View v) { AlertDialog.Builder alertDialog = new AlertDialog.Builder(Anasayfa.this); alertDialog.setTitle("Bilgi"); alertDialog.setMessage("Kayıt Bilgileriniz Tamamen Silinecek.Tekrar Kayıt Olmanız Gerekecek "); alertDialog.setPositiveButton("Tamam", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog,int which) { //Burda değerlerin hepsi silindiği için tekrardan uygulamaya giriş yapabilmesi için kayıt olmalıdır editor.clear();//sharedpreferences değerlerinn hepsini siler editor.commit(); Intent i = new Intent(getApplicationContext(),LoginSayfa.class); startActivity(i); finish(); } }); alertDialog.show(); } }); } }
Arkadaşlar kodu daha iyi anlayabilmek için source kodu indirin ve çalışma mantığına bakın.
Bu dersimde anlatmak istediklerim bu kadar. Birdahaki dersimizde Android Service kullanımı hakkında bilgi vermeye çalışacağım ve ufak bir uygulama yazacağım .
Bu ders hakkında sormak istediğiniz bir şey olursa çekinmeden sorabilirsiniz. Elimden geldiğince yardım ederim. Tekrardan görüşmek dileğiyle kendinize iyi bakın.
Tüm Android Ders, Proje ve Kaynak Kodlar için tıklayınız.
[wpdm_file id=9] 1
KAYIT EKRANINDAN YENİ SAYFAYA NASIL GEÇEBİLİRİZ.SİZİN UYGULAMANIZI KENDİM DENEDİM FAKAT KAYIT YAPTIKTAN SONRA YENİ SAYG-FAYA GEÇEMİYORUM YENİ BİR LAYOUT DA YAPTIM OLMADI HATTA DENEMEK İÇİN SİZİN BU UYGULAMANIZI ECLİPSEDE KURDUM AMA ÇALIŞMIYOR KAYİT UYGULAMASI BEKLENMEDİK ŞEKİLDE DURDURULDU LÜTFEN DAHA SONRA TEKRAR DENEYİN DİYOR YARDIM EDER MİSİNİZ
Yeni olusturduğun activity i manifest.xml de tanımladın mı? Log cat kullanıyor musun eğer kullanıyorsan log cat çıktısını burada paylaşırsan daha iyi yardımcı olabilirim.
Yeni oluşturduğum activity manifest.xml de tanımladım gene
geçmiyor.Bernim yaptığım uygulamda ana ekranda iki buton
var biri Sign UP diğeri Sign İN SİGN UP a tıklıyorum İsim email
password kısımları var bir de altında kayıt ol butonu var kayıt
ol butonuna tıkladığımda tekrar beni anasayfaya atıyor neden
attığını çözdüm çünkü benim ana
sayfamın adı MainActivity sizin kayit ekranı uygulamanızda
kayıt işlemi olduktan sonra Anasayfaya dön yazıyor
Intent
i = new
Intent(getApplicationContext(), Anasayfa.class);
startActivity(i);
finish();
bende
benim uygulamamda ana sayfa MainActivity olduğu için
MainActivity.class yazdım ve ana sayfaya döndü aynı
şekilde farklı bir layout ve buna bağlı bir de Activity
oluşturdum manifest.xml de tanımladım ve Anasayfa.class daki
Anasayfa kısmını yeni activityle değiştirdim ama geçiş
yapmıyor aksine The application guruprocess com.example.guru has
stopped unexpectedly. Please try again force close yazıyor.
Log cat
çıktısını nasıl göndereceğimi bilmiyorum ama
olmazsa size uygulamanın src klasörünü göndermeyi
deneyeceğim
LogCat i nasıl kullanacağını internette biraz araştırmanla bulabilirsin. Oradan hatayı daha net şekilde görebiliriz. Onun dışında direk benim projemi eclipse import ederek kendi hatanın nerede olduğunu daha net bir şekilde görebilirsin. Eclipse->File ->import ->Android File ->Existing Android code ile benim projemi eclipse import et ve kendi yaptığın ile karşılaştır.
Kayıt ekranıyla ilgili sorunu çözdüm yardımlarınız için teşekkürler kayıt butonuna basınca bir sonraki ekrana geçiyor.
Button kayit; buradaki ve diğer tüm Kayıt olarak yazılan butonları kayıt olarak değiştirdim ve çalıştı şimdi sıra login sayfada şimdi onunla uğraşıcam
EditText isim,email,sifre;
String isim_string,email_string,sifre_string;
Faydalı olduysa ne mutlu. Anladığım kadarıyla Android yazmaya yeni başlamışsın.Benim sana tavsiyem daha temel şeylere bakmandır. Activity kavramı activity ler arasında geçiş,buton listener. Android Xml dosyaları gibi..
Eywallah dayı cansın
Merhaba;
Mobilhanem’den çok şeyler öğrendim, emeğinize sağlık.
Ben bir hesap makinesi uygulaması yaptım. Uygulamada iki adet background var. Kullanıcı uygulama içine koyduğum butonlara basarak diğer background’lu ekrana geçiş yapabiliyor.
Sorum şöyle: Uygulamadan Back tuşuyla veya Home tuşuyla çıkıp tekrar girdiğimde uygulama arkaplanda çalıştığı için son kaldığı yerden devam ediyor. Fakat arkaplanda uygulamayı kapattığım zaman sıfırlanıyor ve ilk ekrandan başlıyor. Benim istediğim kaydet tuşuna basarak değilde, kullanıcı hangi background’u seçtiyse, arkaplanda uygulamayı kapattığı zaman bile o ekran kalsın. Bunu nasıl yapabilirim?
Teşekkür ederim…
Merhaba,
Öncelikle yorum için teşekkür ederim.
Kullanıcı hangi arkaplanı seçtiyse onun id’sini Sharedpref olarak kaydedersin. Sonra uygulama acılırken SplashScreen kullanıorsan orda Sharedpref deki kayda göre ilgili ekranı açtırırsın.
Anladım teşekkürler akşam deneyeceğim. Bir sorum daha olacak. Yaptığım uygulamalardaki ekran görüntüsü hepsini ayri ayri çözünürlükte yapmama rağmen, eclipsenin sanal cihazlarında istediğim gibi fakat telefona yukleyince farkli sağa sola kayık gösteriyor, bunun sebebi nedir ?
Bunun sebebi çözünürlüktür. Eclipse’n sanal cihazlarında telefonlardaki çözünürlüğü elde edemez. Şöyle düşün bilgisayarın 768X1320 çözünürlükte kurduğun sanal cihazın gerçeği full hd senin bilgisayarında o çözünürlüğü yakalayamazsın. O yüzden elinden geldiği kadar çok GERÇEK cihazda test etmen gerekir.
Merhaba;
Benim kısaca ekran bu. Ya çok basit bir şeyi yazmayı unutuyorum, çözemedim bu işi:) Whitescreen yazan ikinci background oluyor. Buna nasıl SharedPreferenced uygularım? Yada SharedPref. diye class ve xml mi açmam lazım? Teşekkürler..
Merhaba, güzel bilgiler için teşekkürler.
Ben benzer şekilde Oyun Level kaydını tutuyorum. Oyunda her bir level bir activityden oluşuyor. Next butonu içinde bir integer sayı değeri tutup bunu her levelda 1 artırarak gidiyorum. Anasayfada da play butonu içinde de if sorgusu ile hangi levelda kaldıysam ona intent geçişi yapıyorum. Uygulama çalıştığı sürece kaldığı leveldan devam ediyor fakat uygulamayı kapatıp açınca herşey sıfırlanıyor ve en baştan başlıyor. Uygulama kapatılıp açılıncada kaldığı yerden devam etmesini nasıl sağlayabilirim?
Level bilgilerini 1 artırdığında SharedPreference kaydedeceksin. Kullanıcı kaldığım yerden devam et derse Anasayfada sharedPreference da tuttuğun level bilgisini alıp ilgili intent ten baslatacaksın.
Aynen bende şuan onu yapıyorum fakat uygulamada gezindiğim sürece çalışıyor. Oyunda herhangi bir levelda çıkıp anasayfaya dönüyorum verdiğim intentler sayesinde play deyince kaldığım sayfaya yönleniyor. Uygulamadan çıkıp tekrar girdiğimde herşey sıfırlanmış oluyor. Shared preferences ilk defa kullanıyorum burdaki anlatımdan mantığını anlayıp denedim ve yukarıda bahsettiğim şekli ile çalışıyor. Normalde uygulamadan çıkıncada kayıtlı kalsın diye ekstra bir özelliğe gerek varmı onu bilmiyorum.
Merhabalar, ben yapmış olduğum bir uygulama için sadece bu dersteki gibi giriş ve kayıt ekranı eklemek istiyorum, tam olarak bu yapıyı mı kullanmam gerekli bilmiyorum ama, kullanıcı kayıt yaptığı bilgiler varsa tekrar başka bilgiler ile kayıt yapıp girebilmesini istemiyorum. Yani tek bir kayıt yapılabilmeli. nasıl bir yol izlemeliyim, yardımcı olursanız sevinirim.
Hocam çok sağolun faydalı bilgileriniz için kendi projeme entegre edeceğim sayenizde iyi günler Emeğinize Sağlık…
bunu çoklu dil seçimi için nasıl uydurcaz örnek var mı acaba
https://www.mobilhanem.com/android-coklu-dil-yapisi-multi-language/ inceleyip kendin birleştirebilirsin..
Merhaba. Uygulamaya birden çok kullanıcı kaydı ve girişi yapılacağı zaman sharedpreference tekrar işimize yarayabilir mi? Bu örnekte bir tane kullanıcı için sharedpreference var anladığım kadarıyla. Her kullanıcı için ayrı ayrı mı oluşturuluyor yoksa bunun otomatik bir yolu var mıdır?
Öncelikle sizlere teşekkür ederim. Android studio yazılımını internette araştırarak öğrendim. Şu anda kapsamlı 3. uygulamamı yazıyorum. Sizin yazılarınızda aradığım birçok şeyi buldum. Tüm arkadaşlara sitenizi tavsiye ediyorum.
Merhabalar. Öncelikle kaliteli türkçe içerik oluşturduğunuz için size de diğer site yöneticilerine de teşekkür ederim.Android sharedPreferences kullanımı ile ilgili bir sorunum var.Bu konu hâla aktif mi bilmiyorum ama yine de sormaya karar verdim. Sizin anlattıklarınıza göre uygulamamın login ekranını tasarladım, giriş yapınca isLogged key’i ine “true” atıyorum. Çıkış yapılmadığı sürece “true” kalıyor. Giriş ekranını mainActivity den açmadan önce kontrol edip zaten giriş yapılmışsa direk menüye yönlendiriyorum. Bu sistem emülatorde doğru çalışıyor ve uygulamayı kapatsam bile tekrar açtığımda giriş yapmamı istemiyor ama uygulamayı telefonuma yükleyip denediğimde çalışmıyor. Sebebi ne olabilir ?
Merhaba, bu kaydettiğimiz veriyi hangi fonksiyon ile çekebiliriz mesela kayıt ekranında kaydettiğim ismi main activity üzerinde göstermek istiyorum
Cevabı kodda varmış