本片文章主要说的是主要是用属性代理的方法实现对Preferences的分装:
多余的不多说,直接上代码:
1、第一步首先对外部提供全局上下文,方便引用
/**
* Application 基类
*/
private lateinit var INAPPLICATION: Application
//外部全局调用
object AppContext : ContextWrapper(INAPPLICATION)
open class BaseApplication : Application() {
lateinit var appComponent: AppComponent
override fun onCreate() {
super.onCreate()
INAPPLICATION = this
}
}
2、关键的实现全在这里了
/**
* Created by Evlis on 2019/7/17.
* Preferences 扩展 -属性代理
* @param name 传入的键
* @param default 默认值
* @param flieName 文件名当前默认default
*/
class Preference<T>(val key:String, val default: T, val flieName : String = "default") :ReadWriteProperty<Any?,T>{
//初始化
private val prefs by lazy {
AppContext.getSharedPreferences(flieName,Context.MODE_PRIVATE)
}
//获取当前值
override fun getValue(thisRef: Any?, property: KProperty<*>): T {
return getPrrefs(key)
}
/**
* 获取当前值
* @param 键
*/
private fun getPrrefs(key: String):T{
return when(default){
is String -> prefs.getString(key,default)
is Boolean -> prefs.getBoolean(key,default)
is Int -> prefs.getInt(key,default)
is Long -> prefs.getLong(key,default)
else -> throw IllegalArgumentException("不支持的类型")
} as T
}
//设置当前值
@RequiresApi(Build.VERSION_CODES.GINGERBREAD)
override fun setValue(thisRef: Any?, property: KProperty<*>, value: T) {
putPrefs(key,value)
}
/**
* 设置当前当前键所对应的值
* @param key 键
* @param value 值
*/
private fun putPrefs(key:String, value:T){
with(prefs.edit()){
when(value){
is String -> putString(key,value)
is Boolean -> putBoolean(key,value)
is Float -> putFloat(key,value)
is Int -> putInt(key,value)
is Long -> putLong(key,value)
else -> throw IllegalArgumentException("不支持的类型")
}.apply()
}
}
}
3、方便调用向外部提供形如变量的方式
/**
* Created by Evlis on 2019/7/17.
* 存取调取
*/
object PreferencesUtils {
var _phone: String by Preference(PreStatic.PHONE, PreStatic.DEFAULT)
var _password: String by Preference(PreStatic.PASSW, PreStatic.DEFAULT)
}
/**
* 静态量存储
*/
class PreStatic private constructor(val value: String) {
companion object {
val DEFAULT: String = ""
//账号
@JvmField
val PHONE: String = "phone"
//密码
@JvmField
val PASSW: String = "password"
}
}
4、具体调用看下面
/**
* 具体使用
*/
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
showContent()
bt_save.setOnClickListener {
//存数据
PreferencesUtils._phone = et_name.text.toString()
PreferencesUtils._password = et_name.text.toString()
showContent()
}
}
/**
* 显示内容
*/
private fun showContent() {
//取数据
show_content_name.text = "账号:"+ PreferencesUtils._phone
show_content_pass.text = "密码:"+ PreferencesUtils._password
et_name.hint = PreferencesUtils._phone
et_pass.hint = PreferencesUtils._password
}
}
5、项目地址:[https://github.com/ElvisBin/KtPreference]