Android SharedPreferences с использованием Kotlin
В этом руководстве мы узнаем, как реализовать SharedPreferences в нашем приложении для Android с помощью Kotlin.
Что такое общие настройки Android?
SharedPreferences является частью Android API, начиная с уровня API 1. Это интерфейс, который позволяет нам хранить/изменять/удалять данные локально. Как правило, он используется для кэширования локальных данных пользователя, таких как формы входа. Данные хранятся в виде пары ключ-значение. Вы можете создать несколько файлов для хранения данных SharedPreferences.
Методы SharedPreferences
Давайте рассмотрим некоторые важные методы для SharedPreferences.
- Метод
getSharedPreferences(String, int)
используется для получения экземпляраSharedPreferences
. ЗдесьString
— это имя файла SharedPreferences, аint
— переданный контекст.- Для редактирования значений в
SharedPreferences
используетсяSharedPreferences.Editor()
. - Мы можем вызвать
commit()
илиapply()
, чтобы сохранить значения в файле SharedPreferences.commit()
сохраняет значения немедленно, тогда какapply()
сохраняет значения асинхронно.
Настройка/получение значений SharedPreferences с использованием Kotlin
Мы можем установить значения в нашем экземпляре SharedPreference с помощью Kotlin следующим образом.
val sharedPreference = getSharedPreferences("PREFERENCE_NAME",Context.MODE_PRIVATE)
var editor = sharedPreference.edit()
editor.putString("username","Anupam")
editor.putLong("l",100L)
editor.commit()
Для получения значения:
sharedPreference.getString("username","defaultName")
sharedPreference.getLong("l",1L)
Код Kotlin для очистки и удаления записей SharedPreferences
Мы также можем очистить все значения или удалить определенное значение, вызвав методы clear()
и remove(String key)
.
editor.clear()
editor.remove("username")
Примечание. Изменения, внесенные в редактор после фиксации или применения, не учитываются. Описанный выше способ сохранения и извлечения значений из SharedPreference почти такой же, как в Java. Так где же магия Котлина? Это то, что мы увидим далее в примере приложения для Android.
Структура проекта Android SharedPreferences Kotlin
1. Код макета
Код файла макета activity_main.xml
приведен ниже.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<EditText
android:id="@+id/inUserId"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:hint="User ID"
android:inputType="number" />
<EditText
android:id="@+id/inPassword"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/inUserId"
android:hint="Password"
android:inputType="textPassword" />
<Button
android:id="@+id/btnSave"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/inPassword"
android:text="SAVE USER DATA" />
<Button
android:id="@+id/btnClear"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_below="@+id/btnSave"
android:text="CLEAR USER DATA" />
<Button
android:id="@+id/btnShow"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_below="@+id/inPassword"
android:text="SHOW" />
<Button
android:id="@+id/btnShowDefault"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_below="@+id/btnSave"
android:text="Show Default" />
</RelativeLayout>
2. Код MainActivity Kotlin
Код класса MainActivity.kt
Kotlin приведен ниже.
package com.journaldev.androidlysharedpreferences
import android.content.Context
import android.content.SharedPreferences
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.preference.PreferenceManager
import android.view.View
import com.journaldev.androidlysharedpreferences.PreferenceHelper.defaultPreference
import com.journaldev.androidlysharedpreferences.PreferenceHelper.password
import com.journaldev.androidlysharedpreferences.PreferenceHelper.userId
import com.journaldev.androidlysharedpreferences.PreferenceHelper.clearValues
import com.journaldev.androidlysharedpreferences.PreferenceHelper.customPreference
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity(), View.OnClickListener {
val CUSTOM_PREF_NAME = "User_data"
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
btnSave.setOnClickListener(this)
btnClear.setOnClickListener(this)
btnShow.setOnClickListener(this)
btnShowDefault.setOnClickListener(this)
}
override fun onClick(v: View?) {
val prefs = customPreference(this, CUSTOM_PREF_NAME)
when (v?.id) {
R.id.btnSave -> {
prefs.password = inPassword.text.toString()
prefs.userId = inUserId.text.toString().toInt()
}
R.id.btnClear -> {
prefs.clearValues
}
R.id.btnShow -> {
inUserId.setText(prefs.userId.toString())
inPassword.setText(prefs.password)
}
R.id.btnShowDefault -> {
val defaultPrefs = defaultPreference(this)
inUserId.setText(defaultPrefs.userId.toString())
inPassword.setText(defaultPrefs.password)
}
}
}
}
object PreferenceHelper {
val USER_ID = "USER_ID"
val USER_PASSWORD = "PASSWORD"
fun defaultPreference(context: Context): SharedPreferences = PreferenceManager.getDefaultSharedPreferences(context)
fun customPreference(context: Context, name: String): SharedPreferences = context.getSharedPreferences(name, Context.MODE_PRIVATE)
inline fun SharedPreferences.editMe(operation: (SharedPreferences.Editor) -> Unit) {
val editMe = edit()
operation(editMe)
editMe.apply()
}
var SharedPreferences.userId
get() = getInt(USER_ID, 0)
set(value) {
editMe {
it.putInt(USER_ID, value)
}
}
var SharedPreferences.password
get() = getString(USER_PASSWORD, "")
set(value) {
editMe {
it.putString(USER_PASSWORD, value)
}
}
var SharedPreferences.clearValues
get() = { }
set(value) {
editMe {
it.clear()
}
}
}
Благодаря Kotlin Android Extensions нам не нужно использовать findViewById для каждого представления XML. В приведенном выше коде мы создаем одноэлементный класс, используя ключевое слово object
. Мы объявляем встроенную функцию высшего порядка с именем editMe(), которая содержит логику операции редактирования. Мы создали отдельные свойства для каждого из значений. Мы используем свойства Kotlin get и set для получения и установки данных в общих настройках. Kotlin уменьшил количество слов в коде, и теперь он выглядит намного чище. Кроме того, мы можем сделать его более кратким, используя другую функцию более высокого порядка Kotlin, показанную ниже.
fun SharedPreferences.Editor.put(pair: Pair<String, Any>) {
val key = pair.first
val value = pair.second
when(value) {
is String -> putString(key, value)
is Int -> putInt(key, value)
is Boolean -> putBoolean(key, value)
is Long -> putLong(key, value)
is Float -> putFloat(key, value)
else -> error("Only primitive types can be stored in SharedPreferences")
}
И мы делаем следующее при установке значений:
var SharedPreferences.password
get() = getString(USER_PASSWORD, "")
set(value) {
editMe {
it.put(USER_PASSWORD to value)
}
}
Вы можете скачать исходный код по следующей ссылке: AndroidlySharedPreferences