没事会记录下开发的奇淫巧技,每个tips前都会标明开发语言,有更多更好的奇淫巧技可以发评论或者私聊,可以添加进来
1.Kotlin:View调用此方法传入url加载网络图片,如果是ImageView则加载前景,否则加载背景
/**
* View调用此方法传入url加载网络图片,如果是ImageView则加载前景,否则加载背景
*/
fun View.loadUrl(url: String, isCenter: Boolean = false, isYuan: Boolean = false, errorImgId: Int = 0) {
val g = Glide.with(this.context)
.load(url)
if (isCenter)
g.centerCrop()
if (isYuan)
g.transform(GlideCircleTransform(this.context))
if (errorImgId != 0)
g.error(errorImgId)
g.dontAnimate()
if (this is ImageView) {
g.into(this)
} else {
g.into(object : ViewTarget<View, GlideDrawable>(this) {
override fun onResourceReady(resource: GlideDrawable,
glideAnimation: GlideAnimation<in GlideDrawable>) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN)
this.view.background = resource.current
else
this.view.setBackgroundDrawable(resource.current)
}
})
}
}
fun View.loadId(id: Int, isCenter: Boolean = false, isYuan: Boolean = false) {
val g = Glide.with(this.context)
.load(id)
if (isCenter)
g.centerCrop()
if (isYuan)
g.transform(GlideCircleTransform(this.context))
g.dontAnimate()
if (this is ImageView) {
g.into(this)
} else {
g.into(object : ViewTarget<View, GlideDrawable>(this) {
override fun onResourceReady(resource: GlideDrawable,
glideAnimation: GlideAnimation<in GlideDrawable>) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN)
this.view.background = resource.current
else
this.view.setBackgroundDrawable(resource.current)
}
})
}
}
使用:
View.loadUrl("www.xxx.jpg")
2.Kotlin:检查值输入值是否为空(比如检查登陆页面的所有数据是否已填)
/**
* 检查值输入值是否为空
*/
fun TextView.checkEmpty(msg: String, nextTV: TextView?= this): TextView? {
return if (TextUtils.isEmpty(this.text)) ToastUtil.showToast2(msg) else return nextTV
}
public static TextView showToast2(String text) {//java:调用一个弹toast的类,并返回一个null的TextView
showToast(text);
return null;
}
使用:
if (tvName.checkEmpty("请选择产品", tvPerson)
?.checkEmpty("请选择客户", etMoney)
?.checkEmpty("请输入金额") != null) {
//表示全部验证通过,不通过会走else
}
3.Kotlin:如果RecyclerView只有一种条目,可以使用该方法简化代码
abstract class BaseAdapterOneType<T>(var context: Context, var list: ArrayList<T>?, var itemLayoutId: Int) : RecyclerView.Adapter<BaseLtViewHolder>() {
abstract fun setData(v: View, b: T, i: Int)
override fun onBindViewHolder(holder: BaseLtViewHolder?, position: Int) {
setData(holder!!.itemView, list!![position], position)
}
override fun getItemCount() = ListUtil.getSize(list)
override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int) = BaseLtViewHolder(parent?.autoInflate(itemLayoutId)!!)//autoInflate()是一个自定义的Inflate方法
}
class BaseLtViewHolder(view: View) : RecyclerView.ViewHolder(view)
使用:实现该抽象类,并在父类的最后一个参数传入条目的布局
class MAdapter1(context: Context, list: ArrayList<ClassInfoBean.LzBean>?) : BaseAdapterOneType<ClassInfoBean.LzBean>(context, list, R.layout.item_class_xlw) {
override fun setData(v: View, b: ClassInfoBean.LzBean, i: Int) {//可以在该方法内实现绑定数据,可以大大简化代码和开发时间
v.ivBack.loadUrl(b.img_url, true, errorImgId = R.drawable.img)
v.tv.text = b.name
v.setOnClickListener {
}
}
}
4.Kotlin:防止重复点击(有的人可能会手抖连点两次,造成奇怪的bug)
fun View.click(time: Int = 500, click: () -> Unit) {
this.setOnClickListener {
val mTime = this.tag
if (mTime == null) {//直接可以执行
this.tag = System.currentTimeMillis()
click()
return@setOnClickListener
}
if (mTime is Long) {//判断时间后可以执行
val thisTime = System.currentTimeMillis()
if (thisTime - mTime > time) {
click()
}//否则就是在时间间隔内
this.tag = thisTime
}
}
}
使用:就像正常的监听
tv_title.click { }
5.Kotlin:快捷获取资源文件
/**
* strings.xml的id转换为String值
*/
fun Int.toText(): String = App.getInstance().resources.getString(this)
/**
* colors.xml中的id转化为color色值
*/
fun Int.toColor(): Int = App.getInstance().resources.getColor(this)
/**
* dimens.xml中的id转化为px值
*/
fun Int.toDimen(): Float = App.getInstance().resources.getDimension(this)
使用:
tv_title.text = R.string.no_data.toText()
对Kotlin或KMP感兴趣的同学可以进Q群 101786950
如果这篇文章对您有帮助的话
可以扫码请我喝瓶饮料或咖啡(如果对什么比较感兴趣可以在备注里写出来)