Şimdi edindiğimiz bilgilerle bir kayıt işlemi yapalım. Kişiden isim, soyisim, yaş, email ve şifre değerlerini aldığımız bir yapı oluşturalım. Bunun için öncelikle layout’unu oluşturmamız lazım.
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout 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" tools:context=".MainActivity"> <EditText android:id="@+id/emailText" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="36dp" android:layout_marginTop="32dp" android:layout_marginEnd="36dp" android:ems="10" android:hint="Email" android:inputType="textPersonName" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/ageText" /> <EditText android:id="@+id/passwordText" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="36dp" android:layout_marginTop="32dp" android:layout_marginEnd="36dp" android:ems="10" android:hint="Şifre" android:inputType="textPersonName|textPassword" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/emailText" /> <EditText android:id="@+id/ageText" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="36dp" android:layout_marginTop="32dp" android:layout_marginEnd="36dp" android:ems="10" android:hint="Yaşınız" android:inputType="number|textPersonName" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/surnameText" /> <EditText android:id="@+id/surnameText" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="36dp" android:layout_marginTop="32dp" android:layout_marginEnd="36dp" android:ems="10" android:hint="Soyisminiz" android:inputType="textPersonName" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/nameText" /> <EditText android:id="@+id/nameText" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="36dp" android:layout_marginTop="32dp" android:layout_marginEnd="36dp" android:ems="10" android:hint="İsminiz" android:inputType="textPersonName" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <Button android:id="@+id/saveButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="32dp" android:layout_marginEnd="48dp" android:text="KAYIT OL" android:onClick="makePerson" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@+id/passwordText" /> </androidx.constraintlayout.widget.ConstraintLayout>
EditText’ler ve buton ile yapımızı oluşturduk. Button için bir onClick methodu oluşturduk ve makePerson() ismini verdik.
fun makePerson(view : View) { val name = nameText.text.toString() val surname = surnameText.text.toString() val age : Int? = ageText.text.toString().toIntOrNull() //kişi burada yazı girebilir. Aslında ageText’i xml dosyasında tanımlarken number tipinde de tanımlayabilirdik. Veya bu yöntemi kullanarak kotlin dosyasında da güvenliğini sağlayabiliriz. val email = emailText.text.toString() val password = passwordText.text.toString() if (name.equals("") || surname.equals("") || age == null || email.equals("") || password.equals("")){ Toast.makeText (applicationContext, "Tüm alanları doldurmalısın" , Toast.LENGTH_SHORT).show() }else { Toast.makeText (applicationContext, "İsim : $name Soyad : $surname Yaş : $age Email : $email Şifre : $password" , Toast.LENGTH_LONG).show() } }
Bu şekilde button’a tıklandığında ekrana toast mesajı gösteren bir uygulama yapmış olduk. Eğer buraya kadar hatasız yaptıysak devam edebiliriz.
Şimdi hem bu uygulamaya devam ederken hem de örneksiz çok anlatılamayacak scope ve sharedpreferences konularını bu uygulama ile işleyelim.
Scope
Scope java’da kotlin’de veya başka bir dilde hep benzer şekilde çalışır. İki scope arasındaki kodlara, değişkenlere başka scope içinden doğrudan erişilemez.
Alt scope’ta ise erişilibilir
{ /* Kod, Değişkenler… */ { /* ALT SCOPE Erişim var */ } } { /* FARKLI SCOPE Erişim yok */ }
Kotlin Lateinit
Önceki derste de kullanmıştım. Lateinit bir değişkeni şimdi tanımlıyorum değer atamasını sonra yapacağım demek oluyor. Yani mesela
Var myString : String = “”
yapmak yerine
lateinit var myString : String
İkisinin farkı ortada aslında. Yukarıdaki boşlukta olsa bir string değer atıyorsun. Hafızada o boşluk değerini string halde tutuyor. Alttaki laneinit ile kullanılan örnekte bunu daha sonradan tanımlayacağını söylüyorsun. Bu dışarıdan bir bilgi olabilir , veritabınından alınacak bir bilgi olabilir veya herhangi bir değişken veya sabit olabilir ama bunu sonradan tanımlayacağını şimdi initialize etmeyeceğini belirtiyorsun. Lateinit kotlini javadan ayıran ve güvenli kod yazılmasını sağlayan en önemli yapılardan biridir.
Kotlin Veri Kaydetmek, Silmek ve Getirmek (SharedPreferences)
Yukarıdaki çevrimdışı kayıt örneğinde tamam verileri aldık ve ekrana Toast mesajı olarak bastırdık. Ama uygulamadan çıkıp tekrar girdiğimizde bu veriler bir yerde gösterilmiyor veya bir yere kaydedilmedi aslında. Bu tarz uygulamalarda kullanıcı bilgilerini tuttuğumuz bir yapı olan sharedPreferences’e gelin yakından bakalım
Verileri Saklamak (SharedPreferences)
SharedPreferences aslında bir sınıf. Sınıf olduğu içinde öncelikle sharedPref objesi oluşturmamız lazım.
private lateinit var sharedPref : SharedPreferences // MainActivity altında sharedPref = this.getSharedPreferences("com.axisting.offlineregisterapp", Context.MODE_PRIVATE) // onCreate altında
NOT : Burada MODE_PRIVATE ile bu uygulamada sharedPref ile kaydedilecek verilere sadece bu uygulamadan erişileceğini söylüyoruz. Erişimini kısıtlıyoruz. Kısıtlamadığımız durumda ise aynı cihazdan diğer uygulamalardan dahi erişilebilir veriler ekleyebiliriz. Şuan için bunu istemiyoruz.
Nesneyi oluşturduk. Artık cihazda “com.axisting.offlineregisterapp” altında bu bilgiler saklanabilir hale geldi.(Uygulama ismiyle kayıt etmek kodun okunurluğunu çoğu zaman için artırır.)
Şimdi örneğimiz doğrultusunda buttona tıklanıldığında gelişecek aksiyonlar içerisine bunları sharedpref içinde kayıt edelim.
sharedPref.edit().putString ("name", name).apply() sharedPref.edit().putString("surname", surname).apply() sharedPref.edit().putInt("age", age).apply() sharedPref.edit().putString("email", email).apply() sharedPref.edit().putString("password", password).apply()
Şekildeki gibi önce anahtar değer sonrasında ise kayıt edilecek girdi değeri ekliyoruz. Yani cihaz hafızasında örnek verecek olursak şu şekilde kayıt oluyor
Name : volkan
Surname : demir
Age : 26
Email : info@axisting.com
Password : 123456
Verileri Okumak, Verileri Getirmek (SharedPreferences)
Verileri istediğimiz zaman okuyabiliriz artık. Bunun için uygulamanın her yerinden erişmek adına sharedPreferencesi önce global tanımlayalım
private lateinit var sharedPref : SharedPreferences // mainactivity altı sharedPref = this.getSharedPreferences("com.axisting.offlineregisterapp", Context.MODE_PRIVATE) // oncreate altı
Verileri getirirken uygulamanın hangi konumunda olursak olalım önce SharedPreferences nesnesi oluşturmamız lazım.
Bu kısımları eksiksiz yaptığımız durumda istediğimiz aktiviteden veya classtan artık verileri okuyabiliriz.
val sharedName = sharedPref.getString("name","-1000") System.out.println(sharedName)
Bu şekilde kolaylıkla verileri okuyabiliriz. Bunu kontrollerle zenginleştirmek artık size kalmış.
Verileri Silmek (SharedPreferences)
Örneğin uygulamada kaydettiğimiz bu verileri bir delete butonu aracılığıyla silelim. Delete isminde bir button oluşturup delete isminde bir onClick methodu tanımlayalım. Bu delete() methodu şu şekilde olurdu.
fun deletePerson(view : View) { val sharedName = sharedPref.getString("name","-100") val sharedSurname = sharedPref.getString("surname","-100") val sharedAge = sharedPref.getInt("age",-100) val sharedEmail = sharedPref.getString("email","-100") val sharedPassword = sharedPref.getString("password","-100") if (!sharedName.equals("-100")){ sharedPref.edit().remove("name").apply() } if (!sharedSurname.equals("-100")){ sharedPref.edit().remove("surname").apply() } if (sharedAge != -100){ sharedPref.edit().remove("age").apply() } if (!sharedEmail.equals("-100")){ sharedPref.edit().remove("email").apply() } if (!sharedPassword.equals("-100")){ sharedPref.edit().remove("password").apply() } Toast.makeText(applicationContext, "Paylaşılan Veriler Silindi..", Toast.LENGTH_SHORT).show() }
Not : Bu şekilde offline kayıt olma uygulamasının tamamını doldurabiliriz. Ben tam halini github hesabımda da paylaşacağım.
Bir sonraki derste aktiviteler ve yaşam döngülerinden bahsedelim.