o7planning

Android SharedPreferences Tutorial with Examples

  1. What is SharedPreferences?
  2. SharedPreferences example
  3. Appendix: Interface design

1. What is SharedPreferences?

First to clarify what is SharedPreferences, you can see a situation:

You're playing a game on Android, before playing the game, you choose the parameters of the game such as brightness, volume levels, and difficulty level. After finishing, you can turn off the game and continue to play the next day. SharedPreferences allows you to save all the parameters you have set previously, and allow you to replay the settings that can be used without having to reset.
SharedPreferences saves the raw data in the form of pairs of key-value) to the files of the application. You can also choose a private storage mode that other applications can not access these files, so it is safe.

2. SharedPreferences example

Preview images of the application's interface:
Create a project named AndroidSharedPreferences:
  • File > New > New Project > Empty Activity
    • Name: AndroidSharedPreferences
    • Package name: org.o7planning.androidsharedpreferences
    • Language: Java
If you are interested in the steps to design this application interface, see the appendix at the end of the article.
activity_main.xml
<?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="0dp"
        android:layout_height="37dp"
        android:layout_marginStart="16dp"
        android:layout_marginLeft="16dp"
        android:layout_marginTop="24dp"
        android:layout_marginEnd="16dp"
        android:layout_marginRight="16dp"
        android:text="Game Settings"
        android:textSize="24sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="0dp"
        android:layout_height="24dp"
        android:layout_marginStart="16dp"
        android:layout_marginLeft="16dp"
        android:layout_marginTop="22dp"
        android:layout_marginEnd="16dp"
        android:layout_marginRight="16dp"
        android:text="Sound:"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView" />

    <SeekBar
        android:id="@+id/seekBar_sound"
        android:layout_width="0dp"
        android:layout_height="24dp"
        android:layout_marginStart="16dp"
        android:layout_marginLeft="16dp"
        android:layout_marginTop="25dp"
        android:layout_marginEnd="16dp"
        android:layout_marginRight="16dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView2" />

    <TextView
        android:id="@+id/textView3"
        android:layout_width="0dp"
        android:layout_height="22dp"
        android:layout_marginStart="16dp"
        android:layout_marginLeft="16dp"
        android:layout_marginTop="19dp"
        android:layout_marginEnd="16dp"
        android:layout_marginRight="16dp"
        android:text="Bightness:"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/seekBar_sound" />

    <SeekBar
        android:id="@+id/seekBar_brightness"
        android:layout_width="0dp"
        android:layout_height="22dp"
        android:layout_marginStart="16dp"
        android:layout_marginLeft="16dp"
        android:layout_marginTop="31dp"
        android:layout_marginEnd="16dp"
        android:layout_marginRight="16dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView3" />

    <TextView
        android:id="@+id/textView4"
        android:layout_width="0dp"
        android:layout_height="27dp"
        android:layout_marginStart="16dp"
        android:layout_marginLeft="16dp"
        android:layout_marginTop="29dp"
        android:layout_marginEnd="16dp"
        android:layout_marginRight="16dp"
        android:text="Difficulty Level:"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/seekBar_brightness" />

    <RadioGroup
        android:id="@+id/radioGroup_diffLevel"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginLeft="16dp"
        android:layout_marginTop="37dp"
        android:layout_marginEnd="16dp"
        android:layout_marginRight="16dp"
        android:orientation="horizontal"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView4">

        <RadioButton
            android:id="@+id/radioButton_easy"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Easy" />

        <RadioButton
            android:id="@+id/radioButton_medium"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Medium" />

        <RadioButton
            android:id="@+id/radioButton_hard"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Hard" />
    </RadioGroup>

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

</androidx.constraintlayout.widget.ConstraintLayout>
MainActivity.java
package org.o7planning.androidsharedpreferences;

import androidx.appcompat.app.AppCompatActivity;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.SeekBar;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {


    private SeekBar seekBarSound ;
    private SeekBar seekBarBrightness;

    private RadioGroup radioGroupDiffLevel;
    private RadioButton radioButtonEasy;
    private RadioButton radioButtonMedium;
    private RadioButton radioButtonHard;

    private Button buttonSave;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        this.seekBarBrightness= (SeekBar)this.findViewById(R.id.seekBar_brightness);
        this.seekBarSound= (SeekBar)this.findViewById(R.id.seekBar_sound);

        this.seekBarBrightness.setMax(100);
        this.seekBarSound.setMax(100);

        this.radioGroupDiffLevel= (RadioGroup) this.findViewById(R.id.radioGroup_diffLevel);
        this.radioButtonEasy=(RadioButton) this.findViewById(R.id.radioButton_easy);

        this.radioButtonMedium = (RadioButton)this.findViewById(R.id.radioButton_medium);
        this.radioButtonHard=(RadioButton) this.findViewById(R.id.radioButton_hard);

        this.buttonSave = (Button) this.findViewById(R.id.button_save);

        this.buttonSave.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                MainActivity.this.doSave(view);
            }
        });

        // Load saved game setting.
        this.loadGameSetting();
    }


    private void loadGameSetting()  {
        SharedPreferences sharedPreferences= this.getSharedPreferences("gameSetting", Context.MODE_PRIVATE);

        if(sharedPreferences!= null) {

            int brightness = sharedPreferences.getInt("brightness", 90);
            int sound = sharedPreferences.getInt("sound",95);
            int checkedRadioButtonId = sharedPreferences.getInt("checkedRadioButtonId", R.id.radioButton_medium);

            this.seekBarSound.setProgress(sound);
            this.seekBarBrightness.setProgress(brightness);
            this.radioGroupDiffLevel.check(checkedRadioButtonId);

        } else {
            this.radioGroupDiffLevel.check(R.id.radioButton_medium);
            Toast.makeText(this,"Use the default game setting",Toast.LENGTH_LONG).show();
        }

    }

    // Called when user click to Save button.
    public void doSave(View view)  {
        // The created file can only be accessed by the calling application
        // (or all applications sharing the same user ID).
        SharedPreferences sharedPreferences= this.getSharedPreferences("gameSetting", Context.MODE_PRIVATE);

        SharedPreferences.Editor editor = sharedPreferences.edit();

        editor.putInt("brightness", this.seekBarBrightness.getProgress());
        editor.putInt("sound", this.seekBarSound.getProgress());

        // Checked RadioButton ID.
        int checkedRadioButtonId = radioGroupDiffLevel.getCheckedRadioButtonId();

        editor.putInt("checkedRadioButtonId", checkedRadioButtonId);

        // Save.
        editor.apply();

        Toast.makeText(this,"Game Setting saved!",Toast.LENGTH_LONG).show();
    }
}
After saving, you can exit application and re-open it, paramaters that you have saved will be set automatically for the game

3. Appendix: Interface design

Add TextView(s), SeekBar(s) to the interface.
Add RadioGroup and RadioButton(s) to the interface.
Add a Button to the interface:
Set ID, Text for components on the interface:

Android Programming Tutorials

Show More