Contenu connexe Similaire à Scala on Your Phone (20) Plus de Michael Galpin (12) Scala on Your Phone1. Scala on Your Phone:
Making Mobile
Development Suck Less
Michael Galpin, eBay
@michaelg
9. @synthesize textInput;
@synthesize label;
@synthesize name;
- (IBAction)changeGreeting:(id)sender {
self.name = textInput.text;
NSString *nameString = name;
if([nameString length] == 0) {
nameString = @"Code Camp";
}
NSString *greeting = [[NSString alloc]
initWithFormat:@"Hello %@!", nameString];
label.text = greeting;
[greeting release];
}
- (BOOL)textFieldShouldReturn:(UITextField *)theTextField {
if(theTextField == textInput) {
[textInput resignFirstResponder];
}
return YES;
}
- (void)dealloc {
[textInput release];
[label release];
[name release];
[super dealloc];
}
12. @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button sayButton = (Button) findViewById(R.id.say_button);
sayButton.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
EditText nameBox = (EditText) findViewById(R.id.name);
String name = nameBox.getText().toString();
TextView greeting = (TextView) findViewById(R.id.greeting);
greeting.setText("Hello " + name);
}
});
}
14. override def onCreate(savedInstanceState:Bundle){
import R.id._
super.onCreate(savedInstanceState)
setContentView(R.layout.main)
val sayButton = findViewById(say_button).asInstanceOf[Button]
sayButton.setOnClickListener( () => {
val user = findViewById(name).asInstanceOf[EditText].text
findViewById(greeting).asInstanceOf[TextView].text = "Hello " + user
})
}
16. Closures
• Strongly typed handlers • Forget one-method
interfaces
• Lexical scoping
17. Closures
• Strongly typed handlers • Forget one-method
interfaces
• Lexical scoping
val computedValue = parseInt(findViewById(foo).asInstanceOf[EditText].text)
this.post( () => {
val url = new URL("http://foo.com?qs=" + computedValue)
Source.fromStream(url.openStream).getLines.foreach(findViewById(results).text += _)
})
mainMenu.onClick = (item:MenuItem) => { startActivity(item.activity) }
21. XML
val results = for (suggested <- responseXml"Suggested"){
yield Term(sugested"Term" text, suggested"Priority" text)
}
nextNode match {
case <code>{txt}</code> => this.status = parseInt(txt)
case <state>{txt}</state> => this.state = txt
case _ =>
}
23. * Compiler Dex Compiler Compress
Source Code Class files Dex File APK
24. Implicits
object Activity{
implicit def funcToClicker1(f:_root_.android.view.View => Unit):OnClickListener =
new OnClickListener(){ def onClick(v:_root_.android.view.View)=f.apply(v)}
implicit def funcToClicker0(f:() => Unit):OnClickListener =
new OnClickListener() { def onClick(v:_root_.android.view.View)=f.apply}
implicit def funcToLongClicker0(f:() => Boolean):OnLongClickListener =
new OnLongClickListener() { def onLongClick(v:_root_.android.view.View) = f.apply}
implicit def funcToLongClicker1(f:_root_.android.view.View => Boolean):OnLongClickListener =
new OnLongClickListener() { def onLongClick(v:_root_.android.view.View) = f.apply(v)}
implicit def viewToRichView(v:_root_.android.view.View):scala.android.view.View = new
scala.android.view.View(v)
implicit def richViewToView(view:scala.android.view.View):_root_.android.view.View = view.base
}
25. Bag o’ Tricks
class ViewGroup(base:_root_.android.view.ViewGroup) extends View(base){
object views{
def +=(v:_root_.android.view.View){
base.addView(v)
}
def apply(index:Int) = new {
def update(v:_root_.android.view.View) = base.addView(index,v)
}
}
...
}
26. Bag o’ Tricks
class ViewGroup(base:_root_.android.view.ViewGroup) extends View(base){
object views{
def +=(v:_root_.android.view.View){
base.addView(v)
}
def apply(index:Int) = new {
def update(v:_root_.android.view.View) = base.addView(index,v)
}
}
...
}
myGroup.views += someOtherView
myGroup.views(3) = yetAnotherView