美文网首页Android实用技术
你还在用Java写Android吗? Kotlin扩展函数干货

你还在用Java写Android吗? Kotlin扩展函数干货

作者: Jlanglang | 来源:发表于2020-08-23 21:20 被阅读0次

    前言

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

    相关文章

      网友评论

        本文标题:你还在用Java写Android吗? Kotlin扩展函数干货

        本文链接:https://www.haomeiwen.com/subject/exywjktx.html