Learn how to use shared preferences in Android

Learn how you can use shared preferences in you Android project. This article will guide you with step by step breakdown of how you can use the shared preferences available in Android to store simple key value pairs.

Quick Navigation

What is shared preferences in Android ?

To fully understand shared preferences we must first look at why was it required in the first place.

As we know that we cannot retain the values once the application has exited. We need some form of mechanism to persist the data in our application. That’s where shared preferences in Android comes in.

Shared preferences are just xml files in android that hold simple key value pairs of data.

Example: name -> techenum

That is it nothing more nothing less. However it does support other basic datatypes.

Also Read : Learn how to use fileprovider in Android with example

TECHENUM

Shared preferences simple structure

Before continuing with out example we will look at how the shared preferences work. Do not copy the code below, it will not work. It’s just for an example on how to use shared preferences.

Let us look at the code below:

val application = Application()
val pref = applicatino.getSharedPreferences("_name_of_preference", Context.MODE_PRIVATE)Code language: Kotlin (kotlin)

Now that we have created a new instance of shared preferences let us save some value:

val isSuccess = pref.edit().putString("name", "Techenum").commit()Code language: Kotlin (kotlin)

We have saved our value. Now let us see how can we retrieve the value.

val name = pref.getString("name", null) // here null is the default value which is returned if the key is not foundCode language: Kotlin (kotlin)

Now that we have learn the basics of shared preferences in Android. Let us slightly modify the things we have learned and complete our project.

Also Read: Learn How To Create Tabs With ViewPager2

TECHENUM

Creating a shared preferences helper

Let us create a new Kotlin class named SpHelper where we will put the shared preferences code.

@SuppressLint("ApplySharedPref")
class SpHelper private constructor(private val mSharedPreference: SharedPreferences) {

    fun save(key: String, value: String) {
        mSharedPreference.edit().putString(key, value).commit()
    }

    fun save(key: String, value: Boolean) {
        mSharedPreference.edit().putBoolean(key, value).commit()
    }

    fun save(key: String, value: Long) {
        mSharedPreference.edit().putLong(key, value).commit()
    }

    fun save(key: String, value: Int) {
        mSharedPreference.edit().putInt(key, value).commit()
    }

    fun get(key: String, default: String?): String? {
        return mSharedPreference.getString(key, default)
    }

    fun get(key: String, default: Boolean): Boolean {
        return mSharedPreference.getBoolean(key, default)
    }

    fun get(key: String, default: Long): Long {
        return mSharedPreference.getLong(key, default)
    }

    fun get(key: String, default: Int): Int {
        return mSharedPreference.getInt(key, default)
    }

    companion object {

        private lateinit var INSTANCE: SpHelper

        fun init(application: Application) {
            val sp = application.getSharedPreferences("_sp_test", Context.MODE_PRIVATE)
            INSTANCE = SpHelper(sp)
        }

        fun instance(): SpHelper {
            return INSTANCE
        }

    }

}Code language: Kotlin (kotlin)

What have I done with the code ? Let me explain

  • @SuppressLint("ApplySharedPref") supresses the lint warning on this class
  • We have each method to save all type of values save(key:String, value:String)
  • The method to retrieve the value has been added get(key: String, default: String): String

The companion object also holds a few method and member variables. What are they ?

We have SpHelper.init(application) to create a singleton instance of the helper class. And then we will use SpHelper.instance() to get instance whenever required.

Also Read : How to get current GPS location in Android

TECHENUM

Creating UI and using our helper class

In our activity_main.xml we have the following code for a simple UI.

<?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">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="8dp"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.25" />

    <EditText
        android:id="@+id/edit_text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginTop="32dp"
        android:layout_marginEnd="16dp"
        android:hint="Enter Some Value"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView" />

    <Button
        android:id="@+id/button_save"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="32dp"
        android:text="Save"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="@+id/edit_text"
        app:layout_constraintTop_toBottomOf="@+id/edit_text" />

    <Button
        android:id="@+id/button_load"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Load"
        app:layout_constraintBottom_toBottomOf="@+id/button_save"
        app:layout_constraintEnd_toEndOf="@+id/edit_text"
        app:layout_constraintHorizontal_bias="0.9"
        app:layout_constraintStart_toEndOf="@+id/button_save" />

</androidx.constraintlayout.widget.ConstraintLayout>Code language: HTML, XML (xml)

Now to actually save the values from the activity. I have implemented the following portions in my code.

class MainActivity : AppCompatActivity(), View.OnClickListener {

    private lateinit var mEditText: EditText
    private lateinit var mSave: Button
    private lateinit var mLoad: Button
    private lateinit var mSpHelper: SpHelper

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

        SpHelper.init(application)
        mSpHelper = SpHelper.instance()

        mEditText = findViewById(R.id.edit_text)
        mSave = findViewById(R.id.button_save)
        mLoad = findViewById(R.id.button_load)

        mSave.setOnClickListener(this)
        mLoad.setOnClickListener(this)

    }

    override fun onClick(p0: View) {
        when (p0.id) {
            R.id.button_save -> {
                mSpHelper.save(PREF_KEY, mEditText.text.toString())
                mEditText.setText("")
                Toast.makeText(this, "Value saved!", Toast.LENGTH_LONG).show()
            }
            R.id.button_load -> {
                mEditText.setText(mSpHelper.get(PREF_KEY, "-- value not found --"))
            }
        }
    }

    companion object {
        const val PREF_KEY = "key.pref.test"
    }

}Code language: Kotlin (kotlin)

In the onCreate() { } we have mapped the views to member instances.

Also we have implemented a click listener and assigned it to each button.

And in the companion object we have the key instance variable.

That is all we have learn how we can use shared preferences in Android.

You can check out the documentation for more here.

Also Read : Async Task in Android is Deprecated: There are Better Ways

TECHENUM

Related Posts