pub struct Spinner { /* private fields */ }Expand description
A Spinner is a dropdown list
Implementations§
Source§impl Spinner
impl Spinner
Sourcepub fn id(&self) -> i64
pub fn id(&self) -> i64
Get the view ID
Examples found in repository?
examples/spinner_demo_v2.rs (line 162)
8fn main() -> Result<()> {
9 println!("=== Spinner 下拉列表演示 (新库版本) ===\n");
10
11 // 创建 Activity(全屏模式)
12 let mut activity = Activity::new(false)?;
13 println!("✓ 连接建立\n");
14
15 // 创建 NestedScrollView 作为根布局(支持滚动)
16 let scroll = activity.create_nested_scroll_view(None)?;
17
18 // 创建主布局(放在 ScrollView 内)
19 let layout = activity.create_linear_layout(Some(scroll.id()))?;
20 layout.view().set_margin(&mut activity, 20)?;
21
22 // 标题
23 let title = activity.create_text_view("📱 手机订购向导", Some(layout.id()))?;
24 title.set_text_size(&mut activity, 24)?;
25 title.view().set_height_wrap_content(&mut activity)?;
26 title.view().set_linear_layout_params(&mut activity, 0, None)?;
27
28 // ========== 品牌选择 ==========
29 let brand_label = activity.create_text_view("选择品牌:", Some(layout.id()))?;
30 brand_label.set_text_size(&mut activity, 18)?;
31 brand_label.view().set_margin(&mut activity, 10)?;
32 brand_label.view().set_height_wrap_content(&mut activity)?;
33 brand_label.view().set_linear_layout_params(&mut activity, 0, None)?;
34
35 let brands = vec!["请选择", "Apple", "Samsung", "Huawei", "Xiaomi", "OPPO", "Vivo"];
36 let brand_spinner = activity.create_spinner(Some(layout.id()))?;
37 brand_spinner.view().set_width_match_parent(&mut activity)?;
38 brand_spinner.view().set_height_wrap_content(&mut activity)?;
39 brand_spinner.view().set_linear_layout_params(&mut activity, 0, None)?;
40 brand_spinner.set_list(&mut activity, &brands)?;
41 brand_spinner.refresh(&mut activity)?;
42
43 // ========== 型号选择 ==========
44 let model_label = activity.create_text_view("选择型号:", Some(layout.id()))?;
45 model_label.set_text_size(&mut activity, 18)?;
46 model_label.view().set_margin(&mut activity, 10)?;
47 model_label.view().set_height_wrap_content(&mut activity)?;
48 model_label.view().set_linear_layout_params(&mut activity, 0, None)?;
49
50 let model_spinner = activity.create_spinner(Some(layout.id()))?;
51 model_spinner.view().set_width_match_parent(&mut activity)?;
52 model_spinner.view().set_height_wrap_content(&mut activity)?;
53 model_spinner.view().set_linear_layout_params(&mut activity, 0, None)?;
54 model_spinner.set_list(&mut activity, &["请先选择品牌"])?;
55 model_spinner.refresh(&mut activity)?;
56
57 // ========== 容量选择 ==========
58 let storage_label = activity.create_text_view("选择容量:", Some(layout.id()))?;
59 storage_label.set_text_size(&mut activity, 18)?;
60 storage_label.view().set_margin(&mut activity, 10)?;
61 storage_label.view().set_height_wrap_content(&mut activity)?;
62 storage_label.view().set_linear_layout_params(&mut activity, 0, None)?;
63
64 let storages = vec!["请选择", "64GB", "128GB", "256GB", "512GB", "1TB"];
65 let storage_spinner = activity.create_spinner(Some(layout.id()))?;
66 storage_spinner.view().set_width_match_parent(&mut activity)?;
67 storage_spinner.view().set_height_wrap_content(&mut activity)?;
68 storage_spinner.view().set_linear_layout_params(&mut activity, 0, None)?;
69 storage_spinner.set_list(&mut activity, &storages)?;
70 storage_spinner.refresh(&mut activity)?;
71
72 // ========== 颜色选择 ==========
73 let color_label = activity.create_text_view("选择颜色:", Some(layout.id()))?;
74 color_label.set_text_size(&mut activity, 18)?;
75 color_label.view().set_margin(&mut activity, 10)?;
76 color_label.view().set_height_wrap_content(&mut activity)?;
77 color_label.view().set_linear_layout_params(&mut activity, 0, None)?;
78
79 let colors = vec!["请选择", "黑色", "白色", "金色", "银色", "蓝色", "紫色", "绿色"];
80 let color_spinner = activity.create_spinner(Some(layout.id()))?;
81 color_spinner.view().set_width_match_parent(&mut activity)?;
82 color_spinner.view().set_height_wrap_content(&mut activity)?;
83 color_spinner.view().set_linear_layout_params(&mut activity, 0, None)?;
84 color_spinner.set_list(&mut activity, &colors)?;
85 color_spinner.refresh(&mut activity)?;
86
87 // ========== 结果显示 ==========
88 let result = activity.create_text_view("请完成选择", Some(layout.id()))?;
89 result.set_text_size(&mut activity, 16)?;
90 result.set_text_color(&mut activity, 0xFF666666u32 as i32)?;
91 result.view().set_margin(&mut activity, 10)?;
92 result.view().set_height_wrap_content(&mut activity)?;
93 result.view().set_linear_layout_params(&mut activity, 0, None)?;
94
95 // ========== 提交按钮 ==========
96 let submit_btn = activity.create_button("🛒 确认订购", Some(layout.id()))?;
97 submit_btn.view().set_margin(&mut activity, 10)?;
98 submit_btn.view().set_height_wrap_content(&mut activity)?;
99 submit_btn.view().set_linear_layout_params(&mut activity, 0, None)?;
100
101 println!("✓ 界面创建完成\n");
102 println!("━━━━━━━━━━━━━━━━━━━━━━");
103 println!("提示: 从下拉列表中选择");
104 println!("━━━━━━━━━━━━━━━━━━━━━━\n");
105
106 // 选择状态
107 let mut brand_selection = String::new();
108 let mut model_selection = String::new();
109 let mut storage_selection = String::new();
110 let mut color_selection = String::new();
111
112 // 更新结果显示的辅助函数
113 let update_result = |activity: &mut Activity,
114 result: &TextView,
115 brand: &str,
116 model: &str,
117 storage: &str,
118 color: &str| -> Result<()> {
119 let all_selected = !brand.is_empty() && !model.is_empty()
120 && !storage.is_empty() && !color.is_empty();
121
122 let result_text = if all_selected {
123 format!("✅ 已选择:\n品牌: {}\n型号: {}\n容量: {}\n颜色: {}",
124 brand, model, storage, color)
125 } else {
126 let mut missing = Vec::new();
127 if brand.is_empty() { missing.push("品牌"); }
128 if model.is_empty() { missing.push("型号"); }
129 if storage.is_empty() { missing.push("容量"); }
130 if color.is_empty() { missing.push("颜色"); }
131 format!("⚠️ 待选择: {}", missing.join(", "))
132 };
133
134 result.set_text(activity, &result_text)?;
135
136 let text_color = if all_selected {
137 0xFF4CAF50u32 as i32 // 绿色
138 } else {
139 0xFF666666u32 as i32 // 灰色
140 };
141 result.set_text_color(activity, text_color)?;
142
143 Ok(())
144 };
145
146 // 事件循环
147 loop {
148 let event = read_message(activity.event_stream())?;
149 let event_type = event["type"].as_str().unwrap_or("");
150 let event_value = &event["value"];
151
152 match event_type {
153 "destroy" => {
154 // Activity 已被系统销毁,直接退出即可
155 println!("\n✓ Activity 已关闭");
156 return Ok(());
157 },
158 "itemselected" => {
159 let view_id = event_value["id"].as_i64().unwrap_or(-1);
160 let index = event_value["index"].as_i64().unwrap_or(0) as usize;
161
162 if view_id == brand_spinner.id() {
163 // 品牌选择
164 if index > 0 && index < brands.len() {
165 let brand = brands[index];
166 brand_selection = brand.to_string();
167 println!("📱 品牌: {}", brand);
168
169 // 根据品牌更新型号列表
170 let models: Vec<&str> = match brand {
171 "Apple" => vec!["请选择", "iPhone 15 Pro Max", "iPhone 15 Pro", "iPhone 15", "iPhone 14"],
172 "Samsung" => vec!["请选择", "Galaxy S24 Ultra", "Galaxy S24+", "Galaxy S24", "Galaxy Z Fold5"],
173 "Huawei" => vec!["请选择", "Mate 60 Pro", "Mate 60", "P60 Pro", "P60"],
174 "Xiaomi" => vec!["请选择", "14 Ultra", "14 Pro", "14", "13T Pro"],
175 "OPPO" => vec!["请选择", "Find X7 Ultra", "Find X7", "Reno 11 Pro", "Reno 11"],
176 "Vivo" => vec!["请选择", "X100 Pro", "X100", "S18 Pro", "S18"],
177 _ => vec!["请选择"],
178 };
179
180 // 更新型号 Spinner
181 model_spinner.set_list(&mut activity, &models)?;
182 model_spinner.refresh(&mut activity)?;
183
184 // 重置型号选择
185 model_selection.clear();
186 } else {
187 brand_selection.clear();
188 }
189 } else if view_id == model_spinner.id() {
190 // 型号选择
191 if index > 0 {
192 let models_list: Vec<&str> = match brand_selection.as_str() {
193 "Apple" => vec!["", "iPhone 15 Pro Max", "iPhone 15 Pro", "iPhone 15", "iPhone 14"],
194 "Samsung" => vec!["", "Galaxy S24 Ultra", "Galaxy S24+", "Galaxy S24", "Galaxy Z Fold5"],
195 "Huawei" => vec!["", "Mate 60 Pro", "Mate 60", "P60 Pro", "P60"],
196 "Xiaomi" => vec!["", "14 Ultra", "14 Pro", "14", "13T Pro"],
197 "OPPO" => vec!["", "Find X7 Ultra", "Find X7", "Reno 11 Pro", "Reno 11"],
198 "Vivo" => vec!["", "X100 Pro", "X100", "S18 Pro", "S18"],
199 _ => vec![""],
200 };
201
202 if index < models_list.len() {
203 let model = models_list[index];
204 model_selection = model.to_string();
205 println!("📱 型号: {}", model);
206 }
207 } else {
208 model_selection.clear();
209 }
210 } else if view_id == storage_spinner.id() {
211 // 容量选择
212 if index > 0 && index < storages.len() {
213 let storage = storages[index];
214 storage_selection = storage.to_string();
215 println!("💾 容量: {}", storage);
216 } else {
217 storage_selection.clear();
218 }
219 } else if view_id == color_spinner.id() {
220 // 颜色选择
221 if index > 0 && index < colors.len() {
222 let color = colors[index];
223 color_selection = color.to_string();
224 println!("🎨 颜色: {}", color);
225 } else {
226 color_selection.clear();
227 }
228 }
229
230 // 更新结果显示
231 update_result(&mut activity, &result,
232 &brand_selection, &model_selection,
233 &storage_selection, &color_selection)?;
234 },
235 "click" => {
236 let clicked_id = event_value["id"].as_i64().unwrap_or(-1);
237
238 if clicked_id == submit_btn.id() {
239 let all_selected = !brand_selection.is_empty()
240 && !model_selection.is_empty()
241 && !storage_selection.is_empty()
242 && !color_selection.is_empty();
243
244 if all_selected {
245 let order_info = format!(
246 "🎉 订购成功!\n\n品牌: {}\n型号: {}\n容量: {}\n颜色: {}\n\n感谢您的订购!",
247 brand_selection, model_selection, storage_selection, color_selection
248 );
249
250 println!("\n{}", order_info);
251
252 result.set_text(&mut activity, &order_info)?;
253 result.set_text_color(&mut activity, 0xFF2196F3u32 as i32)?;
254 } else {
255 println!("⚠️ 请完成所有选择!");
256 }
257 }
258 },
259 _ => {}
260 }
261 }
262}Sourcepub fn view(&self) -> &View
pub fn view(&self) -> &View
Get the underlying View
Examples found in repository?
examples/spinner_demo_v2.rs (line 37)
8fn main() -> Result<()> {
9 println!("=== Spinner 下拉列表演示 (新库版本) ===\n");
10
11 // 创建 Activity(全屏模式)
12 let mut activity = Activity::new(false)?;
13 println!("✓ 连接建立\n");
14
15 // 创建 NestedScrollView 作为根布局(支持滚动)
16 let scroll = activity.create_nested_scroll_view(None)?;
17
18 // 创建主布局(放在 ScrollView 内)
19 let layout = activity.create_linear_layout(Some(scroll.id()))?;
20 layout.view().set_margin(&mut activity, 20)?;
21
22 // 标题
23 let title = activity.create_text_view("📱 手机订购向导", Some(layout.id()))?;
24 title.set_text_size(&mut activity, 24)?;
25 title.view().set_height_wrap_content(&mut activity)?;
26 title.view().set_linear_layout_params(&mut activity, 0, None)?;
27
28 // ========== 品牌选择 ==========
29 let brand_label = activity.create_text_view("选择品牌:", Some(layout.id()))?;
30 brand_label.set_text_size(&mut activity, 18)?;
31 brand_label.view().set_margin(&mut activity, 10)?;
32 brand_label.view().set_height_wrap_content(&mut activity)?;
33 brand_label.view().set_linear_layout_params(&mut activity, 0, None)?;
34
35 let brands = vec!["请选择", "Apple", "Samsung", "Huawei", "Xiaomi", "OPPO", "Vivo"];
36 let brand_spinner = activity.create_spinner(Some(layout.id()))?;
37 brand_spinner.view().set_width_match_parent(&mut activity)?;
38 brand_spinner.view().set_height_wrap_content(&mut activity)?;
39 brand_spinner.view().set_linear_layout_params(&mut activity, 0, None)?;
40 brand_spinner.set_list(&mut activity, &brands)?;
41 brand_spinner.refresh(&mut activity)?;
42
43 // ========== 型号选择 ==========
44 let model_label = activity.create_text_view("选择型号:", Some(layout.id()))?;
45 model_label.set_text_size(&mut activity, 18)?;
46 model_label.view().set_margin(&mut activity, 10)?;
47 model_label.view().set_height_wrap_content(&mut activity)?;
48 model_label.view().set_linear_layout_params(&mut activity, 0, None)?;
49
50 let model_spinner = activity.create_spinner(Some(layout.id()))?;
51 model_spinner.view().set_width_match_parent(&mut activity)?;
52 model_spinner.view().set_height_wrap_content(&mut activity)?;
53 model_spinner.view().set_linear_layout_params(&mut activity, 0, None)?;
54 model_spinner.set_list(&mut activity, &["请先选择品牌"])?;
55 model_spinner.refresh(&mut activity)?;
56
57 // ========== 容量选择 ==========
58 let storage_label = activity.create_text_view("选择容量:", Some(layout.id()))?;
59 storage_label.set_text_size(&mut activity, 18)?;
60 storage_label.view().set_margin(&mut activity, 10)?;
61 storage_label.view().set_height_wrap_content(&mut activity)?;
62 storage_label.view().set_linear_layout_params(&mut activity, 0, None)?;
63
64 let storages = vec!["请选择", "64GB", "128GB", "256GB", "512GB", "1TB"];
65 let storage_spinner = activity.create_spinner(Some(layout.id()))?;
66 storage_spinner.view().set_width_match_parent(&mut activity)?;
67 storage_spinner.view().set_height_wrap_content(&mut activity)?;
68 storage_spinner.view().set_linear_layout_params(&mut activity, 0, None)?;
69 storage_spinner.set_list(&mut activity, &storages)?;
70 storage_spinner.refresh(&mut activity)?;
71
72 // ========== 颜色选择 ==========
73 let color_label = activity.create_text_view("选择颜色:", Some(layout.id()))?;
74 color_label.set_text_size(&mut activity, 18)?;
75 color_label.view().set_margin(&mut activity, 10)?;
76 color_label.view().set_height_wrap_content(&mut activity)?;
77 color_label.view().set_linear_layout_params(&mut activity, 0, None)?;
78
79 let colors = vec!["请选择", "黑色", "白色", "金色", "银色", "蓝色", "紫色", "绿色"];
80 let color_spinner = activity.create_spinner(Some(layout.id()))?;
81 color_spinner.view().set_width_match_parent(&mut activity)?;
82 color_spinner.view().set_height_wrap_content(&mut activity)?;
83 color_spinner.view().set_linear_layout_params(&mut activity, 0, None)?;
84 color_spinner.set_list(&mut activity, &colors)?;
85 color_spinner.refresh(&mut activity)?;
86
87 // ========== 结果显示 ==========
88 let result = activity.create_text_view("请完成选择", Some(layout.id()))?;
89 result.set_text_size(&mut activity, 16)?;
90 result.set_text_color(&mut activity, 0xFF666666u32 as i32)?;
91 result.view().set_margin(&mut activity, 10)?;
92 result.view().set_height_wrap_content(&mut activity)?;
93 result.view().set_linear_layout_params(&mut activity, 0, None)?;
94
95 // ========== 提交按钮 ==========
96 let submit_btn = activity.create_button("🛒 确认订购", Some(layout.id()))?;
97 submit_btn.view().set_margin(&mut activity, 10)?;
98 submit_btn.view().set_height_wrap_content(&mut activity)?;
99 submit_btn.view().set_linear_layout_params(&mut activity, 0, None)?;
100
101 println!("✓ 界面创建完成\n");
102 println!("━━━━━━━━━━━━━━━━━━━━━━");
103 println!("提示: 从下拉列表中选择");
104 println!("━━━━━━━━━━━━━━━━━━━━━━\n");
105
106 // 选择状态
107 let mut brand_selection = String::new();
108 let mut model_selection = String::new();
109 let mut storage_selection = String::new();
110 let mut color_selection = String::new();
111
112 // 更新结果显示的辅助函数
113 let update_result = |activity: &mut Activity,
114 result: &TextView,
115 brand: &str,
116 model: &str,
117 storage: &str,
118 color: &str| -> Result<()> {
119 let all_selected = !brand.is_empty() && !model.is_empty()
120 && !storage.is_empty() && !color.is_empty();
121
122 let result_text = if all_selected {
123 format!("✅ 已选择:\n品牌: {}\n型号: {}\n容量: {}\n颜色: {}",
124 brand, model, storage, color)
125 } else {
126 let mut missing = Vec::new();
127 if brand.is_empty() { missing.push("品牌"); }
128 if model.is_empty() { missing.push("型号"); }
129 if storage.is_empty() { missing.push("容量"); }
130 if color.is_empty() { missing.push("颜色"); }
131 format!("⚠️ 待选择: {}", missing.join(", "))
132 };
133
134 result.set_text(activity, &result_text)?;
135
136 let text_color = if all_selected {
137 0xFF4CAF50u32 as i32 // 绿色
138 } else {
139 0xFF666666u32 as i32 // 灰色
140 };
141 result.set_text_color(activity, text_color)?;
142
143 Ok(())
144 };
145
146 // 事件循环
147 loop {
148 let event = read_message(activity.event_stream())?;
149 let event_type = event["type"].as_str().unwrap_or("");
150 let event_value = &event["value"];
151
152 match event_type {
153 "destroy" => {
154 // Activity 已被系统销毁,直接退出即可
155 println!("\n✓ Activity 已关闭");
156 return Ok(());
157 },
158 "itemselected" => {
159 let view_id = event_value["id"].as_i64().unwrap_or(-1);
160 let index = event_value["index"].as_i64().unwrap_or(0) as usize;
161
162 if view_id == brand_spinner.id() {
163 // 品牌选择
164 if index > 0 && index < brands.len() {
165 let brand = brands[index];
166 brand_selection = brand.to_string();
167 println!("📱 品牌: {}", brand);
168
169 // 根据品牌更新型号列表
170 let models: Vec<&str> = match brand {
171 "Apple" => vec!["请选择", "iPhone 15 Pro Max", "iPhone 15 Pro", "iPhone 15", "iPhone 14"],
172 "Samsung" => vec!["请选择", "Galaxy S24 Ultra", "Galaxy S24+", "Galaxy S24", "Galaxy Z Fold5"],
173 "Huawei" => vec!["请选择", "Mate 60 Pro", "Mate 60", "P60 Pro", "P60"],
174 "Xiaomi" => vec!["请选择", "14 Ultra", "14 Pro", "14", "13T Pro"],
175 "OPPO" => vec!["请选择", "Find X7 Ultra", "Find X7", "Reno 11 Pro", "Reno 11"],
176 "Vivo" => vec!["请选择", "X100 Pro", "X100", "S18 Pro", "S18"],
177 _ => vec!["请选择"],
178 };
179
180 // 更新型号 Spinner
181 model_spinner.set_list(&mut activity, &models)?;
182 model_spinner.refresh(&mut activity)?;
183
184 // 重置型号选择
185 model_selection.clear();
186 } else {
187 brand_selection.clear();
188 }
189 } else if view_id == model_spinner.id() {
190 // 型号选择
191 if index > 0 {
192 let models_list: Vec<&str> = match brand_selection.as_str() {
193 "Apple" => vec!["", "iPhone 15 Pro Max", "iPhone 15 Pro", "iPhone 15", "iPhone 14"],
194 "Samsung" => vec!["", "Galaxy S24 Ultra", "Galaxy S24+", "Galaxy S24", "Galaxy Z Fold5"],
195 "Huawei" => vec!["", "Mate 60 Pro", "Mate 60", "P60 Pro", "P60"],
196 "Xiaomi" => vec!["", "14 Ultra", "14 Pro", "14", "13T Pro"],
197 "OPPO" => vec!["", "Find X7 Ultra", "Find X7", "Reno 11 Pro", "Reno 11"],
198 "Vivo" => vec!["", "X100 Pro", "X100", "S18 Pro", "S18"],
199 _ => vec![""],
200 };
201
202 if index < models_list.len() {
203 let model = models_list[index];
204 model_selection = model.to_string();
205 println!("📱 型号: {}", model);
206 }
207 } else {
208 model_selection.clear();
209 }
210 } else if view_id == storage_spinner.id() {
211 // 容量选择
212 if index > 0 && index < storages.len() {
213 let storage = storages[index];
214 storage_selection = storage.to_string();
215 println!("💾 容量: {}", storage);
216 } else {
217 storage_selection.clear();
218 }
219 } else if view_id == color_spinner.id() {
220 // 颜色选择
221 if index > 0 && index < colors.len() {
222 let color = colors[index];
223 color_selection = color.to_string();
224 println!("🎨 颜色: {}", color);
225 } else {
226 color_selection.clear();
227 }
228 }
229
230 // 更新结果显示
231 update_result(&mut activity, &result,
232 &brand_selection, &model_selection,
233 &storage_selection, &color_selection)?;
234 },
235 "click" => {
236 let clicked_id = event_value["id"].as_i64().unwrap_or(-1);
237
238 if clicked_id == submit_btn.id() {
239 let all_selected = !brand_selection.is_empty()
240 && !model_selection.is_empty()
241 && !storage_selection.is_empty()
242 && !color_selection.is_empty();
243
244 if all_selected {
245 let order_info = format!(
246 "🎉 订购成功!\n\n品牌: {}\n型号: {}\n容量: {}\n颜色: {}\n\n感谢您的订购!",
247 brand_selection, model_selection, storage_selection, color_selection
248 );
249
250 println!("\n{}", order_info);
251
252 result.set_text(&mut activity, &order_info)?;
253 result.set_text_color(&mut activity, 0xFF2196F3u32 as i32)?;
254 } else {
255 println!("⚠️ 请完成所有选择!");
256 }
257 }
258 },
259 _ => {}
260 }
261 }
262}Sourcepub fn set_list(&self, activity: &mut Activity, items: &[&str]) -> Result<()>
pub fn set_list(&self, activity: &mut Activity, items: &[&str]) -> Result<()>
Set the list of options
Examples found in repository?
examples/spinner_demo_v2.rs (line 40)
8fn main() -> Result<()> {
9 println!("=== Spinner 下拉列表演示 (新库版本) ===\n");
10
11 // 创建 Activity(全屏模式)
12 let mut activity = Activity::new(false)?;
13 println!("✓ 连接建立\n");
14
15 // 创建 NestedScrollView 作为根布局(支持滚动)
16 let scroll = activity.create_nested_scroll_view(None)?;
17
18 // 创建主布局(放在 ScrollView 内)
19 let layout = activity.create_linear_layout(Some(scroll.id()))?;
20 layout.view().set_margin(&mut activity, 20)?;
21
22 // 标题
23 let title = activity.create_text_view("📱 手机订购向导", Some(layout.id()))?;
24 title.set_text_size(&mut activity, 24)?;
25 title.view().set_height_wrap_content(&mut activity)?;
26 title.view().set_linear_layout_params(&mut activity, 0, None)?;
27
28 // ========== 品牌选择 ==========
29 let brand_label = activity.create_text_view("选择品牌:", Some(layout.id()))?;
30 brand_label.set_text_size(&mut activity, 18)?;
31 brand_label.view().set_margin(&mut activity, 10)?;
32 brand_label.view().set_height_wrap_content(&mut activity)?;
33 brand_label.view().set_linear_layout_params(&mut activity, 0, None)?;
34
35 let brands = vec!["请选择", "Apple", "Samsung", "Huawei", "Xiaomi", "OPPO", "Vivo"];
36 let brand_spinner = activity.create_spinner(Some(layout.id()))?;
37 brand_spinner.view().set_width_match_parent(&mut activity)?;
38 brand_spinner.view().set_height_wrap_content(&mut activity)?;
39 brand_spinner.view().set_linear_layout_params(&mut activity, 0, None)?;
40 brand_spinner.set_list(&mut activity, &brands)?;
41 brand_spinner.refresh(&mut activity)?;
42
43 // ========== 型号选择 ==========
44 let model_label = activity.create_text_view("选择型号:", Some(layout.id()))?;
45 model_label.set_text_size(&mut activity, 18)?;
46 model_label.view().set_margin(&mut activity, 10)?;
47 model_label.view().set_height_wrap_content(&mut activity)?;
48 model_label.view().set_linear_layout_params(&mut activity, 0, None)?;
49
50 let model_spinner = activity.create_spinner(Some(layout.id()))?;
51 model_spinner.view().set_width_match_parent(&mut activity)?;
52 model_spinner.view().set_height_wrap_content(&mut activity)?;
53 model_spinner.view().set_linear_layout_params(&mut activity, 0, None)?;
54 model_spinner.set_list(&mut activity, &["请先选择品牌"])?;
55 model_spinner.refresh(&mut activity)?;
56
57 // ========== 容量选择 ==========
58 let storage_label = activity.create_text_view("选择容量:", Some(layout.id()))?;
59 storage_label.set_text_size(&mut activity, 18)?;
60 storage_label.view().set_margin(&mut activity, 10)?;
61 storage_label.view().set_height_wrap_content(&mut activity)?;
62 storage_label.view().set_linear_layout_params(&mut activity, 0, None)?;
63
64 let storages = vec!["请选择", "64GB", "128GB", "256GB", "512GB", "1TB"];
65 let storage_spinner = activity.create_spinner(Some(layout.id()))?;
66 storage_spinner.view().set_width_match_parent(&mut activity)?;
67 storage_spinner.view().set_height_wrap_content(&mut activity)?;
68 storage_spinner.view().set_linear_layout_params(&mut activity, 0, None)?;
69 storage_spinner.set_list(&mut activity, &storages)?;
70 storage_spinner.refresh(&mut activity)?;
71
72 // ========== 颜色选择 ==========
73 let color_label = activity.create_text_view("选择颜色:", Some(layout.id()))?;
74 color_label.set_text_size(&mut activity, 18)?;
75 color_label.view().set_margin(&mut activity, 10)?;
76 color_label.view().set_height_wrap_content(&mut activity)?;
77 color_label.view().set_linear_layout_params(&mut activity, 0, None)?;
78
79 let colors = vec!["请选择", "黑色", "白色", "金色", "银色", "蓝色", "紫色", "绿色"];
80 let color_spinner = activity.create_spinner(Some(layout.id()))?;
81 color_spinner.view().set_width_match_parent(&mut activity)?;
82 color_spinner.view().set_height_wrap_content(&mut activity)?;
83 color_spinner.view().set_linear_layout_params(&mut activity, 0, None)?;
84 color_spinner.set_list(&mut activity, &colors)?;
85 color_spinner.refresh(&mut activity)?;
86
87 // ========== 结果显示 ==========
88 let result = activity.create_text_view("请完成选择", Some(layout.id()))?;
89 result.set_text_size(&mut activity, 16)?;
90 result.set_text_color(&mut activity, 0xFF666666u32 as i32)?;
91 result.view().set_margin(&mut activity, 10)?;
92 result.view().set_height_wrap_content(&mut activity)?;
93 result.view().set_linear_layout_params(&mut activity, 0, None)?;
94
95 // ========== 提交按钮 ==========
96 let submit_btn = activity.create_button("🛒 确认订购", Some(layout.id()))?;
97 submit_btn.view().set_margin(&mut activity, 10)?;
98 submit_btn.view().set_height_wrap_content(&mut activity)?;
99 submit_btn.view().set_linear_layout_params(&mut activity, 0, None)?;
100
101 println!("✓ 界面创建完成\n");
102 println!("━━━━━━━━━━━━━━━━━━━━━━");
103 println!("提示: 从下拉列表中选择");
104 println!("━━━━━━━━━━━━━━━━━━━━━━\n");
105
106 // 选择状态
107 let mut brand_selection = String::new();
108 let mut model_selection = String::new();
109 let mut storage_selection = String::new();
110 let mut color_selection = String::new();
111
112 // 更新结果显示的辅助函数
113 let update_result = |activity: &mut Activity,
114 result: &TextView,
115 brand: &str,
116 model: &str,
117 storage: &str,
118 color: &str| -> Result<()> {
119 let all_selected = !brand.is_empty() && !model.is_empty()
120 && !storage.is_empty() && !color.is_empty();
121
122 let result_text = if all_selected {
123 format!("✅ 已选择:\n品牌: {}\n型号: {}\n容量: {}\n颜色: {}",
124 brand, model, storage, color)
125 } else {
126 let mut missing = Vec::new();
127 if brand.is_empty() { missing.push("品牌"); }
128 if model.is_empty() { missing.push("型号"); }
129 if storage.is_empty() { missing.push("容量"); }
130 if color.is_empty() { missing.push("颜色"); }
131 format!("⚠️ 待选择: {}", missing.join(", "))
132 };
133
134 result.set_text(activity, &result_text)?;
135
136 let text_color = if all_selected {
137 0xFF4CAF50u32 as i32 // 绿色
138 } else {
139 0xFF666666u32 as i32 // 灰色
140 };
141 result.set_text_color(activity, text_color)?;
142
143 Ok(())
144 };
145
146 // 事件循环
147 loop {
148 let event = read_message(activity.event_stream())?;
149 let event_type = event["type"].as_str().unwrap_or("");
150 let event_value = &event["value"];
151
152 match event_type {
153 "destroy" => {
154 // Activity 已被系统销毁,直接退出即可
155 println!("\n✓ Activity 已关闭");
156 return Ok(());
157 },
158 "itemselected" => {
159 let view_id = event_value["id"].as_i64().unwrap_or(-1);
160 let index = event_value["index"].as_i64().unwrap_or(0) as usize;
161
162 if view_id == brand_spinner.id() {
163 // 品牌选择
164 if index > 0 && index < brands.len() {
165 let brand = brands[index];
166 brand_selection = brand.to_string();
167 println!("📱 品牌: {}", brand);
168
169 // 根据品牌更新型号列表
170 let models: Vec<&str> = match brand {
171 "Apple" => vec!["请选择", "iPhone 15 Pro Max", "iPhone 15 Pro", "iPhone 15", "iPhone 14"],
172 "Samsung" => vec!["请选择", "Galaxy S24 Ultra", "Galaxy S24+", "Galaxy S24", "Galaxy Z Fold5"],
173 "Huawei" => vec!["请选择", "Mate 60 Pro", "Mate 60", "P60 Pro", "P60"],
174 "Xiaomi" => vec!["请选择", "14 Ultra", "14 Pro", "14", "13T Pro"],
175 "OPPO" => vec!["请选择", "Find X7 Ultra", "Find X7", "Reno 11 Pro", "Reno 11"],
176 "Vivo" => vec!["请选择", "X100 Pro", "X100", "S18 Pro", "S18"],
177 _ => vec!["请选择"],
178 };
179
180 // 更新型号 Spinner
181 model_spinner.set_list(&mut activity, &models)?;
182 model_spinner.refresh(&mut activity)?;
183
184 // 重置型号选择
185 model_selection.clear();
186 } else {
187 brand_selection.clear();
188 }
189 } else if view_id == model_spinner.id() {
190 // 型号选择
191 if index > 0 {
192 let models_list: Vec<&str> = match brand_selection.as_str() {
193 "Apple" => vec!["", "iPhone 15 Pro Max", "iPhone 15 Pro", "iPhone 15", "iPhone 14"],
194 "Samsung" => vec!["", "Galaxy S24 Ultra", "Galaxy S24+", "Galaxy S24", "Galaxy Z Fold5"],
195 "Huawei" => vec!["", "Mate 60 Pro", "Mate 60", "P60 Pro", "P60"],
196 "Xiaomi" => vec!["", "14 Ultra", "14 Pro", "14", "13T Pro"],
197 "OPPO" => vec!["", "Find X7 Ultra", "Find X7", "Reno 11 Pro", "Reno 11"],
198 "Vivo" => vec!["", "X100 Pro", "X100", "S18 Pro", "S18"],
199 _ => vec![""],
200 };
201
202 if index < models_list.len() {
203 let model = models_list[index];
204 model_selection = model.to_string();
205 println!("📱 型号: {}", model);
206 }
207 } else {
208 model_selection.clear();
209 }
210 } else if view_id == storage_spinner.id() {
211 // 容量选择
212 if index > 0 && index < storages.len() {
213 let storage = storages[index];
214 storage_selection = storage.to_string();
215 println!("💾 容量: {}", storage);
216 } else {
217 storage_selection.clear();
218 }
219 } else if view_id == color_spinner.id() {
220 // 颜色选择
221 if index > 0 && index < colors.len() {
222 let color = colors[index];
223 color_selection = color.to_string();
224 println!("🎨 颜色: {}", color);
225 } else {
226 color_selection.clear();
227 }
228 }
229
230 // 更新结果显示
231 update_result(&mut activity, &result,
232 &brand_selection, &model_selection,
233 &storage_selection, &color_selection)?;
234 },
235 "click" => {
236 let clicked_id = event_value["id"].as_i64().unwrap_or(-1);
237
238 if clicked_id == submit_btn.id() {
239 let all_selected = !brand_selection.is_empty()
240 && !model_selection.is_empty()
241 && !storage_selection.is_empty()
242 && !color_selection.is_empty();
243
244 if all_selected {
245 let order_info = format!(
246 "🎉 订购成功!\n\n品牌: {}\n型号: {}\n容量: {}\n颜色: {}\n\n感谢您的订购!",
247 brand_selection, model_selection, storage_selection, color_selection
248 );
249
250 println!("\n{}", order_info);
251
252 result.set_text(&mut activity, &order_info)?;
253 result.set_text_color(&mut activity, 0xFF2196F3u32 as i32)?;
254 } else {
255 println!("⚠️ 请完成所有选择!");
256 }
257 }
258 },
259 _ => {}
260 }
261 }
262}Sourcepub fn refresh(&self, activity: &mut Activity) -> Result<()>
pub fn refresh(&self, activity: &mut Activity) -> Result<()>
Refresh the spinner (needed after setList to ensure display is updated)
Examples found in repository?
examples/spinner_demo_v2.rs (line 41)
8fn main() -> Result<()> {
9 println!("=== Spinner 下拉列表演示 (新库版本) ===\n");
10
11 // 创建 Activity(全屏模式)
12 let mut activity = Activity::new(false)?;
13 println!("✓ 连接建立\n");
14
15 // 创建 NestedScrollView 作为根布局(支持滚动)
16 let scroll = activity.create_nested_scroll_view(None)?;
17
18 // 创建主布局(放在 ScrollView 内)
19 let layout = activity.create_linear_layout(Some(scroll.id()))?;
20 layout.view().set_margin(&mut activity, 20)?;
21
22 // 标题
23 let title = activity.create_text_view("📱 手机订购向导", Some(layout.id()))?;
24 title.set_text_size(&mut activity, 24)?;
25 title.view().set_height_wrap_content(&mut activity)?;
26 title.view().set_linear_layout_params(&mut activity, 0, None)?;
27
28 // ========== 品牌选择 ==========
29 let brand_label = activity.create_text_view("选择品牌:", Some(layout.id()))?;
30 brand_label.set_text_size(&mut activity, 18)?;
31 brand_label.view().set_margin(&mut activity, 10)?;
32 brand_label.view().set_height_wrap_content(&mut activity)?;
33 brand_label.view().set_linear_layout_params(&mut activity, 0, None)?;
34
35 let brands = vec!["请选择", "Apple", "Samsung", "Huawei", "Xiaomi", "OPPO", "Vivo"];
36 let brand_spinner = activity.create_spinner(Some(layout.id()))?;
37 brand_spinner.view().set_width_match_parent(&mut activity)?;
38 brand_spinner.view().set_height_wrap_content(&mut activity)?;
39 brand_spinner.view().set_linear_layout_params(&mut activity, 0, None)?;
40 brand_spinner.set_list(&mut activity, &brands)?;
41 brand_spinner.refresh(&mut activity)?;
42
43 // ========== 型号选择 ==========
44 let model_label = activity.create_text_view("选择型号:", Some(layout.id()))?;
45 model_label.set_text_size(&mut activity, 18)?;
46 model_label.view().set_margin(&mut activity, 10)?;
47 model_label.view().set_height_wrap_content(&mut activity)?;
48 model_label.view().set_linear_layout_params(&mut activity, 0, None)?;
49
50 let model_spinner = activity.create_spinner(Some(layout.id()))?;
51 model_spinner.view().set_width_match_parent(&mut activity)?;
52 model_spinner.view().set_height_wrap_content(&mut activity)?;
53 model_spinner.view().set_linear_layout_params(&mut activity, 0, None)?;
54 model_spinner.set_list(&mut activity, &["请先选择品牌"])?;
55 model_spinner.refresh(&mut activity)?;
56
57 // ========== 容量选择 ==========
58 let storage_label = activity.create_text_view("选择容量:", Some(layout.id()))?;
59 storage_label.set_text_size(&mut activity, 18)?;
60 storage_label.view().set_margin(&mut activity, 10)?;
61 storage_label.view().set_height_wrap_content(&mut activity)?;
62 storage_label.view().set_linear_layout_params(&mut activity, 0, None)?;
63
64 let storages = vec!["请选择", "64GB", "128GB", "256GB", "512GB", "1TB"];
65 let storage_spinner = activity.create_spinner(Some(layout.id()))?;
66 storage_spinner.view().set_width_match_parent(&mut activity)?;
67 storage_spinner.view().set_height_wrap_content(&mut activity)?;
68 storage_spinner.view().set_linear_layout_params(&mut activity, 0, None)?;
69 storage_spinner.set_list(&mut activity, &storages)?;
70 storage_spinner.refresh(&mut activity)?;
71
72 // ========== 颜色选择 ==========
73 let color_label = activity.create_text_view("选择颜色:", Some(layout.id()))?;
74 color_label.set_text_size(&mut activity, 18)?;
75 color_label.view().set_margin(&mut activity, 10)?;
76 color_label.view().set_height_wrap_content(&mut activity)?;
77 color_label.view().set_linear_layout_params(&mut activity, 0, None)?;
78
79 let colors = vec!["请选择", "黑色", "白色", "金色", "银色", "蓝色", "紫色", "绿色"];
80 let color_spinner = activity.create_spinner(Some(layout.id()))?;
81 color_spinner.view().set_width_match_parent(&mut activity)?;
82 color_spinner.view().set_height_wrap_content(&mut activity)?;
83 color_spinner.view().set_linear_layout_params(&mut activity, 0, None)?;
84 color_spinner.set_list(&mut activity, &colors)?;
85 color_spinner.refresh(&mut activity)?;
86
87 // ========== 结果显示 ==========
88 let result = activity.create_text_view("请完成选择", Some(layout.id()))?;
89 result.set_text_size(&mut activity, 16)?;
90 result.set_text_color(&mut activity, 0xFF666666u32 as i32)?;
91 result.view().set_margin(&mut activity, 10)?;
92 result.view().set_height_wrap_content(&mut activity)?;
93 result.view().set_linear_layout_params(&mut activity, 0, None)?;
94
95 // ========== 提交按钮 ==========
96 let submit_btn = activity.create_button("🛒 确认订购", Some(layout.id()))?;
97 submit_btn.view().set_margin(&mut activity, 10)?;
98 submit_btn.view().set_height_wrap_content(&mut activity)?;
99 submit_btn.view().set_linear_layout_params(&mut activity, 0, None)?;
100
101 println!("✓ 界面创建完成\n");
102 println!("━━━━━━━━━━━━━━━━━━━━━━");
103 println!("提示: 从下拉列表中选择");
104 println!("━━━━━━━━━━━━━━━━━━━━━━\n");
105
106 // 选择状态
107 let mut brand_selection = String::new();
108 let mut model_selection = String::new();
109 let mut storage_selection = String::new();
110 let mut color_selection = String::new();
111
112 // 更新结果显示的辅助函数
113 let update_result = |activity: &mut Activity,
114 result: &TextView,
115 brand: &str,
116 model: &str,
117 storage: &str,
118 color: &str| -> Result<()> {
119 let all_selected = !brand.is_empty() && !model.is_empty()
120 && !storage.is_empty() && !color.is_empty();
121
122 let result_text = if all_selected {
123 format!("✅ 已选择:\n品牌: {}\n型号: {}\n容量: {}\n颜色: {}",
124 brand, model, storage, color)
125 } else {
126 let mut missing = Vec::new();
127 if brand.is_empty() { missing.push("品牌"); }
128 if model.is_empty() { missing.push("型号"); }
129 if storage.is_empty() { missing.push("容量"); }
130 if color.is_empty() { missing.push("颜色"); }
131 format!("⚠️ 待选择: {}", missing.join(", "))
132 };
133
134 result.set_text(activity, &result_text)?;
135
136 let text_color = if all_selected {
137 0xFF4CAF50u32 as i32 // 绿色
138 } else {
139 0xFF666666u32 as i32 // 灰色
140 };
141 result.set_text_color(activity, text_color)?;
142
143 Ok(())
144 };
145
146 // 事件循环
147 loop {
148 let event = read_message(activity.event_stream())?;
149 let event_type = event["type"].as_str().unwrap_or("");
150 let event_value = &event["value"];
151
152 match event_type {
153 "destroy" => {
154 // Activity 已被系统销毁,直接退出即可
155 println!("\n✓ Activity 已关闭");
156 return Ok(());
157 },
158 "itemselected" => {
159 let view_id = event_value["id"].as_i64().unwrap_or(-1);
160 let index = event_value["index"].as_i64().unwrap_or(0) as usize;
161
162 if view_id == brand_spinner.id() {
163 // 品牌选择
164 if index > 0 && index < brands.len() {
165 let brand = brands[index];
166 brand_selection = brand.to_string();
167 println!("📱 品牌: {}", brand);
168
169 // 根据品牌更新型号列表
170 let models: Vec<&str> = match brand {
171 "Apple" => vec!["请选择", "iPhone 15 Pro Max", "iPhone 15 Pro", "iPhone 15", "iPhone 14"],
172 "Samsung" => vec!["请选择", "Galaxy S24 Ultra", "Galaxy S24+", "Galaxy S24", "Galaxy Z Fold5"],
173 "Huawei" => vec!["请选择", "Mate 60 Pro", "Mate 60", "P60 Pro", "P60"],
174 "Xiaomi" => vec!["请选择", "14 Ultra", "14 Pro", "14", "13T Pro"],
175 "OPPO" => vec!["请选择", "Find X7 Ultra", "Find X7", "Reno 11 Pro", "Reno 11"],
176 "Vivo" => vec!["请选择", "X100 Pro", "X100", "S18 Pro", "S18"],
177 _ => vec!["请选择"],
178 };
179
180 // 更新型号 Spinner
181 model_spinner.set_list(&mut activity, &models)?;
182 model_spinner.refresh(&mut activity)?;
183
184 // 重置型号选择
185 model_selection.clear();
186 } else {
187 brand_selection.clear();
188 }
189 } else if view_id == model_spinner.id() {
190 // 型号选择
191 if index > 0 {
192 let models_list: Vec<&str> = match brand_selection.as_str() {
193 "Apple" => vec!["", "iPhone 15 Pro Max", "iPhone 15 Pro", "iPhone 15", "iPhone 14"],
194 "Samsung" => vec!["", "Galaxy S24 Ultra", "Galaxy S24+", "Galaxy S24", "Galaxy Z Fold5"],
195 "Huawei" => vec!["", "Mate 60 Pro", "Mate 60", "P60 Pro", "P60"],
196 "Xiaomi" => vec!["", "14 Ultra", "14 Pro", "14", "13T Pro"],
197 "OPPO" => vec!["", "Find X7 Ultra", "Find X7", "Reno 11 Pro", "Reno 11"],
198 "Vivo" => vec!["", "X100 Pro", "X100", "S18 Pro", "S18"],
199 _ => vec![""],
200 };
201
202 if index < models_list.len() {
203 let model = models_list[index];
204 model_selection = model.to_string();
205 println!("📱 型号: {}", model);
206 }
207 } else {
208 model_selection.clear();
209 }
210 } else if view_id == storage_spinner.id() {
211 // 容量选择
212 if index > 0 && index < storages.len() {
213 let storage = storages[index];
214 storage_selection = storage.to_string();
215 println!("💾 容量: {}", storage);
216 } else {
217 storage_selection.clear();
218 }
219 } else if view_id == color_spinner.id() {
220 // 颜色选择
221 if index > 0 && index < colors.len() {
222 let color = colors[index];
223 color_selection = color.to_string();
224 println!("🎨 颜色: {}", color);
225 } else {
226 color_selection.clear();
227 }
228 }
229
230 // 更新结果显示
231 update_result(&mut activity, &result,
232 &brand_selection, &model_selection,
233 &storage_selection, &color_selection)?;
234 },
235 "click" => {
236 let clicked_id = event_value["id"].as_i64().unwrap_or(-1);
237
238 if clicked_id == submit_btn.id() {
239 let all_selected = !brand_selection.is_empty()
240 && !model_selection.is_empty()
241 && !storage_selection.is_empty()
242 && !color_selection.is_empty();
243
244 if all_selected {
245 let order_info = format!(
246 "🎉 订购成功!\n\n品牌: {}\n型号: {}\n容量: {}\n颜色: {}\n\n感谢您的订购!",
247 brand_selection, model_selection, storage_selection, color_selection
248 );
249
250 println!("\n{}", order_info);
251
252 result.set_text(&mut activity, &order_info)?;
253 result.set_text_color(&mut activity, 0xFF2196F3u32 as i32)?;
254 } else {
255 println!("⚠️ 请完成所有选择!");
256 }
257 }
258 },
259 _ => {}
260 }
261 }
262}Auto Trait Implementations§
impl Freeze for Spinner
impl RefUnwindSafe for Spinner
impl Send for Spinner
impl Sync for Spinner
impl Unpin for Spinner
impl UnwindSafe for Spinner
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more