1use termux_gui::{Activity, TextView, Result};
6use termux_gui::connection::read_message;
7
8fn main() -> Result<()> {
9 println!("=== RadioGroup + RadioButton 单选演示 (新库版本) ===\n");
10
11 let mut activity = Activity::new(true)?;
13 println!("✓ 连接建立\n");
14
15 let layout = activity.create_linear_layout(None)?;
17
18 let title = activity.create_text_view("📦 选择配送方式", Some(layout.id()))?;
20 title.set_text_size(&mut activity, 26)?;
21 title.view().set_margin(&mut activity, 10)?;
22 title.view().set_height_wrap_content(&mut activity)?;
23 title.view().set_linear_layout_params(&mut activity, 0, None)?;
24
25 let section1 = activity.create_text_view("配送方式:", Some(layout.id()))?;
27 section1.set_text_size(&mut activity, 18)?;
28 section1.view().set_margin(&mut activity, 8)?;
29 section1.view().set_height_wrap_content(&mut activity)?;
30 section1.view().set_linear_layout_params(&mut activity, 0, None)?;
31
32 let radio_group1 = activity.create_radio_group(Some(layout.id()))?;
33 radio_group1.view().set_height_wrap_content(&mut activity)?;
34 radio_group1.view().set_linear_layout_params(&mut activity, 0, None)?;
35
36 let radio1_1 = activity.create_radio_button_checked(
38 "📮 标准配送 (免费, 3-5天)",
39 Some(radio_group1.id()),
40 true
41 )?;
42 radio1_1.view().set_height_wrap_content(&mut activity)?;
43 radio1_1.view().set_linear_layout_params(&mut activity, 0, None)?;
44
45 let radio1_2 = activity.create_radio_button_checked(
47 "🚚 快速配送 (¥15, 1-2天)",
48 Some(radio_group1.id()),
49 false
50 )?;
51 radio1_2.view().set_height_wrap_content(&mut activity)?;
52 radio1_2.view().set_linear_layout_params(&mut activity, 0, None)?;
53
54 let radio1_3 = activity.create_radio_button_checked(
56 "⚡ 当日达 (¥30, 当天送达)",
57 Some(radio_group1.id()),
58 false
59 )?;
60 radio1_3.view().set_height_wrap_content(&mut activity)?;
61 radio1_3.view().set_linear_layout_params(&mut activity, 0, None)?;
62
63 let divider1 = activity.create_text_view("━━━━━━━━━━━━━━━━━━━━", Some(layout.id()))?;
65 divider1.view().set_height_wrap_content(&mut activity)?;
66 divider1.view().set_linear_layout_params(&mut activity, 0, None)?;
67
68 let section2 = activity.create_text_view("支付方式:", Some(layout.id()))?;
70 section2.set_text_size(&mut activity, 18)?;
71 section2.view().set_margin(&mut activity, 8)?;
72 section2.view().set_height_wrap_content(&mut activity)?;
73 section2.view().set_linear_layout_params(&mut activity, 0, None)?;
74
75 let radio_group2 = activity.create_radio_group(Some(layout.id()))?;
76 radio_group2.view().set_height_wrap_content(&mut activity)?;
77 radio_group2.view().set_linear_layout_params(&mut activity, 0, None)?;
78
79 let radio2_1 = activity.create_radio_button_checked(
81 "💚 微信支付",
82 Some(radio_group2.id()),
83 true
84 )?;
85 radio2_1.view().set_height_wrap_content(&mut activity)?;
86 radio2_1.view().set_linear_layout_params(&mut activity, 0, None)?;
87
88 let radio2_2 = activity.create_radio_button_checked(
90 "💙 支付宝",
91 Some(radio_group2.id()),
92 false
93 )?;
94 radio2_2.view().set_height_wrap_content(&mut activity)?;
95 radio2_2.view().set_linear_layout_params(&mut activity, 0, None)?;
96
97 let radio2_3 = activity.create_radio_button_checked(
99 "💰 货到付款",
100 Some(radio_group2.id()),
101 false
102 )?;
103 radio2_3.view().set_height_wrap_content(&mut activity)?;
104 radio2_3.view().set_linear_layout_params(&mut activity, 0, None)?;
105
106 let divider2 = activity.create_text_view("━━━━━━━━━━━━━━━━━━━━", Some(layout.id()))?;
108 divider2.view().set_height_wrap_content(&mut activity)?;
109 divider2.view().set_linear_layout_params(&mut activity, 0, None)?;
110
111 let section3 = activity.create_text_view("发票类型:", Some(layout.id()))?;
113 section3.set_text_size(&mut activity, 18)?;
114 section3.view().set_margin(&mut activity, 8)?;
115 section3.view().set_height_wrap_content(&mut activity)?;
116 section3.view().set_linear_layout_params(&mut activity, 0, None)?;
117
118 let radio_group3 = activity.create_radio_group(Some(layout.id()))?;
119 radio_group3.view().set_height_wrap_content(&mut activity)?;
120 radio_group3.view().set_linear_layout_params(&mut activity, 0, None)?;
121
122 let radio3_1 = activity.create_radio_button_checked(
124 "❌ 不需要发票",
125 Some(radio_group3.id()),
126 true
127 )?;
128 radio3_1.view().set_height_wrap_content(&mut activity)?;
129 radio3_1.view().set_linear_layout_params(&mut activity, 0, None)?;
130
131 let radio3_2 = activity.create_radio_button_checked(
133 "📧 电子发票",
134 Some(radio_group3.id()),
135 false
136 )?;
137 radio3_2.view().set_height_wrap_content(&mut activity)?;
138 radio3_2.view().set_linear_layout_params(&mut activity, 0, None)?;
139
140 let radio3_3 = activity.create_radio_button_checked(
142 "📄 纸质发票 (+¥5)",
143 Some(radio_group3.id()),
144 false
145 )?;
146 radio3_3.view().set_height_wrap_content(&mut activity)?;
147 radio3_3.view().set_linear_layout_params(&mut activity, 0, None)?;
148
149 let divider3 = activity.create_text_view("━━━━━━━━━━━━━━━━━━━━", Some(layout.id()))?;
151 divider3.view().set_margin(&mut activity, 8)?;
152 divider3.view().set_height_wrap_content(&mut activity)?;
153 divider3.view().set_linear_layout_params(&mut activity, 0, None)?;
154
155 let status = activity.create_text_view(
157 "当前选择:\n配送: 标准配送\n支付: 微信支付\n发票: 不需要发票",
158 Some(layout.id())
159 )?;
160 status.view().set_margin(&mut activity, 10)?;
161 status.view().set_height_wrap_content(&mut activity)?;
162 status.view().set_linear_layout_params(&mut activity, 0, None)?;
163 status.set_text_color(&mut activity, 0xFF2196F3u32 as i32)?;
164
165 let price = activity.create_text_view("总计: ¥0", Some(layout.id()))?;
167 price.set_text_size(&mut activity, 22)?;
168 price.view().set_margin(&mut activity, 10)?;
169 price.view().set_height_wrap_content(&mut activity)?;
170 price.view().set_linear_layout_params(&mut activity, 0, None)?;
171 price.set_text_color(&mut activity, 0xFFFF5722u32 as i32)?;
172
173 let confirm_btn = activity.create_button("✅ 确认订单", Some(layout.id()))?;
175 confirm_btn.view().set_margin(&mut activity, 10)?;
176 confirm_btn.view().set_height_wrap_content(&mut activity)?;
177 confirm_btn.view().set_linear_layout_params(&mut activity, 0, None)?;
178
179 println!("✓ 界面创建完成\n");
180 println!("━━━━━━━━━━━━━━━━━━━━━━");
181 println!("提示:");
182 println!(" • 每组只能选择一个选项");
183 println!(" • 选择会自动更新总价");
184 println!(" • 点击 '确认订单' 提交");
185 println!("━━━━━━━━━━━━━━━━━━━━━━\n");
186
187 let delivery_options = ["标准配送", "快速配送", "当日达"];
189 let delivery_prices = [0, 15, 30];
190 let mut delivery_index = 0;
191
192 let payment_options = ["微信支付", "支付宝", "货到付款"];
193 let mut payment_index = 0;
194
195 let invoice_options = ["不需要发票", "电子发票", "纸质发票"];
196 let invoice_prices = [0, 0, 5];
197 let mut invoice_index = 0;
198
199 let update_display = |activity: &mut Activity,
201 status: &TextView,
202 price: &TextView,
203 del_idx: usize,
204 pay_idx: usize,
205 inv_idx: usize| -> Result<()> {
206 let status_text = format!(
207 "当前选择:\n配送: {}\n支付: {}\n发票: {}",
208 delivery_options[del_idx],
209 payment_options[pay_idx],
210 invoice_options[inv_idx]
211 );
212 status.set_text(activity, &status_text)?;
213
214 let total = delivery_prices[del_idx] + invoice_prices[inv_idx];
215 let price_text = format!("总计: ¥{}", total);
216 price.set_text(activity, &price_text)?;
217
218 Ok(())
219 };
220
221 loop {
223 let event = read_message(activity.event_stream())?;
224 let event_type = event["type"].as_str().unwrap_or("");
225 let event_value = &event["value"];
226
227 match event_type {
228 "destroy" => {
229 println!("\n✓ Activity 已关闭");
232 return Ok(());
233 },
234 "selected" => {
235 let group_id = event_value["id"].as_i64().unwrap_or(-1);
236 let selected_id = event_value["selected"].as_i64().unwrap_or(-1);
237
238 if group_id == radio_group1.id() {
239 if selected_id == radio1_1.id() {
241 delivery_index = 0;
242 println!("📮 选择: 标准配送");
243 } else if selected_id == radio1_2.id() {
244 delivery_index = 1;
245 println!("🚚 选择: 快速配送 (+¥15)");
246 } else if selected_id == radio1_3.id() {
247 delivery_index = 2;
248 println!("⚡ 选择: 当日达 (+¥30)");
249 }
250 } else if group_id == radio_group2.id() {
251 if selected_id == radio2_1.id() {
253 payment_index = 0;
254 println!("💚 选择: 微信支付");
255 } else if selected_id == radio2_2.id() {
256 payment_index = 1;
257 println!("💙 选择: 支付宝");
258 } else if selected_id == radio2_3.id() {
259 payment_index = 2;
260 println!("💰 选择: 货到付款");
261 }
262 } else if group_id == radio_group3.id() {
263 if selected_id == radio3_1.id() {
265 invoice_index = 0;
266 println!("❌ 选择: 不需要发票");
267 } else if selected_id == radio3_2.id() {
268 invoice_index = 1;
269 println!("📧 选择: 电子发票");
270 } else if selected_id == radio3_3.id() {
271 invoice_index = 2;
272 println!("📄 选择: 纸质发票 (+¥5)");
273 }
274 }
275
276 update_display(&mut activity, &status, &price,
277 delivery_index, payment_index, invoice_index)?;
278 },
279 "click" => {
280 let clicked_id = event_value["id"].as_i64().unwrap_or(-1);
281
282 if clicked_id == confirm_btn.id() {
283 println!("\n✅ 订单确认:");
284 println!(" 配送方式: {} (¥{})",
285 delivery_options[delivery_index],
286 delivery_prices[delivery_index]);
287 println!(" 支付方式: {}", payment_options[payment_index]);
288 println!(" 发票类型: {} (¥{})",
289 invoice_options[invoice_index],
290 invoice_prices[invoice_index]);
291 println!(" 总计: ¥{}",
292 delivery_prices[delivery_index] + invoice_prices[invoice_index]);
293
294 status.set_text(&mut activity, "✅ 订单已确认!")?;
296 status.set_text_color(&mut activity, 0xFF4CAF50u32 as i32)?;
297 }
298 },
299 _ => {}
300 }
301 }
302}