kotlin_基础_接口及Android抽取通用代码减少代码量

121 篇文章 1 订阅
22 篇文章 0 订阅

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})"
    }
}

…其他地方使用类似上面

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值