Bird
Raised Fist0
Android Kotlinmobile~20 mins

SharedPreferences / DataStore in Android Kotlin - Mini App: Build & Ship

Choose your learning style10 modes available
Build: Settings Screen
This screen lets the user save and load a username using SharedPreferences. The user can enter a name, save it, and see the saved name displayed.
Target UI
-------------------------
|       Settings        |
|-----------------------|
| Enter username:       |
| [______________]      |
|                       |
| [ Save ]              |
|                       |
| Saved username:       |
| [No username saved]   |
-------------------------
Add an EditText for username input
Add a Save button that saves the username to SharedPreferences
Display the saved username below the button
Load and show the saved username when the screen opens
Starter Code
Android Kotlin
package com.example.settingsapp

import android.content.Context
import android.content.SharedPreferences
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity

class SettingsActivity : AppCompatActivity() {
    private lateinit var usernameEditText: EditText
    private lateinit var saveButton: Button
    private lateinit var savedUsernameTextView: TextView
    private lateinit var sharedPreferences: SharedPreferences

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

        usernameEditText = findViewById(R.id.usernameEditText)
        saveButton = findViewById(R.id.saveButton)
        savedUsernameTextView = findViewById(R.id.savedUsernameTextView)

        sharedPreferences = getSharedPreferences("MyPrefs", Context.MODE_PRIVATE)

        // TODO: Load saved username and display it

        // TODO: Set saveButton click listener to save username
    }
}
Task 1
Task 2
Task 3
Solution
Android Kotlin
package com.example.settingsapp

import android.content.Context
import android.content.SharedPreferences
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity

class SettingsActivity : AppCompatActivity() {
    private lateinit var usernameEditText: EditText
    private lateinit var saveButton: Button
    private lateinit var savedUsernameTextView: TextView
    private lateinit var sharedPreferences: SharedPreferences

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

        usernameEditText = findViewById(R.id.usernameEditText)
        saveButton = findViewById(R.id.saveButton)
        savedUsernameTextView = findViewById(R.id.savedUsernameTextView)

        sharedPreferences = getSharedPreferences("MyPrefs", Context.MODE_PRIVATE)

        // Load saved username and display it
        val savedUsername = sharedPreferences.getString("username", null)
        if (savedUsername != null) {
            savedUsernameTextView.text = savedUsername
        } else {
            savedUsernameTextView.text = "No username saved"
        }

        // Save username on button click
        saveButton.setOnClickListener {
            val username = usernameEditText.text.toString()
            if (username.isNotBlank()) {
                sharedPreferences.edit().putString("username", username).apply()
                savedUsernameTextView.text = username
            }
        }
    }
}

This code uses SharedPreferences to save and load a username.

When the screen opens, it reads the saved username from SharedPreferences. If there is one, it shows it; otherwise, it shows a default message.

When the user types a username and taps Save, the app saves the username in SharedPreferences and updates the displayed saved username immediately.

This way, the username stays saved even if the app is closed and reopened.

Final Result
Completed Screen
-------------------------
|       Settings        |
|-----------------------|
| Enter username:       |
| [Alice__________]     |
|                       |
| [ Save ]              |
|                       |
| Saved username:       |
| Alice                 |
-------------------------
User types a name in the input box
User taps Save button
The typed name is saved and shown below
When reopening the screen, the saved name is shown automatically
Stretch Goal
Add a Clear button that removes the saved username from SharedPreferences and updates the display
💡 Hint
Use sharedPreferences.edit().remove("username").apply() and update the TextView to show 'No username saved'

Practice

(1/5)
1. What is the main purpose of SharedPreferences in Android development?
easy
A. To handle network requests and responses
B. To create complex database tables for large data storage
C. To save small amounts of key-value data persistently on the device
D. To design user interface layouts

Solution

  1. Step 1: Understand SharedPreferences role

    SharedPreferences is designed to store small amounts of data as key-value pairs persistently on the device.
  2. Step 2: Compare with other options

    Options B, C, and D describe unrelated tasks like databases, networking, and UI design, which are not the purpose of SharedPreferences.
  3. Final Answer:

    To save small amounts of key-value data persistently on the device -> Option C
  4. Quick Check:

    SharedPreferences = small persistent key-value storage [OK]
Hint: Remember SharedPreferences stores simple key-value pairs [OK]
Common Mistakes:
  • Confusing SharedPreferences with databases
  • Thinking SharedPreferences handles UI or network
  • Assuming SharedPreferences stores large files
2. Which of the following is the correct way to get a SharedPreferences instance in Kotlin inside an Activity?
easy
A. val prefs = SharedPreferences("my_prefs")
B. val prefs = getSharedPreferences("my_prefs", Context.MODE_PRIVATE)
C. val prefs = SharedPreferences.getInstance("my_prefs")
D. val prefs = getPreferences("my_prefs")

Solution

  1. Step 1: Recall correct method to get SharedPreferences

    The correct method is to call getSharedPreferences(name, mode) on a Context, passing the name and mode.
  2. Step 2: Analyze options

    val prefs = getSharedPreferences("my_prefs", Context.MODE_PRIVATE) uses the correct method. Options A, C, and D are invalid constructors or methods. val prefs = getPreferences("my_prefs") uses getPreferences which does not take a name parameter.
  3. Final Answer:

    val prefs = getSharedPreferences("my_prefs", Context.MODE_PRIVATE) -> Option B
  4. Quick Check:

    Use getSharedPreferences(name, mode) to get prefs [OK]
Hint: Use getSharedPreferences with name and mode inside Activity [OK]
Common Mistakes:
  • Trying to instantiate SharedPreferences directly
  • Using getPreferences with a name parameter
  • Confusing method names or parameters
3. What will be the output of this Kotlin code snippet using SharedPreferences?
val prefs = getSharedPreferences("settings", Context.MODE_PRIVATE)
val editor = prefs.edit()
editor.putString("username", "Alice")
editor.apply()
val name = prefs.getString("username", "Unknown")
println(name)
medium
A. null
B. Unknown
C. Compilation error
D. Alice

Solution

  1. Step 1: Store value in SharedPreferences

    The code puts the string "Alice" with key "username" and applies the changes asynchronously.
  2. Step 2: Retrieve stored value

    Then it retrieves the value for "username"; since it was stored, it returns "Alice" instead of the default "Unknown".
  3. Final Answer:

    Alice -> Option D
  4. Quick Check:

    Stored value retrieved correctly = Alice [OK]
Hint: Stored keys return saved value, else default [OK]
Common Mistakes:
  • Forgetting to call apply() or commit()
  • Expecting default value when key exists
  • Confusing synchronous and asynchronous apply
4. Identify the error in this Kotlin code using DataStore to save a boolean value:
val dataStore = context.createDataStore(name = "settings")
fun saveFlag(flag: Boolean) {
  dataStore.edit { preferences ->
    preferences[booleanPreferencesKey("flag")] = flag
  }
}
medium
A. Missing 'suspend' modifier on the saveFlag function
B. Missing commit() call after edit block
C. booleanPreferencesKey should be replaced with stringPreferencesKey
D. DataStore cannot store boolean values

Solution

  1. Step 1: Check DataStore function modifiers

    The function saveFlag must be marked suspend because it calls dataStore.edit(), which is a suspend function.
  2. Step 2: Verify other code parts

    The createDataStore call is correct. The edit block commits changes automatically. Using booleanPreferencesKey is correct for boolean values. DataStore supports boolean values.
  3. Final Answer:

    Missing 'suspend' modifier on the saveFlag function -> Option A
  4. Quick Check:

    DataStore edit requires suspend function [OK]
Hint: DataStore edit calls require suspend functions [OK]
Common Mistakes:
  • Missing 'suspend' modifier on saveFlag function
  • Forgetting suspend modifier on save function
  • Confusing preference key types
5. You want to migrate existing user settings from SharedPreferences to DataStore in a Kotlin app. Which approach correctly handles this migration?
hard
A. Use SharedPreferencesMigration with DataStore to copy data automatically on first access
B. Manually read all SharedPreferences keys and write them to DataStore every app start
C. Delete SharedPreferences and start fresh with DataStore without migration
D. Use SharedPreferences.edit() inside DataStore's edit block

Solution

  1. Step 1: Understand migration support in DataStore

    DataStore provides a built-in SharedPreferencesMigration class to migrate data automatically from SharedPreferences on first DataStore access.
  2. Step 2: Evaluate other options

    Manually read all SharedPreferences keys and write them to DataStore every app start is inefficient and error-prone. Delete SharedPreferences and start fresh with DataStore without migration loses user data. Use SharedPreferences.edit() inside DataStore's edit block is invalid because SharedPreferences and DataStore APIs are separate and cannot be mixed inside edit blocks.
  3. Final Answer:

    Use SharedPreferencesMigration with DataStore to copy data automatically on first access -> Option A
  4. Quick Check:

    Use SharedPreferencesMigration for smooth migration [OK]
Hint: Use SharedPreferencesMigration for easy migration [OK]
Common Mistakes:
  • Trying manual migration every app start
  • Deleting old preferences losing data
  • Mixing SharedPreferences API inside DataStore
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard