界面布局为什么要用表来写
表就是界面
安卓原生的界面用 XML 写,掌上环境换成了更顺手的方案:用 Lua 表描述界面。表嵌表就是控件套控件,键值对就是属性。上一节给按钮接事件时你已经写过一小张了(见加一个按钮),这页把规则补全。
基本形状
layout = {
LinearLayout, -- 容器类型(导入过的类名直接用)
orientation = "vertical", -- 属性 = 值
layout_width = "fill",
{
TextView, -- 子控件
text = "标题",
id = "tv",
},
{
Button,
text = "确定",
id = "btn",
onClick = "click", -- 值也可以写函数名字符串或函数变量
},
}
三条核心规则:
- 第一项是控件类型:
LinearLayout、TextView、Button这些名字来自 import 进来的安卓类; - 其余键值对是属性:支持绝大部分安卓控件属性;
- 嵌套的表是子控件:容器里塞几个表就有几个子项。
两个省事的简写
- fill / wrap:
layout_width与layout_height支持简写——"fill"撑满、"wrap"裹内容,不用写安卓原始的常量名; - id 就是变量名:
id = "tv"之后,代码里tv直接就是那个控件——不是 XML 里那种数字 id,是 Lua 变量。这也是为什么截图里edit能直接.getText()(见读默认代码那页的示例延伸)。
特殊属性的取值
src(ImageView 的图片):写当前目录图片名、绝对路径或网络图片;background:背景图片、颜色(同 backgroundColor 的十六进制写法)或自绘制函数都行;onClick:Lua 函数、接口对象或函数名字符串都可以。
跟 loadlayout 配合
main = {}
activity.setContentView(loadlayout(layout, main))
第二个参数是「收纳表」:所有带 id 的控件都会被装进去,之后 main.tv、main.btn 取用。也可以不传,控件直接以全局变量存在(以实际版本行为为准)。
写完的布局跑起来位置不对、控件挤成一团时,先把 orientation 换个方向、给控件加 padding 试——多数排版问题出在容器选错。界面之外的脚本能力,进常用模块。