Kotlin之接口(interface)

Kotlin的接口相比Java增加了函数实现的特性,虽然没有状态,但可为类提供通用行为。通过接口,可以抽离Activity中的共性代码,如处理toolbar事件,包括设置标题、颜色、背景、导航动作和滚动动画等。定义一个ToolbarManager接口,可以简化各Activity的菜单设置和行为一致性。使用时,接口属性可通过lazy委托延迟初始化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

kotlin的接口与java的接口相比较而言有了一部分改动:

  • kotlininterface不仅可以声明函数,还可以对函数进行实现.与类唯一不同的是它们是无状态的,所以属性需要子类去重写.类需要去负责保存接口属性的状态.

接口的作用:可以被用来从类中提取出相似行为的通用代码
例如:所有的Activity中基本都有ToolBar,我们可以把所有Activity共享Toolbar的代码存放在一个接口中.这样就会减少代码量,

在使用的时候把toolbar布局添加到不同activity的xml布局中,之后创建一个接口用来处理toolbar事件:
1. 设置title的内容和色值
2. 设置toolbar背景色
3. 指定是否显示上一步的导航动作
4. 滚动时的toolbar动画
5. 给所有的activity设置相同的菜单,甚至行为
……

然后让我们定义 ToolbarManager

interface ToolbarManager {

    val toolbar: Toolbar //接口是无状态的,所以属性可以被定义,但是不能赋值。子类会实现这个接口并重写这个属性

    // 另一方面,我们可以不使用重写来实现无状态的属性。也就是说属性不需要维护一个 backup field,而是手动处理(使用getter和setter)
    var toolbarTitle: String
        get() = toolbar.title.toString()
        set(value) {
            toolbar.title = value
        }

    fun initToolbar() {
        // 加载toolbar的布局,并且添加点击事件,该处实际在项目中需要在activity中实现,因为不同activity中的点击事件和布局基本都是不相同的, 
        toolbar.inflateMenu(R.menu.menu_main)
        toolbar.setOnMenuItemClickListener {
            when (it.itemId) {
                R.id.action_settings -> toolbar.ctx.startActivity<SettingsActivity>()
                else -> App.instance.toast("Unknown option")
            }
            true
        }
    }

    // 把函数作为参数传递到另一个函数中,并且作为参数的函数无返回值
    fun enableHomeAsUp(up: () -> Unit) {
        toolbar.navigationIcon = createUpDrawable()
        toolbar.setNavigationOnClickListener { up() }
    }

    private fun createUpDrawable() = with(DrawerArrowDrawable(toolbar.ctx)) {
        progress = 1f
        this
    }

    // 用来设置view滑动时,toolbar消失和显示
    fun attachToScroll(recyclerView: RecyclerView) {
        recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() {
            override fun onScrolled(recyclerView: RecyclerView?, dx: Int, dy: Int) {
                // 使用了扩展函数
                if (dy > 0) toolbar.slideExit() else toolbar.slideEnter()
            }
        })
    }
    ......// 可以不断的在ToolbarManager中添加共享事件
}

使用:在使用的时候需要指定toolbar属性,我们可以使用 lazy 委托实现,这样会在我们第一次使用它的时候才会inflate

class MainActivity : AppCompatActivity(), ToolbarManager {
    override val toolbar by lazy { find<Toolbar>(R.id.toolbar) }
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        initToolbar()
        // 将toolbar绑定到recyclerview上
        attachToScroll(recyclerview)
    }

    private fun updateUI(weekForecast: ForecastList) {
        // 将数据展示在UI布局中
        toolbarTitle = "${weekForecast.city} (${weekForecast.country})"
    }
}

…其他地方使用类似上面

### 使用 Room 和 Kotlin 定义接口Kotlin 中利用 Room 库来操作 SQLite 数据库时,定义数据访问对象(DAO)接口是一个重要环节。这些 DAO 接口用于描述对实体的操作方式。 #### 创建 Entity 类 首先创建表示表结构的数据类,并标注 `@Entity` 注解以告知这是个持久化的实体[^1]: ```kotlin import androidx.room.Entity import androidx.room.PrimaryKey @Entity(tableName = "users") data class User( @PrimaryKey val uid: Int, val name: String?, val lastName: String? ) ``` #### 编写 DAO 接口 接着编写一个接口作为与数据库交互的方法集合,使用 `@Dao` 进行标记并提供增删改查等功能的抽象方法声明: ```kotlin import androidx.room.* @Dao interface UserDao { @Query("SELECT * FROM users") fun getAll(): List<User> @Insert(onConflict = OnConflictStrategy.IGNORE) suspend fun insertAll(vararg users: User) @Delete suspend fun delete(user: User) } ``` 注意这里采用了协程支持的关键字 `suspend` 来修饰异步执行的方法,这使得调用方可以在不阻塞主线程的情况下等待操作完成。 #### 构建 Database 抽象层 最后构建一个继承自 `RoomDatabase` 的抽象类用来管理整个应用内的多个 DAO 实例以及配置其他选项如版本号等: ```kotlin import androidx.room.Database import androidx.room.RoomDatabase @Database(entities = arrayOf(User::class), version = 1) abstract class AppDatabase : RoomDatabase() { abstract fun userDao(): UserDao } ``` 上述代码片段展示了如何基于 Room 框架设计一套完整的 CRUD API 并将其封装到易于使用的接口之中。通过这种方式能够简化 Android 开发者对于本地存储部分的工作流程,提高编码效率的同时也增强了程序可维护性和扩展性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值