You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Corona SDK(Lua):最小改动将单选按钮替换为数字输入框

解决方案:用最小改动替换单选按钮为数字输入框

Got it, let's tackle this problem—you want to swap some radio buttons for number input boxes with minimal code changes while keeping your medical app's questionnaire flow intact. Here's a streamlined approach:

第一步:先简化原单选按钮的冗余代码

Your original code has a lot of repeated logic across the three conditional branches. Let's clean that up first to make the replacement easier:

local radioGroup = display.newGroup()
-- 先初始化单选按钮的选中状态变量,避免重复写创建代码
local isRadio0Checked = false
local isRadio1Checked = false

-- 根据数组值设置选中状态,只写一次判断
if ebasRating_Arr[i] == 0 then
    isRadio0Checked = true
elseif ebasRating_Arr[i] == 1 then
    isRadio1Checked = true
end

-- 统一创建两个单选按钮
radioButton_0 = widget.newSwitch {
    left = 565,
    style = "radio",
    initialSwitchState = isRadio0Checked,
    id = tostring(i),
    width = 60,
    height = 60,
    onPress = setEBASRating0
}
radioGroup:insert( radioButton_0 )

radioButton_1 = widget.newSwitch {
    style = "radio",
    id = tostring(i),
    initialSwitchState = isRadio1Checked,
    width = 60,
    height = 60,
    onPress = setEBASRating1
}
radioGroup:insert( radioButton_1 )

-- 统一设置位置,避免重复计算
radioButton_0.y = 150 + (i * 450)
radioButton_1.x = radioButton_0.x + radioButton_0.width + 18
radioButton_1.y = radioButton_0.y

scrollView:insert( radioGroup )

第二步:添加数字输入框的替换逻辑

Now, add a conditional check to swap in number inputs for specific questionnaire items (you can adjust the useNumberInput condition to match your needs—like targeting specific indices or question types). This keeps changes minimal and preserves your existing layout:

-- 定义哪些问卷项需要替换为数字输入框,比如这里指定i=2和i=5的项
local useNumberInput = (i == 2) or (i == 5)

if useNumberInput then
    -- 创建数字输入框,匹配原单选按钮组的布局尺寸
    local numberInput = widget.newTextField({
        left = 565,
        top = 150 + (i * 450),
        width = 60 + 60 + 18, -- 和两个单选按钮的总宽度一致
        height = 60,
        id = tostring(i),
        inputType = "number", -- 限制仅输入数字
        placeholder = "请输入评分",
        -- 初始化显示已有的评分值(如果存在)
        text = ebasRating_Arr[i] ~= nil and tostring(ebasRating_Arr[i]) or ""
    })

    -- 绑定输入事件,替代原单选按钮的onPress逻辑
    numberInput:addEventListener( "userInput", function(event)
        if event.phase == "ended" or event.phase == "submitted" then
            -- 将输入值存入原数组,和单选按钮的逻辑对齐
            ebasRating_Arr[i] = tonumber(event.target.text) or 0
        end
    end)

    scrollView:insert( numberInput )
else
    -- 这里放第一步简化后的单选按钮代码
    local radioGroup = display.newGroup()
    local isRadio0Checked = false
    local isRadio1Checked = false

    if ebasRating_Arr[i] == 0 then
        isRadio0Checked = true
    elseif ebasRating_Arr[i] == 1 then
        isRadio1Checked = true
    end

    radioButton_0 = widget.newSwitch {
        left = 565,
        style = "radio",
        initialSwitchState = isRadio0Checked,
        id = tostring(i),
        width = 60,
        height = 60,
        onPress = setEBASRating0
    }
    radioGroup:insert( radioButton_0 )

    radioButton_1 = widget.newSwitch {
        style = "radio",
        id = tostring(i),
        initialSwitchState = isRadio1Checked,
        width = 60,
        height = 60,
        onPress = setEBASRating1
    }
    radioGroup:insert( radioButton_1 )

    radioButton_0.y = 150 + (i * 450)
    radioButton_1.x = radioButton_0.x + radioButton_0.width + 18
    radioButton_1.y = radioButton_0.y

    scrollView:insert( radioGroup )
end

关键改动说明

  • 最小侵入性:只通过一个条件判断切换组件,原有单选按钮逻辑完全保留
  • 布局一致性:输入框尺寸和位置和原单选按钮组对齐,不用调整UI布局
  • 逻辑对齐:输入框的数值存储逻辑和原单选按钮的setEBASRating函数对齐,不用修改后续数据处理代码
  • 可扩展性:随时可以调整useNumberInput的条件,快速添加更多需要数字输入的问卷项

内容的提问来源于stack exchange,提问作者NoobProgrammer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:55:01