Android实用技术

你还在用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已经有很多的框架解决这个问题的了,
但实际如果使用扩展函数来做,是很简单的.

上一篇下一篇

猜你喜欢

热点阅读