Merhabalar,


Bu yazıda Android'de Shared Preferences kullanımından bahsedeceğim. Shared Preferences ile key-value şeklinde değerleri uygulamanın yüklenmiş olduğu cihazın bünyesinde kaydedip kullanabilirsiniz. Şimdi örnek bir proje üzerinde kullanımını görelim.


Senaryomuz şu şekilde olacak; İlk olarak uygulamada Splash ekranı belirecek. 3 saniyelik bir beklemenin ardından eğer giriş yapılmadıysa Login ekranına, giriş yapıldıysa ana sayfaya geçiş yapılacak. Login ekranında kullanıcı adı ve parola istenecek. Eğer doğru bilgiler girilirse ana sayfaya geçiş yapılacak. Ana sayfada bulunan çıkış yap butonuyla da tekrardan Login ekranına dönülecek. Örnek projeyi Github üzerinden paylaştım. İndirip inceleyebilirsiniz:


Örnek proje linki


İlk olarak Android Studio'da boş bir proje oluşturuyoruz. Projeyi oluştururken Activity name kısmına SplashActivity yazıyoruz. Sonrasında uygulamaya 2 adet activity (LoginActivity, MainActivity) ekliyoruz.


Splash ekranına 1 adet ImageView koyarak basit bir tasarım yapıyoruz.

activity_splash.xml:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".SplashActivity">

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:srcCompat="@mipmap/ic_launcher"
        android:id="@+id/imageView"
        android:layout_marginTop="8dp"
        app:layout_constraintTop_toTopOf="parent"
        android:layout_marginBottom="8dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        android:layout_marginStart="8dp"
        app:layout_constraintEnd_toEndOf="parent"
        android:layout_marginEnd="8dp"/>
</android.support.constraint.ConstraintLayout>


Login ekranına 1 adet ImageView, 2 adet EditText ve 1 adet Button koyarak olabildiğince basit bir tasarım daha çıkartıyoruz.

activity_login.xml:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".LoginActivity">

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:inputType="textPersonName"
        android:text=""
        android:hint="Kullanıcı adı"
        android:ems="10"
        android:id="@+id/etUsername"
        android:layout_marginStart="8dp"
        app:layout_constraintStart_toStartOf="parent"
        android:layout_marginEnd="8dp"
        app:layout_constraintEnd_toEndOf="parent"
        android:layout_marginTop="50dp"
        app:layout_constraintTop_toBottomOf="@+id/imageView"/>

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:inputType="textPassword"
        android:ems="10"
        android:id="@+id/etPassword"
        android:hint="Parola"
        app:layout_constraintStart_toStartOf="parent"
        android:layout_marginStart="8dp"
        app:layout_constraintEnd_toEndOf="parent"
        android:layout_marginEnd="8dp"
        android:layout_marginTop="8dp"
        app:layout_constraintTop_toBottomOf="@+id/etUsername"/>

    <Button
        android:text="Giriş Yap"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/bLogin"
        app:layout_constraintStart_toStartOf="parent"
        android:layout_marginStart="8dp"
        app:layout_constraintEnd_toEndOf="parent"
        android:layout_marginEnd="8dp"
        android:layout_marginTop="50dp"
        app:layout_constraintTop_toBottomOf="@+id/etPassword"/>

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:srcCompat="@mipmap/ic_launcher"
        android:id="@+id/imageView"
        android:layout_marginTop="50dp"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        android:layout_marginStart="8dp"
        app:layout_constraintEnd_toEndOf="parent"
        android:layout_marginEnd="8dp"/>

</android.support.constraint.ConstraintLayout>


Ana sayfa ekranı içinde 1 adet TextView ve 1 adet Button koyarak basit tasarımın dibine vuruyoruz.

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".LoginActivity">

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:inputType="textPersonName"
        android:text=""
        android:hint="Kullanıcı adı"
        android:ems="10"
        android:id="@+id/etUsername"
        android:layout_marginStart="8dp"
        app:layout_constraintStart_toStartOf="parent"
        android:layout_marginEnd="8dp"
        app:layout_constraintEnd_toEndOf="parent"
        android:layout_marginTop="50dp"
        app:layout_constraintTop_toBottomOf="@+id/imageView"/>

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:inputType="textPassword"
        android:ems="10"
        android:id="@+id/etPassword"
        android:hint="Parola"
        app:layout_constraintStart_toStartOf="parent"
        android:layout_marginStart="8dp"
        app:layout_constraintEnd_toEndOf="parent"
        android:layout_marginEnd="8dp"
        android:layout_marginTop="8dp"
        app:layout_constraintTop_toBottomOf="@+id/etUsername"/>

    <Button
        android:text="Giriş Yap"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/bLogin"
        app:layout_constraintStart_toStartOf="parent"
        android:layout_marginStart="8dp"
        app:layout_constraintEnd_toEndOf="parent"
        android:layout_marginEnd="8dp"
        android:layout_marginTop="50dp"
        app:layout_constraintTop_toBottomOf="@+id/etPassword"/>

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:srcCompat="@mipmap/ic_launcher"
        android:id="@+id/imageView"
        android:layout_marginTop="50dp"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        android:layout_marginStart="8dp"
        app:layout_constraintEnd_toEndOf="parent"
        android:layout_marginEnd="8dp"/>

</android.support.constraint.ConstraintLayout>


SplashActivity dosyasını açıp içeriğini şu şekilde dolduruyoruz.

SplashActivity.kt:

package com.yusufborucu.sharedpreferencessample

import android.content.Context
import android.content.Intent
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.os.Handler

class SplashActivity : AppCompatActivity() {

    private var handler: Handler? = null
    private var delay: Long = 3000

    private val runnable: Runnable = Runnable {
        if (!isFinishing) {
            val preferences = getSharedPreferences("MyApp", Context.MODE_PRIVATE)
            if (preferences.getBoolean("login", false)) {
                val intent = Intent(applicationContext, MainActivity::class.java)
                startActivity(intent)
                finish()
            } else {
                val intent = Intent(applicationContext, LoginActivity::class.java)
                startActivity(intent)
                finish()
            }
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_splash)

        handler = Handler()
        handler!!.postDelayed(runnable, delay)
    }

    override fun onDestroy() {
        if (handler != null) {
            handler!!.removeCallbacks(runnable)
        }
        super.onDestroy()
    }

}

Burada yaptığımız işlemler;

  • Handler yardımıyla 3 saniyelik bir bekleme oluştur
  • Shared Preferences ile kaydedilmiş olan login ifadesinin değeri true ise Intent yardımıyla ana sayfaya, false ise yine Intent yardımıyla Login ekranına geçiş yap


LoginActivity dosyasını açıp içeriğini şu şekilde dolduruyoruz.

LoginActivity.kt:

package com.yusufborucu.sharedpreferencessample

import android.content.Context
import android.content.Intent
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.widget.Toast
import kotlinx.android.synthetic.main.activity_login.*

class LoginActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_login)

        bLogin.setOnClickListener {
            val username = etUsername.text.toString()
            val password = etPassword.text.toString()

            if (username == "aliveli" && password == "123456") {
                val preferences = getSharedPreferences("MyApp", Context.MODE_PRIVATE)
                val editor = preferences.edit()
                editor.putBoolean("login", true)
                editor.apply()

                val intent = Intent(applicationContext, MainActivity::class.java)
                startActivity(intent)
                finish()
            } else {
                Toast.makeText(this, "Kullanıcı adı veya parola yanlış.", Toast.LENGTH_SHORT).show()
            }
        }
    }
}

Burada yaptığımız işlemler;

  • Ekranda bulunan giriş yap butonuna tıklandığında, girilen kullanıcı adı ve parolayı karşıla
  • Girilen bilgiler istenilenlere eşitse Shared Preferences yardımıyla login adında bir boolean ifade oluşturup değerini true yap ve kaydet. Sonrasında da Intent yardımıyla ana sayfaya geçiş yap
  • Girilen bilgiler istenilenlere eşit değilse ekranda "Kullanıcı adı veya parola yanlış." şeklinde bir uyarı göster.


MainActivity dosyasını açıp içeriğini şu şekilde dolduruyoruz.

MainActivity.kt:

package com.yusufborucu.sharedpreferencessample

import android.content.Context
import android.content.Intent
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        bLogout.setOnClickListener {
            val preferences = getSharedPreferences("MyApp", Context.MODE_PRIVATE)
            val editor = preferences.edit()
            editor.putBoolean("login", false)
            editor.apply()

            val intent = Intent(applicationContext, LoginActivity::class.java)
            startActivity(intent)
            finish()
        }
    }
}

Burada yaptığımız işlemler;

  • Ekranda bulunan çıkış yap butonuna tıklandığında Shared Preferences yardımıyla login adındaki ifadenin değerini false yap
  • Intent yardımıyla Login ekranına geçiş yap


Artık uygulamayı çalıştırıp test edebilirsiniz.


Umarım faydalı olmuştur.


İyi çalışmalar.