轉載請標明出處:https://blog.csdn.net/zhaoyanjun6/article/details/94640013
本文出自【趙彥軍的博客】
擴展函數是Kotlin提供的非常酷的特性,在編寫Android應用程序時,你將發現自己會大量使用它。
我們必須承認Android框架有時做些事有點困難,在Java中我們唯一的解決方案是把我們要做事封裝起來,或利用可讀性差的類靜態方法。
你想怎樣才能加額外函數到框架類?這就是Kotlin擴展函數允許我們做的。
在Android中我們要顯示和隱藏一個 view ,通常這樣做:
class MainActivity : AppCompatActivity() {
private var tv: TextView? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
tv = findViewById(R.id.tv)
tv?.visibility = View.VISIBLE //view顯示
tv?.visibility = View.GONE //view隱藏
}
}
那麼用擴展函數怎麼做,我們首先對 View擴展兩個方法
//擴展函數,view隱藏
fun View.gone() {
visibility = View.GONE
}
//擴展函數,view顯示
fun View.visible() {
visibility = View.VISIBLE
}
使用:
class MainActivity : AppCompatActivity() {
private var tv: TextView? = null
//擴展函數,view隱藏
fun View.gone() {
visibility = View.GONE
}
//擴展函數,view顯示
fun View.visible() {
visibility = View.VISIBLE
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
tv = findViewById(R.id.tv)
tv?.visible() //view顯示
tv?.gone() //view隱藏
}
}
一些常用的擴展函數
我們對一些可能會用到的擴展函數做了一個整理:
ViewExtends.kt
對 View 的擴展
import android.view.View
fun View.gone() {
visibility = View.GONE
}
fun View.visible() {
visibility = View.VISIBLE
}
var View.topMargin: Int
get():Int {
return (layoutParams as ViewGroup.MarginLayoutParams).topMargin
}
set(value) {
(layoutParams as ViewGroup.MarginLayoutParams).topMargin = value
}
var View.bottomMargin: Int
get():Int {
return (layoutParams as ViewGroup.MarginLayoutParams).bottomMargin
}
set(value) {
(layoutParams as ViewGroup.MarginLayoutParams).bottomMargin = value
}
var View.rightMargin: Int
get():Int {
return (layoutParams as ViewGroup.MarginLayoutParams).rightMargin
}
set(value) {
(layoutParams as ViewGroup.MarginLayoutParams).rightMargin = value
}
var View.leftMargin: Int
get():Int {
return (layoutParams as ViewGroup.MarginLayoutParams).leftMargin
}
set(value) {
(layoutParams as ViewGroup.MarginLayoutParams).leftMargin = value
}
TextViewExtends.kt
對 TextView 的擴展
import android.widget.TextView
/**
* 設置顏色直接使用colors.xml中定義的顏色即可
*/
fun TextView.setColor(resId: Int) {
this.setTextColor(resources.getColor(resId))
}
fun TextView.setDrawableLeft(resId: Int) {
var drawable = this.context.resources.getDrawable(resId)
drawable.setBounds(0, 0, drawable.minimumWidth, drawable.minimumHeight)
this.setCompoundDrawables(drawable, null, null, null)
}
fun TextView.setDrawableRight(resId: Int) {
var drawable = this.context.resources.getDrawable(resId)
drawable.setBounds(0, 0, drawable.minimumWidth, drawable.minimumHeight)
this.setCompoundDrawables(null, null, drawable, null)
}
fun TextView.setDrawableTop(resId: Int) {
var drawable = this.context.resources.getDrawable(resId)
drawable.setBounds(0, 0, drawable.minimumWidth, drawable.minimumHeight)
this.setCompoundDrawables(null, drawable, null, null)
}
fun TextView.setDrawableBottom(resId: Int) {
var drawable = this.context.resources.getDrawable(resId)
drawable.setBounds(0, 0, drawable.minimumWidth, drawable.minimumHeight)
this.setCompoundDrawables(null, null, null, drawable)
}
ContextExtends.kt
對Context的擴展
import android.content.Context
import android.view.Gravity
import android.widget.Toast
//----------toast----------
fun Context.toast(text: CharSequence, duration: Int = Toast.LENGTH_SHORT) {
Toast.makeText(this, text, duration).show()
}
fun Context.toast(resId: Int, duration: Int = Toast.LENGTH_SHORT) {
Toast.makeText(this, resId, duration).show()
}
fun Context.centerToast(resId: Int, duration: Int = Toast.LENGTH_SHORT) {
var t = Toast.makeText(this, resId, duration)
t.setGravity(Gravity.CENTER, 0, 0)
t.show()
}
//----------尺寸轉換----------
fun Context.dp2px(dpValue: Float): Int {
val scale = resources.displayMetrics.density
return (dpValue * scale + 0.5f).toInt()
}
fun Context.px2dp(pxValue: Float): Int {
val scale = resources.displayMetrics.density
return (pxValue / scale + 0.5f).toInt()
}
fun Context.sp2px(spValue: Float): Int {
val scale = resources.displayMetrics.scaledDensity
return (spValue * scale + 0.5f).toInt()
}
fun Context.px2sp(pxValue: Float): Int {
val scale = resources.displayMetrics.scaledDensity
return (pxValue / scale + 0.5f).toInt()
}
總結
我在github 上找了一個常用的擴展庫,大家可以看看,非常有用。https://github.com/shiweibsw/Android-kotlin-extend-utils
個人微信號:zhaoyanjun125 , 歡迎關注