之前看到一句很著名的话“不要重复自己”,这也告诉了我们不要重复的造轮子,在Java中,我们可以通过接口回调来大幅简化我们的代码,并提升我们的代码可读性,而在kotlin里代码回调则要更具有一些kotlin“风味”,这里我们可以来写一个简单的例子
val mBtn=findViewByID(R.id.button)
mBtn.setOnClickListener{
//do something
}
当这里只有一个按钮的时候,只需要这么设置即可,但是当存在多个按钮的时候
val mbtn1=findViewById<Button>(R.id.btn_1)
// do something
}
val mbtn2=findViewById<Button>(R.id.btn_2)
// do something
}
val mbtn3=findViewById<Button>(R.id.btn_3)
// do something
}
val mbtn4=findViewById<Button>(R.id.btn_4)
// do something
}
val mbtn5=findViewById<Button>(R.id.btn_5)
// do something
}
val mbtn6=findViewById<Button>(R.id.btn_6)
// do something
}
这样写就太过于愚蠢了,首先我们如果旨在onCreate()方法里声明button
,结果就是在这个函数外都无法使用,其次这样的代码可读性和维护性都非常低,是典型的面向过程,那如果我们定义一个函数来实现onclick
呢?
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val mbtn1=findViewById<Button>(R.id.btn_1)
val mbtn2=findViewById<Button>(R.id.btn_2)
}
fun foo(){
//无法这么做,此时AS报错找不到mbtn*
mbtn1.setOnClickListener{
// do something
}
}
所以这里是我们要做的第一个改变,即首先要声明我们的变量
class MainActivity : AppCompatActivity() {
lateinit var mBtn1:Button
lateinit var mBtn2:Button
……
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
mbtn1=findViewById<Button>(R.id.btn_1)
mbtn2=findViewById<Button>(R.id.btn_2)
……
foo()
}
fun foo(){
mbtn1.setOnClickListener{
// do something
}
……
}
但是就算这么写,也仅仅是做了个初级封装,这时就要用到kotlin的接口回调了
这样,代码就可以重构成
class MainActivity : AppCompatActivity() {
lateinit var mBtn1:Button
lateinit var mBtn2:Button
……
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
mbtn1=findViewById<Button>(R.id.btn_1)
mbtn2=findViewById<Button>(R.id.btn_2)
……
setListener()
}
private fun setListener(){
var onclick:OnClick
mbtn1.setOnClickListener(onclick)
mbtn2.setOnClickListener(onclick)
……
}
class OnClick: View.OnClickListener{
override fun onClick(v: View?) {
when(v!!.id){
R.id.btn_1->
// do something
R.id.btn_2->
// do something
……
else ->
// do something
}
}
}
这样,我们就实现了一个比较高级的封装,它可以大大提高我们代码的可维护性,这里第一期只是说了kotlin接口回调的一个小应用(毕竟我也在不断学习),但无论如何,发挥面向对象的优势是我们写出好代码的重中之重