如何使用C++Builder在Android端实现带TRadioButton的模态输入对话框
C++ Builder 10.4 FMX Android 单选模态弹窗实现方案
实现思路
- 完全动态创建轻量化弹窗窗体,无需设计时提前定义窗体资源,不会占用全屏,悬浮在当前活动窗口上层
- 内部动态生成单选按钮组、确认/取消按钮,适配选项数量自动调整大小
- 采用异步回调模式返回选择结果,符合Android平台异步对话框的设计规范,和TDialogServiceAsync使用逻辑一致
完整实现代码
第一步:头文件(.h)添加声明
在你当前使用的窗体类的私有声明区域添加函数定义:
private: // 用户自定义声明 void __fastcall ShowRadioSelectDialog(String Title, TStringDynArray Options, TProc<int> OnSelectResult);
第二步:实现文件(.cpp)添加功能代码
#include <FMX.StdCtrls.hpp> #include <FMX.Layouts.hpp> #include <System.Classes.hpp> void __fastcall TForm1::ShowRadioSelectDialog(String Title, TStringDynArray Options, TProc<int> OnSelectResult) { // 动态创建弹窗窗体 TForm *PopupDlg = new TForm(Application); PopupDlg->BorderStyle = bsNone; PopupDlg->Transparent = true; PopupDlg->Position = poScreenCenter; PopupDlg->Width = 320; PopupDlg->Height = 150 + Options.Length * 30; // 按选项数量自适应高度 // 背景容器 TLayout *BgLayout = new TLayout(PopupDlg); BgLayout->Parent = PopupDlg; BgLayout->Align = alClient; BgLayout->Fill->Color = 0xFF2C2C2C; BgLayout->Fill->Kind = bkSolid; BgLayout->Margins->Left = 10; BgLayout->Margins->Top = 10; BgLayout->Margins->Right = 10; BgLayout->Margins->Bottom = 10; BgLayout->Radius = 8; BgLayout->Stroke->Color = 0xFF555555; BgLayout->Stroke->Kind = bkSolid; // 标题 TLabel *TitleLab = new TLabel(BgLayout); TitleLab->Parent = BgLayout; TitleLab->Text = Title; TitleLab->Align = alTop; TitleLab->Height = 40; TitleLab->TextAlign = TTextAlign::Center; TitleLab->Font->Size = 16; TitleLab->Font->Color = 0xFFFFFFFF; TitleLab->Margins->Bottom = 10; // 单选按钮组 TRadioGroup *RadioGrp = new TRadioGroup(BgLayout); RadioGrp->Parent = BgLayout; RadioGrp->Align = alClient; RadioGrp->Items->AddStrings(Options); RadioGrp->ItemIndex = 0; // 默认选中第一个 RadioGrp->Font->Color = 0xFFFFFFFF; RadioGrp->StyleLookup = "transparent"; RadioGrp->Margins->Left = 10; RadioGrp->Margins->Right = 10; // 按钮栏 TLayout *BtnLayout = new TLayout(BgLayout); BtnLayout->Parent = BgLayout; BtnLayout->Align = alBottom; BtnLayout->Height = 50; BtnLayout->Margins->Top = 10; // 取消按钮 TButton *CancelBtn = new TButton(BtnLayout); CancelBtn->Parent = BtnLayout; CancelBtn->Text = "取消"; CancelBtn->Align = alLeft; CancelBtn->Width = 140; CancelBtn->Margins->Left = 10; CancelBtn->Font->Color = 0xFFFFFFFF; CancelBtn->OnClick = [PopupDlg, OnSelectResult](TObject *Sender){ if(OnSelectResult) OnSelectResult(-1); // -1代表用户点击取消 PopupDlg->Close(); }; // 确认按钮 TButton *ConfirmBtn = new TButton(BtnLayout); ConfirmBtn->Parent = BtnLayout; ConfirmBtn->Text = "确认"; ConfirmBtn->Align = alRight; ConfirmBtn->Width = 140; ConfirmBtn->Margins->Right = 10; ConfirmBtn->Font->Color = 0xFFFFFFFF; ConfirmBtn->OnClick = [PopupDlg, RadioGrp, OnSelectResult](TObject *Sender){ if(OnSelectResult) OnSelectResult(RadioGrp->ItemIndex); PopupDlg->Close(); }; // 显示模态弹窗 PopupDlg->ShowModal(); }
注意:代码中的TForm1需要替换为你自己的窗体类名。
第三步:调用示例,替换你原有代码里的InputQuery逻辑
if(ApePat[1] == ApePat[2]) ApePat[0] = ApePat[1]; else if(ApePat[1] != "" && ApePat[2] == "") ApePat[0] = ApePat[1]; else if(ApePat[1] == "" && ApePat[2] != "") ApePat[0] = ApePat[2]; else // 需要用户选择对应选项 { TStringDynArray Options; Options.set_length(2); Options[0] = L"Opción 1: " + ApePat[1]; Options[1] = L"Opción 2: " + ApePat[2]; ShowRadioSelectDialog(L"Elija el ApePat más adecuado", Options, [this, ApePat](int SelectIndex){ if(SelectIndex == 0) ApePat[0] = ApePat[1]; else if(SelectIndex == 1) ApePat[0] = ApePat[2]; // SelectIndex为-1代表用户点击取消,可自行补充取消后的处理逻辑 }); }
内容的提问来源于stack exchange,提问作者PCSdeZ
相关产品推荐
相关产品推荐

