在Android开发中,Kotlin语言为我们带来了更简洁、安全且表达力强的编程体验。本文将分享一些在实际开发中高频使用的Kotlin技巧和模式,帮助您编写更高质量的Android代码。
1. 空安全与类型处理
安全调用与Elvis操作符
kotlin
复制
// 安全解包可空类型
val length: Int = text?.length ?: 0
// 链式安全调用
val streetName = user?.address?.street?.name ?: "未知街道"
// 配合let作用域函数
user?.let {
updateUI(it.name, it.email)
}
类型转换与检查
kotlin
复制
// 安全类型转换
(view as? TextView)?.text = "Hello"
// 智能类型推断
when (view) {
is TextView -> view.text = "文本视图"
is Button -> view.setOnClickListener { }
is ImageView -> view.setImageResource(R.drawable.icon)
}
2. 扩展函数:增强Android组件
View扩展
kotlin
复制
// 显示/隐藏视图
fun View.show() { visibility = View.VISIBLE }
fun View.hide() { visibility = View.GONE }
fun View.invisible() { visibility = View.INVISIBLE }
// 防抖点击监听器
fun View.setOnSingleClickListener(delay: Long = 500, listener: (View) -> Unit) {
setOnClickListener {
isClickable = false
listener(it)
postDelayed({ isClickable = true }, delay)
}
}
// 使用示例
binding.button.setOnSingleClickListener {
showToast("按钮被点击")
}
Context扩展
kotlin
复制
// 简化Toast显示
fun Context.toast(message: String, duration: Int = Toast.LENGTH_SHORT) {
Toast.makeText(this, message, duration).show()
}
// 简化颜色获取
fun Context.getColorCompat(@ColorRes colorRes: Int): Int {
return ContextCompat.getColor(this, colorRes)
}
// 使用示例
context.toast("操作成功")
val color = context.getColorCompat(R.color.primary)
3. 集合操作与函数式编程
集合处理
kotlin
复制
// 数据转换和过滤
val activeUsers = userList
.filter { it.isActive }
.map { it.toDisplayUser() }
.sortedBy { it.name }
// 分组操作
val usersByDepartment = userList.groupBy { it.department }
// 查找操作
val firstAdmin = userList.firstOrNull { it.role == Role.ADMIN }
作用域函数选择指南
根据需求选择合适的作用域函数:
|
函数 |
主要用途 |
返回值 |
适用场景 |
|---|---|---|---|
|
|
非空处理/转换 |
Lambda结果 |
空检查、数据转换 |
|
|
附加操作 |
接收者对象 |
日志记录、调试 |
|
|
对象配置 |
接收者对象 |
View初始化、Builder模式 |
|
|
对象操作+结果 |
Lambda结果 |
需要计算返回值的配置 |
|
|
对象操作 |
Lambda结果 |
对已知非空对象的操作 |
kotlin
复制
// 典型使用场景
user?.let { nonNullUser -> // 空安全处理
updateUserProfile(nonNullUser)
}
TextView(context).apply { // 对象配置
text = "Hello"
textSize = 16f
setTextColor(Color.BLACK)
}.also { view -> // 附加操作
logd("TextView创建完成: $view")
}
4. 资源管理与封装
SharedPreferences封装
kotlin
复制
// 使用委托属性简化SharedPreferences访问
class AppPreferences(context: Context) {
private val prefs = context.getSharedPreferences("app_prefs", Context.MODE_PRIVATE)
var username by StringPreference(prefs, "username", "")
var isLoggedIn by BooleanPreference(prefs, "is_logged_in", false)
var lastLoginTime by LongPreference(prefs, "last_login", 0L)
}
// 自定义委托
class StringPreference(
private val prefs: SharedPreferences,
private val key: String,
private val defaultValue: String
) : ReadWriteProperty<Any, String> {
override fun getValue(thisRef: Any, property: KProperty<*>): String {
return prefs.getString(key, defaultValue) ?: defaultValue
}
override fun setValue(thisRef: Any, property: KProperty<*>, value: String) {
prefs.edit().putString(key, value).apply()
}
}
简化Intent传递
kotlin
复制
// Intent扩展函数
inline fun <reified T : Activity> Context.startActivity(
vararg pairs: Pair<String, Any?>
) {
val intent = Intent(this, T::class.java).apply {
pairs.forEach { (key, value) ->
when (value) {
is String -> putExtra(key, value)
is Int -> putExtra(key, value)
is Boolean -> putExtra(key, value)
is Serializable -> putExtra(key, value)
is Parcelable -> putExtra(key, value)
}
}
}
startActivity(intent)
}
// 使用示例
startActivity<DetailActivity>(
"item_id" to item.id,
"item_name" to item.name,
"is_editable" to true
)
5. 协程在Android中的实践
ViewModel中的异步处理
kotlin
复制
class UserViewModel : ViewModel() {
private val _userState = MutableStateFlow<UserState>(UserState.Loading)
val userState: StateFlow<UserState> = _userState
fun loadUser(userId: String) {
viewModelScope.launch {
_userState.value = UserState.Loading
try {
val user = withContext(Dispatchers.IO) {
userRepository.getUser(userId)
}
_userState.value = UserState.Success(user)
} catch (e: Exception) {
_userState.value = UserState.Error(e.message)
}
}
}
}
// 状态封装
sealed class UserState {
object Loading : UserState()
data class Success(val user: User) : UserState()
data class Error(val message: String?) : UserState()
}
结合Lifecycle的安全协程
kotlin
复制
// Activity/Fragment中的使用
class UserActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 自动取消的协程
lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.STARTED) {
viewModel.userState.collect { state ->
when (state) {
is UserState.Loading -> showLoading()
is UserState.Success -> showUser(state.user)
is UserState.Error -> showError(state.message)
}
}
}
}
}
}
6. 实用的工具函数
智能日志工具
kotlin
复制
inline fun <reified T> T.logd(message: String) {
if (BuildConfig.DEBUG) {
Log.d(T::class.java.simpleName, message)
}
}
inline fun <reified T> T.loge(message: String, exception: Exception? = null) {
Log.e(T::class.java.simpleName, message, exception)
}
// 使用示例
class UserRepository {
fun fetchUser() {
logd("开始获取用户数据")
// ...
}
}
时间处理扩展
kotlin
复制
// 时间格式化
fun Long.toFormattedDate(pattern: String = "yyyy-MM-dd HH:mm"): String {
return SimpleDateFormat(pattern, Locale.getDefault())
.format(Date(this))
}
// 时间差计算
fun Long.timeAgo(): String {
val diff = System.currentTimeMillis() - this
return when {
diff < 60 * 1000 -> "刚刚"
diff < 60 * 60 * 1000 -> "${diff / (60 * 1000)}分钟前"
diff < 24 * 60 * 60 * 1000 -> "${diff / (60 * 60 * 1000)}小时前"
else -> toFormattedDate("MM月dd日")
}
}
// 使用示例
val timestamp = System.currentTimeMillis()
textView.text = timestamp.timeAgo()
7. 构建器模式与DSL
简化AlertDialog创建
kotlin
复制
fun Context.alertDialog(
title: String? = null,
message: String? = null,
init: AlertDialog.Builder.() -> Unit
): AlertDialog {
return AlertDialog.Builder(this)
.apply { title?.let { setTitle(it) } }
.apply { message?.let { setMessage(it) } }
.apply(init)
.create()
}
// 使用示例
alertDialog(
title = "确认删除",
message = "确定要删除这个项目吗?"
) {
setPositiveButton("删除") { dialog, _ ->
deleteItem()
dialog.dismiss()
}
setNegativeButton("取消", null)
setCancelable(true)
}.show()
1424

被折叠的 条评论
为什么被折叠?



