使用Kotlin的Android SharedPreferences
在本教程中,我们将学习如何使用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) } }