五分钟学习---kotlin在Android中的使用。
扩展函数:展示和影藏view。
fun View.show(){
this.visibility = View.VISIBLE
}
fun View.hide() {
this.visibility = View.INVISIBLE
}
fun View.remove(){
this.visibility = View.GONE
}
view.show()
view.hide()
view.remove()
扩展函数 : 校验数据。
//Extension function
fun String?.valid() : Boolean =
this != null && !this.equals("null", true)
&& this.trim().isNotEmpty()
// Usage at call site
if(data.valid())
内联函数获取数据。
// Activity related
inline fun <reified T : Any> Activity.getValue(
lable : String, defaultvalue : T? = null) = lazy{
val value = intent?.extras?.get(lable)
if (value is T) value else defaultvalue
}
inline fun <reified T : Any> Activity.getValueNonNull(
lable : String, defaultvalue : T? = null) = lazy{
val value = intent?.extras?.get(lable)
requireNotNull((if (value is T) value else defaultvalue)){lable}
}
// Fragment related
inline fun <reified T: Any> Fragment.getValue(lable: String, defaultvalue: T? = null) = lazy {
val value = arguments?.get(lable)
if (value is T) value else defaultvalue
}
inline fun <reified T: Any> Fragment.getValueNonNull(lable: String, defaultvalue: T? = null) = lazy {
val value = arguments?.get(lable)
requireNotNull(if (value is T) value else defaultvalue) { lable }
}
//使用
val firstName by getValue<String>("firstName") // String?
val lastName by getValueNonNull<String>("lastName") // String
//启动activity,使用 reified,通过添加类型传递简化泛型参数
inline fun <reified T : Activity> Activity.startActivity(context: Context) {
startActivity(Intent(context, T::class.java))
}
// Caller
startActivity<NewActivity>(context)
inline fun <reified T> Gson.fromJson(json: String) =
fromJson(json, T::class.java)
//使用
val user: User = Gson().fromJson(json)
拓展函数:优化获取资源。
//Extensions
fun Int.asColor() = ContextCompat.getColor(ApplicationCalss.instance, this)
fun Int.asDrawable() = ContextCompat.getDrawable(MavrikApplication.instance, this)
//Usage at call site
val color = R.color.dark_blie.asColor()
val drawable = R.drawable.launcher.asDrawable()
扩展函数:获取toast
// Toash extensions
fun Context.showShotToast(message : String){
Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
}
fun Context.showLongToast(message : String){
Toast.makeText(this, message, Toast.LENGTH_LONG).show()
}
// Snackbar Extensions
fun View.showShotSnackbar(message : String){
Snackbar.make(this, message, Snackbar.LENGTH_SHORT).show()
}
showShotToast(message)
showLongToast(message)
扩展函数:隐藏键盘
fun Activity.hideKeyboard(): Boolean {
val view = currentFocus
view?.let {
val inputMethodManager = getSystemService(Context.INPUT_METHOD_SERVICE)
as InputMethodManager
return inputMethodManager.hideSoftInputFromWindow(view.windowToken,
InputMethodManager.HIDE_NOT_ALWAYS)
}
return false
}
扩展函数:自动加载图片
fun ImageView.load(url: String) {
get(url).placeholder(R.drawable.shape_default_rec_bg)
.error(R.drawable.shape_default_rec_bg)
.into(this)
}
懒加载:延迟初始化一个对象
val gankApi: GankApi by lazy {
val retrofit: Retrofit = Retrofit.Builder()
.baseUrl(API_URL)
.addConverterFactory(MoshiConverterFactory.create())
.build()
retrofit.create(GankApi::class.java)
}
可空数据类型:默认kotlin是不可空的,但是可以在具体类型后面增加一个?来实现可空。
var a: String? = "test kotlin"
a = null //编译成功
!!: 将任何值转换为非空类型,若该值为空则抛出异常。
使用DSL