基于love-android的Android项目无初始布局,添加内购按钮后无法切回游戏如何解决?
Love2d安卓项目接入内购按钮解决方案
问题根因
你调用setContentView直接替换了SdlActivity的原生根视图:SDL本身是用独立的Surface/TextureView渲染游戏画面的,没有预设的XML布局,替换原根视图后,游戏渲染视图被直接移除,隐藏你自定义的布局后自然没有内容可以显示,就会出现黑屏,此时游戏逻辑实际还在运行,只是没有渲染载体。
可行实现方案
不要用setContentView替换根视图,改为把内购布局叠加到现有渲染层之上,全程保留SDL的游戏渲染视图:
步骤1:在GameActivity中加载叠加布局
在GameActivity的onCreate方法执行完super.onCreate后,不要调用setContentView,按如下逻辑添加内购布局:
// 加载你写的带内购按钮的自定义布局 View purchaseLayout = getLayoutInflater().inflate(R.layout.your_purchase_layout, null); // 拿到当前Activity的根容器,SDL的游戏渲染视图已经挂载在这个容器下 ViewGroup rootContainer = findViewById(android.R.id.content); // 将内购布局添加到根容器最上层,会浮在游戏画面之上 rootContainer.addView(purchaseLayout); // 可以默认先隐藏内购布局,需要的时候再显示 purchaseLayout.setVisibility(View.GONE);
步骤2:控制内购布局的显示隐藏
需要显示内购入口的时候直接调用:
runOnUiThread(() -> purchaseLayout.setVisibility(View.VISIBLE));
用户点击按钮完成内购操作、需要回到游戏时直接隐藏布局即可:
runOnUiThread(() -> purchaseLayout.setVisibility(View.GONE));
底层的游戏渲染全程不会被中断,不会出现黑屏问题。
步骤3:对接BillingClient逻辑
直接在GameActivity中完成BillingClient的初始化、商品查询、支付拉起、结果回调的全流程即可,和普通安卓项目接入逻辑一致:
onCreate中初始化BillingClient,设置支付结果回调- 按钮
onClick触发时查询可售商品,拉起支付页 - 支付成功后可通过Love2d提供的LuaJava桥接接口,调用Lua层逻辑给玩家发放对应道具
可选优化:游戏内触发内购入口
如果不需要全局悬浮内购按钮,而是希望游戏内点击商店按钮才弹出内购布局,可以给Lua层暴露Java调用接口:
// 在GameActivity中添加这个方法,给Lua调用 public void showPurchaseLayout() { runOnUiThread(() -> purchaseLayout.setVisibility(View.VISIBLE)); }
在Lua层通过LuaJava调用该方法即可触发内购布局显示,更贴合游戏交互逻辑。
注意事项
- 所有视图操作必须放在UI线程执行,从Lua侧回调过来的操作要包
runOnUiThread,否则会触发线程异常 - BillingClient的生命周期要和Activity绑定,
onDestroy中调用billingClient.endConnection()释放资源,避免内存泄漏 - 支付结果回调要做好幂等处理,避免重复发道具
内容的提问来源于stack exchange,提问作者Castelo3442
相关产品推荐
相关产品推荐

