使用Kotlin的Android SharedPreferences

时间:2020-02-23 14:29:16  来源:igfitidea点击:

在本教程中,我们将学习如何使用Kotlin在Android应用程序中实现SharedPreferences。

什么是Android SharedPreferences?

自API级别1开始,SharedPreferences就成为Android API的一部分。
它是一个接口,可让我们在本地存储/修改/删除数据。

通常,它用于缓存用户本地数据,例如登录表单。
数据以键值对的形式存储。

您可以创建多个文件来保存SharedPreferences数据。

共享首选项方法

让我们看一下SharedPreferences的一些重要方法。

  • getSharedPreferences(String,int)方法用于检索SharedPreferences的实例。

这里的String是SharedPreferences文件的名称,而int是传递的上下文。

  • " SharedPreferences.Editor()"用于编辑" SharedPreferences"中的值。

  • 我们可以调用commit()或者apply()将值保存在SharedPreferences文件中。
    commit()立即保存值,而apply()异步保存值。

使用Kotlin的SharedPreferences设置/检索值

我们可以通过以下方式使用Kotlin在SharedPreference实例上设置值。

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)

SharedPreference实例上允许的类型为:

Kotlin代码清除和删除SharedPreferences记录

我们还可以通过调用clear()和remove(String key)方法来清除所有值或者删除特定值。

editor.clear()
editor.remove("username")

注意:不考虑在提交或者应用后对编辑器所做的更改。

从SharedPreference保存和检索值的上述方法与我们在Java中几乎相同。

那么Kotlin的魔力其中?

这就是我们接下来通过示例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.theitroad.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.theitroad.androidlysharedpreferences.PreferenceHelper.defaultPreference
import com.theitroad.androidlysharedpreferences.PreferenceHelper.password
import com.theitroad.androidlysharedpreferences.PreferenceHelper.userId
import com.theitroad.androidlysharedpreferences.PreferenceHelper.clearValues
import com.theitroad.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扩展,我们不必为每个XML视图使用findViewById。

在上面的代码中,我们使用object关键字创建一个单例类。

我们正在声明一个名为editMe()的内联高阶函数,该函数具有编辑操作的逻辑。

我们为每个值创建了单独的属性。
我们正在使用get和set Kotlin属性来检索和设置共享首选项中的数据。

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)
          }
      }