ScalaActivity.scala
package com.example
import android.app.Activity
import android.os.Bundle
import android.view.View
import android.view.View.OnClickListener
import android.widget.EditText
import android.widget.{Toast, Button}
import android.content.Context
/**
* Created by IntelliJ IDEA.
* User: brant.yan
* Date: 11-8-1
* Time: 下午5:08
* To change this template use File | Settings | File Templates.
*/
class ScalaActivity extends Activity with ActivityUtil {
override def onCreate(savedInstanceState: Bundle): Unit = {
super.onCreate(savedInstanceState)
setContentView(R.layout.main)
val username = findViewById(R.id.username).asInstanceOf[EditText]
val password = findViewById(R.id.password).asInstanceOf[EditText]
val context:Context=this
button(R.id.submit).onClicked {
Toast.makeText(context, "cccc", 5000).show()
}
}
}
ActivityUtil.scala
package com.example
import android.widget.Button
import android.app.Activity
import android.view.View.OnClickListener
import android.view.View
/**
* Created by IntelliJ IDEA.
* User: brant.yan
* Date: 11-8-3
* Time: 下午3:26
* To change this template use File | Settings | File Templates.
*/
trait ActivityUtil extends Activity {
def button(id: Int): Button = {
this.findViewById(id).asInstanceOf[Button]
}
implicit def buttonWrapper(button: Button) = new {
def onClicked(action: => Any) =
{
button.setOnClickListener(new OnClickListener() {
def onClick(p1: View) = {
action
}
})
}
}
}
没有new,表示定义了一个匿名的类
有了new,生成了一个对象
new {}表示生成了一个对象
而new {
def onClicked(...) {}
}
表示生成了一个含有onClicked方法的对象
当scala发现你在代码中写了button.onClicked,但是button又没有onClicked这个方法时
它就会去寻找当前范围内可用的implicit
并且要求其参数为Button,返回的对象中,有onClicked这个方法,并且onClicked的参数,与你button.onClieck(...)的参数一致
如果没找到,就报错。找到了,就把button.onClicked转为buttonWrapper(button).onclicked(...)
以上解释感谢zhidao.it 有兴趣的童鞋可以访问其网站 zhidao.it 进行了解