如何在Lua中调用Android的Rect类实现多窗口布局?
问题:Lua调用Android Intent打开谷歌地图时,正确创建Rect实例实现多窗口模式的方法
原代码尝试通过Rect(0, 0, 200, 200)创建Android Rect对象,但Lua中没有内置这个函数,导致报错。同时直接将Rect对象传给startActivity的写法也不符合Android API要求,因为该方法的第二个参数是Bundle类型,需要通过ActivityOptions封装Rect参数。
原错误代码:
uri = "https://www.google.com/maps/dir/?api=1&travelmode=driving&origin=50.291793,30.355700&destination=50.400024,30.623489" local Intent = luajava.newInstance("android.content.Intent") local Uri = luajava.bindClass("android.net.Uri") Intent:setAction(Intent.ACTION_VIEW) Intent:setData(Uri:parse(uri)) Intent:addFlags(bit32.bor(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT, Intent.FLAG_ACTIVITY_NEW_TASK, Intent.FLAG_ACTIVITY_MULTIPLE_TASK)) bundle = Rect(0, 0, 200, 200) activity:startActivity(Intent, bundle)
正确实现方式
步骤说明
- 必须通过
luajava.newInstance创建AndroidRect类的实例,指定完整类路径android.graphics.Rect并传入坐标参数。 - 使用
ActivityOptions类封装Rect参数,将其转换为符合要求的Bundle对象后传给startActivity。
修正后的完整代码
uri = "https://www.google.com/maps/dir/?api=1&travelmode=driving&origin=50.291793,30.355700&destination=50.400024,30.623489" local Intent = luajava.newInstance("android.content.Intent") local Uri = luajava.bindClass("android.net.Uri") -- 1. 正确实例化Android Rect对象 local Rect = luajava.newInstance("android.graphics.Rect", 0, 0, 200, 200) -- 2. 创建ActivityOptions并设置启动边界 local ActivityOptions = luajava.bindClass("android.app.ActivityOptions") local options = ActivityOptions:makeBasic() options:setLaunchBounds(Rect) -- 3. 将options转换为Bundle传入startActivity local bundle = options:toBundle() Intent:setAction(Intent.ACTION_VIEW) Intent:setData(Uri:parse(uri)) Intent:addFlags(bit32.bor(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT, Intent.FLAG_ACTIVITY_NEW_TASK, Intent.FLAG_ACTIVITY_MULTIPLE_TASK)) activity:startActivity(Intent, bundle)
关键修正点
- 替换
Rect(0,0,200,200)为luajava.newInstance("android.graphics.Rect", 0, 0, 200, 200),通过LuaJava桥接正确实例化Android原生类。 - 新增
ActivityOptions的使用:通过makeBasic()创建基础配置,调用setLaunchBounds()传入Rect设置多窗口启动区域,最后用toBundle()转换为startActivity所需的Bundle参数。
内容的提问来源于stack exchange,提问作者WANDEL
相关产品推荐
相关产品推荐

