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 ){}
,.also
为kotlin
语法糖,里面的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 {
""
}
}
从源码中,可以看到withStyledAttributes
是context
的扩展函数,并且在里面已经执行了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
方法中需要一个输入为String
和Int
,返回值为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()
}
}