你还在用Java写Android吗? Kotlin扩展函数干货
2020-08-23 本文已影响0人
Jlanglang
前言
同标题,你还在用Java写Android吗?
从我的圈子了解,虽然kotlin已经作为Android的官方语言.
但多数人依然是使用的Java来写android.真正用kolint的并不多.
但多数还是以java的方式在写kotlin.
本文分享关于扩展函数的一些实战用例和心得.让你爽起来.
本文部分将付费阅读,当有200
个赞时,我会取消付费阅读(小心心点起来)
首先简单介绍下扩展函数:
你可以在某个kotlin类中写如下方法:
fun TextView.getTextString():String {
//这个代码块里,直接是TextView的作用域,所以可以直接调用getText()方法.
return text.toString()
}
然后可以在所有kotlin类中调用:
fun test(){
tv_title.getTextString()
}
直接使用TextView的实例就能调用,
这就是扩展函数的魅力,它可以让你不使用继承,实现等方式,就实现给某一个类附加一个新的功能.
个人感受:
使用扩展函数,可以省去大量的工具类
,工厂类
等
再也不用记各种各样的工具类的名字和方法了
好了.下面是实战代码:
1. dp转px.
val Float.dp: Float
get() = android.util.TypedValue.applyDimension(
android.util.TypedValue.COMPLEX_UNIT_DIP, this, Resources.getSystem().displayMetrics)
val Int.dp: Int
get() = android.util.TypedValue.applyDimension(
android.util.TypedValue.COMPLEX_UNIT_DIP, this.toFloat(), Resources.getSystem().displayMetrics).toInt()
val Int.toDp: Int
get() {
val scale = App.app?.resources?.displayMetrics?.density ?: 1F
return (this.toFloat() / scale + 0.5f).toInt()
}
val Float.sp: Float
get() = android.util.TypedValue.applyDimension(
android.util.TypedValue.COMPLEX_UNIT_SP, this, Resources.getSystem().displayMetrics)
val Int.sp: Int
get() = android.util.TypedValue.applyDimension(
android.util.TypedValue.COMPLEX_UNIT_SP, this.toFloat(), Resources.getSystem().displayMetrics).toInt()
kotlin调用:
fun test(){
10.dp;
10f.dp;
10.sp;
10f.sp
}
如果是Java:
DPUtils.dpTopx(10);
没错吧?
有了扩展函数,你就可以直接10.dp拿到你需要的Px了.
2.SharedPreferences
fun <A> Context.putSp(name: String, value: A) = run {
getSharedPreferences("你自定义的key", 0).edit().apply {
when (value) {//if语句 现在在kotlin中是表达式
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 -> {
}
}
}.apply()
}
fun <U> Context.getSp(name: String, default: U): U {
getSharedPreferences("你自定义的key", 0).run {
val res = 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")
}
return res as U
}
}
Kotlin的用法:
在Activity中
putSp("key", value)//直接传入可保存的任何值
getSp("key", defaultValue)//第二个参数是默认值.你传入什么类型,就返回什么类型
在其他地方:
context.putSp("key", value)
context.getSp("key", defaultValue)
如果是Java:
SpUtils.putSp(context,"key",value);
Utils.putSp(context,"key",value);
是不是需要去记各种Utils类?
3 关于取消RxJava回调问题
说到RxJava,最令人头疼的往往是它的生命周期取消回调.
目前github已经有很多的框架解决这个问题的了,
但实际如果使用扩展函数来做,是很简单的.