An Android user interface is constructed from View objects.
The following is an example that illustrates some features of
Kawa to help write views hierarchies,
The example is self-contained, and can be built and run
as described in Building for Android.
(require 'android-defs)
(activity hello
(on-create-view
(define counter ::integer 0)
(define counter-view
(TextView text: "Not clicked yet."))
(LinearLayout orientation: LinearLayout:VERTICAL
(TextView text: "Hello, Android from Kawa Scheme!")
(Button
text: "Click here!"
on-click-listener: (lambda (e)
(set! counter (+ counter 1))
(counter-view:setText
(format "Clicked ~d times." counter))))
counter-view)))
The first import form imports various useful definitions
from the Kawa Android library. Using these is not required for
writing a Kawa application, but makes it more convenient.
The names LinearLayout, TextView, and Button
are just aliases for standard Android View sub-classes.
A few are prefined by (require 'android-defs), or you
can define them yourself using define-alias.
An Android application consists of one or more activities,
each of which is an instance of the android.app.Activity class.
You can use the activity macro to define your Activity class.
The first macro argument (in this case hello) is the class name,
and the others are members of the class, in the syntax of
a field-or-method-decl. The sub-form on-create-view
is an abbreviation for declaring an onCreate method
(which is called when the Activity starts up
followed by a setContentView:
The body of the on-create-view is evaluated.
The result should be a View expression,
which is passed to setContentView.
Procedure: current-activity [new-value]
With no arguments, returns the current
Activity. If anew-valueargument is given, sets the current activity. It is set automatically by theon-createandon-create-viewmethods of theactivitymacro.Since
current-activityis a parameter object, you can locally change the value usingparameterize.
To create an instance of a View class you “call” the
class as if it were a function,
as described in Allocating objects.
For example:
(TextView (this) text: "Hello, Android from Kawa Scheme!")
If you (require 'android-defs) that defines
some special handling for View classes.
You can leave out the (this) argument,
which refers to the enclosing Activity:
(TextView text: "Hello, Android from Kawa Scheme!")
You can register event listeners on Android View objects
using methods typically named setOn.
For example EVENTListenersetOnClickListener. When allocating
an object you can leave out the set, and you can optionally
use Scheme-style names: on-click-listener. The argument
is an object of a special nested listener class,
for example View$OnClickListener. These are
single-method classes, so you can use a lambda expression
and SAM-conversion will automatically create the needed
listener class.