Android日常开发Tips记录

kotlin

DCL单例


class DiskCache private constructor() : BitmapCache {
    companion object {

        @Volatile
        private var instance: DiskCache? = null

        fun getInstance() = instance ?: synchronized(this) {
            instance ?: DiskCache().also {
                instance = it
            }
        }
    }


}

?:等价于if(instance == null ){}.alsokotlin语法糖,里面的it指当前对象(即DiskCache().)

使用ktx优化获取属性值

通常自定义View的时候,通过获取TypeArray获取属性,代码如下

   val a = getContext().obtainStyledAttributes(attrs, R.styleable.CutoutTextView, 0, 0)

        if (a.hasValue(R.styleable.CutoutTextView_android_fontFamily)) {

            try {
                val font =
                    ResourcesCompat.getFont(
                        getContext(),
                        a.getResourceId(R.styleable.CutoutTextView_android_fontFamily, 0)
                    )
                if (font != null) {
                    textPaint.typeface = font
                }
            } catch (nfe: Resources.NotFoundException) {

            }
        }

        if (a.hasValue(R.styleable.CutoutTextView_foregroundColor)) {
            foregroundColor = a.getColor(R.styleable.CutoutTextView_foregroundColor, foregroundColor)
        }

        text = if (a.hasValue(R.styleable.CutoutTextView_android_text)) {
            a.getString(R.styleable.CutoutTextView_android_text)
        } else {
            ""
        }
    a.recycle()

上面的代码可以通过ktx简便成如下

    init {
        context.withStyledAttributes(attrs, R.styleable.CutoutTextView) {
            if (hasValue(R.styleable.CutoutTextView_android_fontFamily)) {

                try {
                    val font =
                        ResourcesCompat.getFont(
                            getContext(),
                            getResourceId(R.styleable.CutoutTextView_android_fontFamily, 0)
                        )
                    if (font != null) {
                        textPaint.typeface = font
                    }
                } catch (nfe: Resources.NotFoundException) {

                }
            }

            if (hasValue(R.styleable.CutoutTextView_foregroundColor)) {
                foregroundColor = getColor(R.styleable.CutoutTextView_foregroundColor, foregroundColor)
            }

            text = if (hasValue(R.styleable.CutoutTextView_android_text)) {
                getString(R.styleable.CutoutTextView_android_text)
            } else {
                ""
            }
        }

从源码中,可以看到withStyledAttributescontext的扩展函数,并且在里面已经执行了recycle方法。

 fun Context.withStyledAttributes(
    set: AttributeSet? = null,
    attrs: IntArray,
    @AttrRes defStyleAttr: Int = 0,
    @StyleRes defStyleRes: Int = 0,
    block: TypedArray.() -> Unit
) {
    obtainStyledAttributes(set, attrs, defStyleAttr, defStyleRes).apply(block).recycle()
}

当kotlin遇上方法参数

adapter方法中需要一个输入为StringInt,返回值为Void的方法。

    private fun adapter(listener: (String, Int) -> Unit) {
        listener("Rc", 12)
    }

在调用的时候,可以巧用kotlin语法糖

     adapter { username, age ->
            Log.e("listener", "$username:$age")
        }

style

通过主题定义Button按钮样式

参考:Android 5.0以上系统常用控件着色指南

给ImageView添加点击状态

    

ImageView设置android:clickable="true"android:foreground="?attr/selectableItemBackground"属性。

SVN

取消SVN Add操作

svn revert --recursive build

依赖加载过慢

  repositories {
        maven{ url 'http://maven.aliyun.com/nexus/content/groups/public/'}
        google()
        jcenter()
    }

allprojects {
    repositories {
        maven{ url 'http://maven.aliyun.com/nexus/content/groups/public/'}
        google()
        jcenter()
    }
}

你可能感兴趣的:(Android日常开发Tips记录)