Android Kotlin 实用扩展函数(持续更新)

在 Android Kotlin 实际的开发过程中,使用扩展函数能够使代码更符合人类的阅读规律和思维习惯,这是提高开发效率的一个核心的点。

本文会列举 Android 开发常用的扩展函数(持续更新)


WindowExt:

Kotlin 复制代码
// 设置状态栏字体颜色(白色)
fun Window.statusBarTextColorWhite() {
    WindowCompat.getInsetsController(this, decorView).isAppearanceLightStatusBars = false
}

// 设置状态栏字体颜色(黑色)
fun Window.statusBarTextColorBlack() {
    WindowCompat.getInsetsController(this, decorView).isAppearanceLightStatusBars = true
}

// 设置导航栏图标颜色(白色)
fun Window.navigationBarIconWhite() {
    WindowCompat.getInsetsController(this, decorView).isAppearanceLightNavigationBars = false
}

// 设置导航栏图标颜色(黑色)
fun Window.navigationBarIconBlack() {
    WindowCompat.getInsetsController(this, decorView).isAppearanceLightNavigationBars = true
}

ViewExt:

Kotlin 复制代码
fun View.visible() {
    if (visibility != View.VISIBLE) visibility = View.VISIBLE
}

fun View.gone() {
    if (visibility != View.GONE) visibility = View.GONE
}

fun View.invisible() {
    if (visibility != View.INVISIBLE) visibility = View.INVISIBLE
}

fun View.setTranslationXExt(offset: Float) {
    if (translationX != offset) translationX = offset
}

fun View.setTranslationYExt(offset: Float) {
    if (translationY != offset) translationY = offset
}

fun View.setPaddingExt(left: Int = -1, top: Int = -1, right: Int = -1, bottom: Int = -1, horizontal: Int = -1, vertical: Int = -1) {
    if (left != -1) {
        if (left != paddingLeft) setPadding(left, paddingTop, paddingRight, paddingBottom)
    }
    if (top != -1) {
        if (top != paddingTop) setPadding(paddingLeft, top, paddingRight, paddingBottom)
    }
    if (right != -1) {
        if (right != paddingRight) setPadding(paddingLeft, paddingTop, right, paddingBottom)
    }
    if (bottom != -1) {
        if (bottom != paddingBottom) setPadding(paddingLeft, paddingTop, paddingRight, bottom)
    }
    if (horizontal != -1) {
        if (horizontal != paddingLeft) setPadding(horizontal, paddingTop, paddingRight, paddingBottom)
        if (horizontal != paddingRight) setPadding(paddingLeft, paddingTop, horizontal, paddingBottom)
    }
    if (vertical != -1) {
        if (vertical != paddingTop) setPadding(paddingLeft, vertical, paddingRight, paddingBottom)
        if (vertical != paddingBottom) setPadding(paddingLeft, paddingTop, paddingRight, vertical)
    }
}

RvExt:

Kotlin 复制代码
// RecyclerView 中所有的 item 是否都可见
fun RecyclerView.isAllItemsVisible(): Boolean {
    val layoutManager = layoutManager as? LinearLayoutManager ?: return false
    val totalItemCount = layoutManager.itemCount
    if (totalItemCount == 0) {
        return true
    }
    val firstVisibleItem = layoutManager.findFirstCompletelyVisibleItemPosition()
    val lastVisibleItem = layoutManager.findLastCompletelyVisibleItemPosition()
    return firstVisibleItem == 0 && lastVisibleItem == totalItemCount - 1
}

// RecyclerView 最后一个 item 是否可见
fun RecyclerView.isEndItemVisible(): Boolean {
    val lastVisiblePosition = (layoutManager as LinearLayoutManager).findLastCompletelyVisibleItemPosition()
    return lastVisiblePosition == adapter!!.itemCount - 1
}

// implementation "io.github.cymchad:BaseRecyclerViewAdapterHelper4:4.1.4"
fun <T : Any, VH : RecyclerView.ViewHolder> BaseQuickAdapter<T, VH>.setItemClickLisExt(operation: (T, View, Int) -> Unit) {
    setOnItemClickListener { adt, view, position ->
        val item = adt.getItem(position) ?: return@setOnItemClickListener
        operation.invoke(item, view, position)
    }
}

// implementation "io.github.cymchad:BaseRecyclerViewAdapterHelper4:4.1.4"
fun <T : Any, VH : RecyclerView.ViewHolder> BaseQuickAdapter<T, VH>.addItemChildClickLisExt(viewId: Int, operation: (T, View, Int) -> Unit) {
    addOnItemChildClickListener(viewId) { adt, view, position ->
        val item = adt.getItem(position) ?: return@addOnItemChildClickListener
        operation.invoke(item, view, position)
    }
}

// implementation "io.github.cymchad:BaseRecyclerViewAdapterHelper4:4.1.4"
fun <T : Any, VH : RecyclerView.ViewHolder> BaseQuickAdapter<T, VH>.addItemChildLongClickLisExt(viewId: Int, operation: (T, View, Int) -> Unit) {
    addOnItemChildLongClickListener(viewId) { adt, view, position ->
        val item = adt.getItem(position) ?: return@addOnItemChildLongClickListener true
        operation.invoke(item, view, position)
        true
    }
}

SystemUIExt:

Kotlin 复制代码
// 沉浸式后需要填充 状态栏高度 的 view
fun initStateBar(view: View) {
    val layoutParams = view.layoutParams
    layoutParams.height = statusBarHeightPx
    view.layoutParams = layoutParams
}

// 沉浸式后需要填充 导航栏高度 的 view
fun initNavigationBar(view: View) {
    val layoutParams = view.layoutParams
    layoutParams.height = navigationBarHeightPx
    view.layoutParams = layoutParams
}

// 状态栏的像素高度
val statusBarHeightPx by lazy {
    val context = AppContext
    var heightPx = 0
    val resourceId = context.resources.getIdentifier("status_bar_height", "dimen", "android")
    if (resourceId > 0) {
        heightPx = context.resources.getDimensionPixelSize(resourceId)
    }
    heightPx
}

// 导航栏的像素高度
val navigationBarHeightPx by lazy {
    val context = AppContext
    var heightPx = 0
    val id = context.resources.getIdentifier("config_showNavigationBar", "bool", "android")
    if (id != 0) {
        val resourceId = context.resources.getIdentifier("navigation_bar_height", "dimen", "android")
        if (resourceId > 0) {
            heightPx = context.resources.getDimensionPixelSize(resourceId)
        }
    }
    heightPx
}
相关推荐
2501_916007473 分钟前
iOS 上架技术支持全流程解析,从签名配置到使用 开心上架 的实战经验分享
android·macos·ios·小程序·uni-app·cocoa·iphone
Yeats_Liao4 分钟前
Go Web 编程快速入门 01 - 环境准备与第一个 Web 应用
开发语言·前端·golang
卓码软件测评4 分钟前
第三方CMA软件测试机构:页面JavaScript动态渲染生成内容对网站SEO的影响
开发语言·前端·javascript·ecmascript
*才华有限公司*9 分钟前
《爬虫进阶之路:从模拟浏览器到破解动态加载的实战指南》
开发语言·python
敲代码的嘎仔29 分钟前
JavaWeb零基础学习Day4——Maven
java·开发语言·学习·算法·maven·javaweb·学习方法
W.Buffer35 分钟前
设计模式-工厂模式:解耦对象创建的设计艺术
java·开发语言·设计模式
梵得儿SHI1 小时前
Java 注解与反射实战:自定义注解从入门到精通
java·开发语言·注解·自定义注解·元注解·控制注解的作用·声明式编程思想
沐知全栈开发1 小时前
Foundation 网格实例
开发语言
专注前端30年1 小时前
【JavaScript】every 方法的详解与实战
开发语言·前端·javascript
速易达网络1 小时前
Java Web登录系统实现(不使用开发工具)
java·开发语言·前端