luajava:Lua 调安卓接口的桥
桥的两面
Lua 世界与 Java 世界中间隔着一座桥:桥的这头是 import——绝大多数时候你用它就够了;桥的那头是 luajava——一套更底层、控制更细的函数。日常写界面脚本,import 的简写能覆盖九成场景。
写法一:import(九成的日常)
import "android.widget.Button" -- 单个类
import "android.widget.*" -- 整个包
import "android.view.View_OnClickListener" -- 内部类用下划线
导入后类名直接当构造器用:
button = Button(activity)
button.Text = "点我" -- getter/setter 可简写成属性
layout.addView(button)
写法二:属性简写
Java 的 getXxx() 无参、setXxx(v) 单参时,可以当属性写:
button.Text = "按钮" -- 等价于 button.setText("按钮")
x = button.X -- 等价于 x = button.getX()
布局表里那些 text =、orientation = 走的也是同一套转换。
写法三:事件接口
给控件挂监听器,布局表 onClick 是简写;完整写法是造一个接口对象:
listener = View.OnClickListener { onClick = function(v) print(v) end }
button.setOnClickListener(listener)
Lua 的表直接当成 Java 接口的实现传过去——这座桥最妙的地方。
写法四:luajava 全家
需要精确控制时用底层函数(假设相关类已导入):
| 函数 | 干什么 |
|---|---|
| luajava.bindClass(s) | 按完整名载入类对象 |
| luajava.newInstance(s, ...) | 构造实例 |
| luajava.new(cls, ...) | 同上,接受类对象 |
| luajava.createProxy(s, t) | 用 Lua 表实现 Java 接口 |
| luajava.createArray(s, t) | 用 Lua 表造 Java 数组 |
| luajava.astable(o) | Java 集合转 Lua 表 |
| luajava.coding(s) | 字符串转码(默认 GBK 转 UTF-8) |
用它的两条纪律
- 别滥用 luajava.clear:它是手动销毁 Java 对象的口子,只在确认对象很大且不再使用时才动它,平时让自动回收干活;
- 包名类名必须带引号:
import "android.widget.*"的引号丢了直接语法错。
到这里常用模块讲完,回到应用层面——下一组看市场里那些现成文件怎么用。