Kotlin的强悍震撼了我,android中每个应用都会用到SharedPreference在Kotlin中使用竟是如此简单!

package com.android.extkt

import android.content.Context
import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty /**
* Preference
*
* @author 祁连山™
* @date 2016-12-09
* @version 1.0
*/ class Preference<T>(val context: Context, val name: String, val default: T) : ReadWriteProperty<Any?, T> { val prefs by lazy { context.getSharedPreferences("default", Context.MODE_PRIVATE) } override fun getValue(thisRef: Any?, property: KProperty<*>): T {
return findPreference(name, default)
} override fun setValue(thisRef: Any?, property: KProperty<*>, value: T) {
putPreference(name, value)
} private fun <U> findPreference(name: String, default: U): U = with(prefs) {
val res: Any = when (default) {
is Long -> getLong(name, default)
is String -> getString(name, default)
is Int -> getInt(name, default)
is Boolean -> getBoolean(name, default)
is Float -> getFloat(name, default)
else -> throw IllegalArgumentException("This type can not be saved")
}
res as U
} private fun <U> putPreference(name: String, value: U) = with(prefs.edit()) {
when (value) {
is Long -> putLong(name, value)
is String -> putString(name, value)
is Int -> putInt(name, value)
is Boolean -> putBoolean(name, value)
is Float -> putFloat(name, value)
else -> throw IllegalArgumentException("This type can not be saved")
}.apply()
}
}

使用时直接读取赋值,再也不用edit、commit,以我们最常用的引导页判断来说,如果是第一次进入应用跳转到GuideActivity,否则启动MainActivity,使用Kotlin码出来就是下面这个样子:

package com.android.kotlin

import android.content.Intent
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import com.android.extkt.Preference
import rx.Observable
import rx.android.schedulers.AndroidSchedulers
import rx.schedulers.Schedulers
import java.util.concurrent.TimeUnit class SplashActivity : AppCompatActivity() { private var first: Boolean by Preference(this, "first", true) override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_splash) val observable = Observable.timer(3000, TimeUnit.MILLISECONDS)
observable.observeOn(AndroidSchedulers.mainThread())
observable.subscribeOn(Schedulers.io())
observable.subscribe({ route() })
} override fun onBackPressed() {
return
} fun route(): Unit {
var intent = Intent()
if (first) {
intent.setClass(this, GuideActivity::class.java)
startActivity(intent)
// 可以在这里直接存储first的值
// first = false
this.finish()
return
}
intent.setClass(this, MainActivity::class.java)
startActivity(intent)
this.finish()
}
}

在Kotlin中,声明成员属性,除了直接赋值,还可以用 Delegate 的方式来声明,这个 Delegate 需要根据成员的类型(val 或者 var)来提供相应的 getValue 和 setValue 方法,比如一个可读写的 Delegate,需要提供下面的方法:

public interface ReadWriteProperty<in R, T> {

    public operator fun getValue(thisRef: R, property: KProperty<*>): T

    public operator fun setValue(thisRef: R, property: KProperty<*>, value: T)
}

-------------------------------------------------------------我是分隔线-------------------------------------------------------------

最近项目已经使用kt来完成,用到这里时,需要清除全部缓存数据,不好一个个赋值清除,Preference有clear()却没法用,这时就需要对Preference这个代理类进行改造,也没什么可多说的,只是因为上午改的时候写错了,发现没法使用,下午单独写个demo时才发现,分享出来。

package com.android.app

import android.content.Context
import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty /**
* Preference
*
* @author 祁连山
* @date 2016-12-09
* @version 1.0
*/ class Preference<T>(val context: Context) : ReadWriteProperty<Any?, T> { var key: String? = null
var value: T? = null constructor(context: Context, name: String, default: T) : this(context) {
key = name
value = default
} val prefs by lazy { context.getSharedPreferences("default", Context.MODE_PRIVATE) } override fun getValue(thisRef: Any?, property: KProperty<*>): T {
return findPreference(key!!, value!!)
} override fun setValue(thisRef: Any?, property: KProperty<*>, value: T) {
putPreference(key!!, value)
} fun delete(vararg key: String): Unit {
if (key.size == 0) {
prefs.edit().clear().commit()
return
}
for (i in 0..key.size) {
prefs.edit().remove(key[i]).commit()
}
} private fun <U> findPreference(name: String, default: U): U = with(prefs) {
val res: Any = when (default) {
is Long -> getLong(name, default)
is String -> getString(name, default)
is Int -> getInt(name, default)
is Boolean -> getBoolean(name, default)
is Float -> getFloat(name, default)
else -> throw IllegalArgumentException("The data can not be saved")
}
res as U
} private fun <U> putPreference(name: String, value: U) = with(prefs.edit()) {
when (value) {
is Long -> putLong(name, value)
is String -> putString(name, value)
is Int -> putInt(name, value)
is Boolean -> putBoolean(name, value)
is Float -> putFloat(name, value)
else -> throw IllegalArgumentException("The data can not be saved")
}.apply()
}
}

使用方法与原来无异,只是用到Preference对象时,用主构造方法来获取,代码如下:

...
var prefs = Preference(this)
prefs.delete()
...

代码出处:http://www.jcodecraeer.com
代码下载:https://pan.baidu.com/s/1eR4i4ca其他资料:http://blog.csdn.net/TIANLANG3/article/details/53926273

Kotlin偏好设置的更多相关文章

  1. iOS-数据持久化-偏好设置

    一.简单介绍 很多iOS应用都支持偏好设置,比如保存用户名.密码.字体大小等设置,iOS提供了一套标准的解决方案来为应用加入偏好设置功能 每个应用都有个NSUserDefaults实例,通过它来存取偏 ...

  2. 持久化存储——偏好设置,plist,归档---学习笔记二

    //一. 本地持久化 //1.沙盒 //1.1 应用程序包:存放的是应用程序的源文件,包括资源文件和可执行文件 NSString *path = [[NSBundle mainBundle]bundl ...

  3. iOS开发——UI进阶篇(十一)应用沙盒,归档,解档,偏好设置,plist存储,NSData,自定义对象归档解档

    1.iOS应用数据存储的常用方式XML属性列表(plist)归档Preference(偏好设置)NSKeyedArchiver归档(NSCoding)SQLite3 Core Data 2.应用沙盒每 ...

  4. iOS数据持久化文件读写之偏好设置

    很多iOS应用都支持偏好设置,比如保存用户名.密码.字体大小等设置,iOS提供了一套标准的解决方案来为应用加入偏好设置功能.每个应用都有个NSUserDefaults实例,通过它来存取偏好设置.比如, ...

  5. IOS第13天(2,私人通讯录,plist存储,偏好设置,归档)

    ***************plist存储 // 当点点击保存的时候调用 //保存 - (IBAction)save:(id)sender { // 获取沙盒的根路径 // NSString *ho ...

  6. iOS开发UI篇—ios应用数据存储方式(偏好设置)

    iOS开发UI篇—ios应用数据存储方式(偏好设置) 一.简单介绍 很多iOS应用都支持偏好设置,比如保存用户名.密码.字体大小等设置,iOS提供了一套标准的解决方案来为应用加入偏好设置功能 每个应用 ...

  7. iOS学习之应用数据存储1-属性列表、偏好设置、NSKeyedArchiver归档

    iOS应用数据存储的常用方式(持久化方式) 属性列表(plist)归档(XML文件) Preference(偏好设置) NSKeyedArchiver归档(NSCoding) SQLite3 Core ...

  8. Xcode6与Xcode5中沙盒的变动以及偏好设置目录的变动

    1.Xcode6模拟器路径与Xcode5模拟器路径对比: (1)Xcode5中模拟器路径为:/Users/用户名/Library/Application Support/iPhone Simulato ...

  9. iOS中偏好设置的创建,数据写入与读取

    NSUserDefaults与NSDictinary? 应用通过NSUserDefaults用键值对的方式来读取和保存偏好设置数据,与通过键从NSDictionary对象中获取数据一样,不同之处在于N ...

随机推荐

  1. 用redux完成事务清单

    今天再来一个例子,我们从组件开始. App.js import React, { PropTypes } from 'react' import { bindActionCreators } from ...

  2. 基于Winform的.cs文件命名空间排序及注释批量处理工具

    公司里每个程序员在命名空间的排序和注释上都有很多的不同. 杂乱的命名空间: using System; using System.Collections.Generic; using Autodesk ...

  3. Think PHP项目在阿里云的虚拟主机上部署

    购买完万网的虚拟主机后,今天终于把以前一个项目转成了PHP项目,我用的是TP框架,阿里的虚拟主机还是很方便上手的,在把数据库导入完后,用FTP把程序文件上传到服务器上,阿里的虚拟主机(Linux主机) ...

  4. QTableWidget详解(样式、右键菜单、表头塌陷、多选等) 2013-10-23 10:54:04

    一.设置表单样式 点击(此处)折叠或打开 table_widget->setColumnCount(4); //设置列数 table_widget->horizontalHeader()- ...

  5. Internet 信息服务承载说明

    若要运行由 Internet 信息服务 (IIS) 承载的示例,必须确保 IIS 已正确安装且正在运行. 在 Windows Server 2008 R2 上安装 IIS 7.5 版 在"服 ...

  6. MySQL Workbench返回所有的记录

    使用MySQL Workbench查询数据库,当返回的记录较多时,不能显示所有的记录,因为MySQL Workbench默认只返回1000条记录. 为了显示所有的记录,可以在查询语句后面加一句: LI ...

  7. EasyUI+MVC-搭建后台框架

    一.EasyUI简介: jQuery EasyUI是一组基于jQuery的UI插件集合体,而jQuery EasyUI的目标就是帮助web开发者更轻松的打造出功能丰富并且美观的UI界面. 官方网站:h ...

  8. nodejs操作mongodb数据库封装DB类

    这个DB类也算是我经历了3个实际项目应用的,现分享出来,有需要的请借鉴批评. 上面的注释都挺详细的,我使用到了nodejs的插件mongoose,用mongoose操作mongodb其实蛮方便的. 关 ...

  9. C#调用C和C++函数的一点区别

    最近做U800电话的二次开发,需要调用厂商的C函数库来打电话,后来想加入通话录音功能,但发现程序默认生产的WAV文件过大,又找了个WAV转MP3的C++函数库程序,出了点问题.下面是转MP3的程序接口 ...

  10. 把复杂json解析成javabean

    工具:fastjson1.2.9 用其他工具也行,比如json-lib.gson 用法都差不多 先来一段json { "page": { "pagenow": ...