pub struct NestedScrollView { /* private fields */ }Expand description
A NestedScrollView provides scrolling capability
Implementations§
Source§impl NestedScrollView
impl NestedScrollView
Sourcepub fn new(activity: &mut Activity, parent: Option<i64>) -> Result<Self>
pub fn new(activity: &mut Activity, parent: Option<i64>) -> Result<Self>
Create a new NestedScrollView
Sourcepub fn id(&self) -> i64
pub fn id(&self) -> i64
Get the view ID
Examples found in repository?
examples/image_demo_v2.rs (line 19)
8fn main() -> Result<()> {
9 println!("=== ImageView 图像显示演示 (新库版本) ===\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, 15)?;
21
22 // 创建标题
23 let title = activity.create_text_view("🖼️ 图片显示测试", Some(layout.id()))?;
24 title.set_text_size(&mut activity, 26)?;
25 title.view().set_margin(&mut activity, 10)?;
26 title.view().set_height_wrap_content(&mut activity)?;
27 title.view().set_linear_layout_params(&mut activity, 0, None)?;
28
29 // 创建说明
30 let desc = activity.create_text_view("显示一个小的测试图片", Some(layout.id()))?;
31 desc.view().set_margin(&mut activity, 5)?;
32 desc.view().set_height_wrap_content(&mut activity)?;
33 desc.view().set_linear_layout_params(&mut activity, 0, None)?;
34
35 // 创建 ImageView
36 let image_view = activity.create_image_view(Some(layout.id()))?;
37 image_view.view().set_margin(&mut activity, 10)?;
38 // ImageView 使用权重占据主要空间
39 image_view.view().set_linear_layout_params(&mut activity, 1, None)?;
40
41 // 创建一个简单的 1x1 红色像素 PNG 图片(base64编码)
42 // 这是一个最小的有效PNG文件
43 let red_pixel_png_base64 = "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8DwHwAFBQIAX8jx0gAAAABJRU5ErkJggg==";
44
45 // 设置图片
46 image_view.set_image(&mut activity, red_pixel_png_base64)?;
47
48 // 创建状态显示
49 let status = activity.create_text_view("✅ 图片已加载", Some(layout.id()))?;
50 status.view().set_margin(&mut activity, 10)?;
51 status.view().set_height_wrap_content(&mut activity)?;
52 status.view().set_linear_layout_params(&mut activity, 0, None)?;
53 status.set_text_color(&mut activity, 0xFF4CAF50u32 as i32)?;
54
55 // 创建按钮布局
56 let button_layout = activity.create_linear_layout_horizontal(Some(layout.id()))?;
57 button_layout.view().set_margin(&mut activity, 10)?;
58 button_layout.view().set_height_wrap_content(&mut activity)?;
59 button_layout.view().set_linear_layout_params(&mut activity, 0, None)?;
60
61 // 红色图片按钮
62 let red_btn = activity.create_button("🔴 红色", Some(button_layout.id()))?;
63 red_btn.view().set_linear_layout_params(&mut activity, 1, None)?;
64
65 // 绿色图片按钮
66 let green_btn = activity.create_button("🟢 绿色", Some(button_layout.id()))?;
67 green_btn.view().set_linear_layout_params(&mut activity, 1, None)?;
68
69 // 蓝色图片按钮
70 let blue_btn = activity.create_button("🔵 蓝色", Some(button_layout.id()))?;
71 blue_btn.view().set_linear_layout_params(&mut activity, 1, None)?;
72
73 println!("✓ 界面创建完成\n");
74 println!("━━━━━━━━━━━━━━━━━━━━━━");
75 println!("提示:");
76 println!(" • 点击按钮切换不同颜色的图片");
77 println!(" • 图片会自动缩放填充区域");
78 println!("━━━━━━━━━━━━━━━━━━━━━━\n");
79
80 // 预定义几个不同颜色的1x1像素PNG图片(base64)
81 // 红色像素
82 let red_png = "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8DwHwAFBQIAX8jx0gAAAABJRU5ErkJggg==";
83 // 绿色像素
84 let green_png = "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M/wHwAEBgIApD5fRAAAAABJRU5ErkJggg==";
85 // 蓝色像素
86 let blue_png = "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPj/HwADBwIAMCbHYQAAAABJRU5ErkJggg==";
87
88 // 事件循环
89 loop {
90 let event = read_message(activity.event_stream())?;
91 let event_type = event["type"].as_str().unwrap_or("");
92 let event_value = &event["value"];
93
94 match event_type {
95 "destroy" => {
96 // Activity 已被系统销毁,直接退出即可
97 println!("\n✓ Activity 已关闭");
98 return Ok(());
99 },
100 "click" => {
101 let clicked_id = event_value["id"].as_i64().unwrap_or(-1);
102
103 if clicked_id == red_btn.id() {
104 println!("🔴 切换到红色图片");
105 image_view.set_image(&mut activity, red_png)?;
106 status.set_text(&mut activity, "🔴 红色图片")?;
107 status.set_text_color(&mut activity, 0xFFF44336u32 as i32)?;
108 } else if clicked_id == green_btn.id() {
109 println!("🟢 切换到绿色图片");
110 image_view.set_image(&mut activity, green_png)?;
111 status.set_text(&mut activity, "🟢 绿色图片")?;
112 status.set_text_color(&mut activity, 0xFF4CAF50u32 as i32)?;
113 } else if clicked_id == blue_btn.id() {
114 println!("🔵 切换到蓝色图片");
115 image_view.set_image(&mut activity, blue_png)?;
116 status.set_text(&mut activity, "🔵 蓝色图片")?;
117 status.set_text_color(&mut activity, 0xFF2196F3u32 as i32)?;
118 }
119 },
120 _ => {}
121 }
122 }
123}More examples
examples/grid_layout_demo_v2.rs (line 19)
8fn main() -> Result<()> {
9 println!("=== GridLayout 网格布局演示 (新库版本) ===\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, 15)?;
21
22 // 创建标题
23 let title = activity.create_text_view("🎯 GridLayout 演示", Some(layout.id()))?;
24 title.set_text_size(&mut activity, 26)?;
25 title.view().set_margin(&mut activity, 10)?;
26 title.view().set_height_wrap_content(&mut activity)?;
27 title.view().set_linear_layout_params(&mut activity, 0, None)?;
28
29 // 创建说明
30 let desc = activity.create_text_view("网格布局:行列自动排列", Some(layout.id()))?;
31 desc.view().set_margin(&mut activity, 5)?;
32 desc.view().set_height_wrap_content(&mut activity)?;
33 desc.view().set_linear_layout_params(&mut activity, 0, None)?;
34
35 // ========== 示例1: 3x3 按钮网格 ==========
36 let section1 = activity.create_text_view("示例1: 3×3 按钮网格", Some(layout.id()))?;
37 section1.set_text_size(&mut activity, 18)?;
38 section1.view().set_margin(&mut activity, 10)?;
39 section1.view().set_height_wrap_content(&mut activity)?;
40 section1.view().set_linear_layout_params(&mut activity, 0, None)?;
41 section1.set_text_color(&mut activity, 0xFF2196F3u32 as i32)?;
42
43 // 创建 3x3 GridLayout
44 let grid1 = activity.create_grid_layout(3, 3, Some(layout.id()))?;
45 grid1.view().set_margin(&mut activity, 10)?;
46 grid1.view().set_width_match_parent(&mut activity)?;
47 grid1.view().set_height_wrap_content(&mut activity)?;
48 grid1.view().set_linear_layout_params(&mut activity, 0, None)?;
49
50 // 创建9个按钮(自动填充到3x3网格)
51 let mut grid1_buttons = Vec::new();
52 for i in 1..=9 {
53 let btn = activity.create_button(&format!("{}", i), Some(grid1.id()))?;
54 grid1_buttons.push(btn);
55 }
56
57 // ========== 示例2: 2x4 文本网格 ==========
58 let divider1 = activity.create_text_view("━━━━━━━━━━━━━━━━━━━━", Some(layout.id()))?;
59 divider1.view().set_margin(&mut activity, 10)?;
60 divider1.view().set_height_wrap_content(&mut activity)?;
61 divider1.view().set_linear_layout_params(&mut activity, 0, None)?;
62
63 let section2 = activity.create_text_view("示例2: 2×4 表情网格", Some(layout.id()))?;
64 section2.set_text_size(&mut activity, 18)?;
65 section2.view().set_margin(&mut activity, 10)?;
66 section2.view().set_height_wrap_content(&mut activity)?;
67 section2.view().set_linear_layout_params(&mut activity, 0, None)?;
68 section2.set_text_color(&mut activity, 0xFF4CAF50u32 as i32)?;
69
70 // 创建 2x4 GridLayout
71 let grid2 = activity.create_grid_layout(2, 4, Some(layout.id()))?;
72 grid2.view().set_margin(&mut activity, 10)?;
73 grid2.view().set_width_match_parent(&mut activity)?;
74 grid2.view().set_height_wrap_content(&mut activity)?;
75 grid2.view().set_linear_layout_params(&mut activity, 0, None)?;
76
77 // 8个表情文本(自动填充到2x4网格)
78 let emojis = ["😀", "😎", "🎉", "🚀", "🌟", "❤️", "👍", "🔥"];
79 for emoji in &emojis {
80 let text = activity.create_text_view(emoji, Some(grid2.id()))?;
81 text.set_text_size(&mut activity, 32)?;
82 text.view().set_margin(&mut activity, 5)?;
83 }
84
85 // ========== 示例3: 4x2 混合网格 ==========
86 let divider2 = activity.create_text_view("━━━━━━━━━━━━━━━━━━━━", Some(layout.id()))?;
87 divider2.view().set_margin(&mut activity, 10)?;
88 divider2.view().set_height_wrap_content(&mut activity)?;
89 divider2.view().set_linear_layout_params(&mut activity, 0, None)?;
90
91 let section3 = activity.create_text_view("示例3: 4×2 开关网格", Some(layout.id()))?;
92 section3.set_text_size(&mut activity, 18)?;
93 section3.view().set_margin(&mut activity, 10)?;
94 section3.view().set_height_wrap_content(&mut activity)?;
95 section3.view().set_linear_layout_params(&mut activity, 0, None)?;
96 section3.set_text_color(&mut activity, 0xFFFF9800u32 as i32)?;
97
98 // 创建 4x2 GridLayout
99 let grid3 = activity.create_grid_layout(4, 2, Some(layout.id()))?;
100 grid3.view().set_margin(&mut activity, 10)?;
101 grid3.view().set_width_match_parent(&mut activity)?;
102 grid3.view().set_height_wrap_content(&mut activity)?;
103 grid3.view().set_linear_layout_params(&mut activity, 0, None)?;
104
105 // 8个 ToggleButton(自动填充到4x2网格)
106 let toggle_labels = ["WiFi", "蓝牙", "GPS", "飞行", "数据", "热点", "蓝光", "省电"];
107 let mut grid3_toggles = Vec::new();
108 for label in &toggle_labels {
109 let toggle = activity.create_toggle_button(label, Some(grid3.id()))?;
110 grid3_toggles.push(toggle);
111 }
112
113 // ========== 底部信息 ==========
114 let divider3 = activity.create_text_view("━━━━━━━━━━━━━━━━━━━━", Some(layout.id()))?;
115 divider3.view().set_margin(&mut activity, 10)?;
116 divider3.view().set_height_wrap_content(&mut activity)?;
117 divider3.view().set_linear_layout_params(&mut activity, 0, None)?;
118
119 let info = activity.create_text_view(
120 "💡 GridLayout 特点:\n\
121 • 指定行数和列数创建网格\n\
122 • 子视图按添加顺序自动填充\n\
123 • 从左到右、从上到下排列\n\
124 • 适合创建规则的网格界面",
125 Some(layout.id())
126 )?;
127 info.view().set_margin(&mut activity, 10)?;
128 info.view().set_height_wrap_content(&mut activity)?;
129 info.view().set_linear_layout_params(&mut activity, 0, None)?;
130 info.set_text_color(&mut activity, 0xFF666666u32 as i32)?;
131
132 // 状态显示
133 let status = activity.create_text_view("准备就绪 - 点击任意元素试试", Some(layout.id()))?;
134 status.view().set_margin(&mut activity, 10)?;
135 status.view().set_height_wrap_content(&mut activity)?;
136 status.view().set_linear_layout_params(&mut activity, 0, None)?;
137 status.set_text_color(&mut activity, 0xFF2196F3u32 as i32)?;
138
139 println!("✓ 界面创建完成\n");
140 println!("━━━━━━━━━━━━━━━━━━━━━━");
141 println!("提示:");
142 println!(" • 观察三个不同尺寸的网格布局");
143 println!(" • 3×3 按钮网格:数字1-9");
144 println!(" • 2×4 表情网格:8个表情");
145 println!(" • 4×2 开关网格:8个ToggleButton");
146 println!("━━━━━━━━━━━━━━━━━━━━━━\n");
147
148 // 事件循环
149 loop {
150 let event = read_message(activity.event_stream())?;
151 let event_type = event["type"].as_str().unwrap_or("");
152 let event_value = &event["value"];
153
154 match event_type {
155 "destroy" => {
156 // Activity 已被系统销毁,直接退出即可
157 println!("\n✓ Activity 已关闭");
158 return Ok(());
159 },
160 "click" => {
161 let clicked_id = event_value["id"].as_i64().unwrap_or(-1);
162
163 // 检查是否是第一个网格的按钮
164 for (i, btn) in grid1_buttons.iter().enumerate() {
165 if clicked_id == btn.id() {
166 println!("✅ 点击了数字按钮: {}", i + 1);
167 status.set_text(&mut activity, &format!("✅ 点击了数字: {}", i + 1))?;
168 status.set_text_color(&mut activity, 0xFF4CAF50u32 as i32)?;
169 break;
170 }
171 }
172
173 // 检查是否是第三个网格的开关
174 for (i, toggle) in grid3_toggles.iter().enumerate() {
175 if clicked_id == toggle.id() {
176 let is_checked = event_value["set"].as_bool().unwrap_or(false);
177 println!("🔘 {}: {}", toggle_labels[i], if is_checked { "开启" } else { "关闭" });
178 status.set_text(&mut activity,
179 &format!("🔘 {}: {}", toggle_labels[i], if is_checked { "开启" } else { "关闭" }))?;
180 status.set_text_color(&mut activity,
181 if is_checked { 0xFFFF9800u32 as i32 } else { 0xFF9E9E9Eu32 as i32 })?;
182 break;
183 }
184 }
185 },
186 _ => {}
187 }
188 }
189}examples/progress_demo_v2.rs (line 21)
10fn main() -> Result<()> {
11 println!("=== ProgressBar 进度条演示 (新库版本) ===\n");
12
13 // 创建 Activity(全屏模式)
14 let mut activity = Activity::new(false)?;
15 println!("✓ 连接建立\n");
16
17 // 创建 NestedScrollView 作为根布局(支持滚动)
18 let scroll = activity.create_nested_scroll_view(None)?;
19
20 // 创建主布局(放在 ScrollView 内)
21 let layout = activity.create_linear_layout(Some(scroll.id()))?;
22 layout.view().set_margin(&mut activity, 15)?;
23
24 // 创建标题
25 let title = activity.create_text_view("📊 进度条演示", Some(layout.id()))?;
26 title.set_text_size(&mut activity, 26)?;
27 title.view().set_margin(&mut activity, 10)?;
28 title.view().set_height_wrap_content(&mut activity)?;
29 title.view().set_linear_layout_params(&mut activity, 0, None)?;
30
31 // 创建说明
32 let desc = activity.create_text_view("点击按钮控制进度", Some(layout.id()))?;
33 desc.view().set_margin(&mut activity, 5)?;
34 desc.view().set_height_wrap_content(&mut activity)?;
35 desc.view().set_linear_layout_params(&mut activity, 0, None)?;
36
37 // 创建 ProgressBar 1 - 主进度条
38 let label1 = activity.create_text_view("主任务进度:", Some(layout.id()))?;
39 label1.view().set_margin(&mut activity, 10)?;
40 label1.view().set_height_wrap_content(&mut activity)?;
41 label1.view().set_linear_layout_params(&mut activity, 0, None)?;
42
43 let progress1 = activity.create_progress_bar(Some(layout.id()))?;
44 progress1.view().set_margin(&mut activity, 10)?;
45 progress1.view().set_width_match_parent(&mut activity)?;
46 progress1.view().set_height_wrap_content(&mut activity)?;
47 progress1.view().set_linear_layout_params(&mut activity, 0, None)?;
48 progress1.set_progress(&mut activity, 0)?;
49
50 let progress1_text = activity.create_text_view("0%", Some(layout.id()))?;
51 progress1_text.view().set_margin(&mut activity, 5)?;
52 progress1_text.view().set_height_wrap_content(&mut activity)?;
53 progress1_text.view().set_linear_layout_params(&mut activity, 0, None)?;
54 progress1_text.set_text_color(&mut activity, 0xFF2196F3u32 as i32)?;
55
56 // 创建 ProgressBar 2 - 次要进度条
57 let label2 = activity.create_text_view("下载进度:", Some(layout.id()))?;
58 label2.view().set_margin(&mut activity, 10)?;
59 label2.view().set_height_wrap_content(&mut activity)?;
60 label2.view().set_linear_layout_params(&mut activity, 0, None)?;
61
62 let progress2 = activity.create_progress_bar(Some(layout.id()))?;
63 progress2.view().set_margin(&mut activity, 10)?;
64 progress2.view().set_width_match_parent(&mut activity)?;
65 progress2.view().set_height_wrap_content(&mut activity)?;
66 progress2.view().set_linear_layout_params(&mut activity, 0, None)?;
67 progress2.set_progress(&mut activity, 0)?;
68
69 let progress2_text = activity.create_text_view("0%", Some(layout.id()))?;
70 progress2_text.view().set_margin(&mut activity, 5)?;
71 progress2_text.view().set_height_wrap_content(&mut activity)?;
72 progress2_text.view().set_linear_layout_params(&mut activity, 0, None)?;
73 progress2_text.set_text_color(&mut activity, 0xFF2196F3u32 as i32)?;
74
75 // 创建分隔线
76 let divider = activity.create_text_view("━━━━━━━━━━━━━━━━━━━━", Some(layout.id()))?;
77 divider.view().set_margin(&mut activity, 10)?;
78 divider.view().set_height_wrap_content(&mut activity)?;
79 divider.view().set_linear_layout_params(&mut activity, 0, None)?;
80
81 // 创建按钮布局
82 let button_layout1 = activity.create_linear_layout_horizontal(Some(layout.id()))?;
83 button_layout1.view().set_margin(&mut activity, 10)?;
84 button_layout1.view().set_height_wrap_content(&mut activity)?;
85 button_layout1.view().set_linear_layout_params(&mut activity, 0, None)?;
86
87 let inc_btn = activity.create_button("➕ 增加", Some(button_layout1.id()))?;
88 inc_btn.view().set_linear_layout_params(&mut activity, 1, None)?;
89
90 let dec_btn = activity.create_button("➖ 减少", Some(button_layout1.id()))?;
91 dec_btn.view().set_linear_layout_params(&mut activity, 1, None)?;
92
93 let reset_btn = activity.create_button("🔄 重置", Some(button_layout1.id()))?;
94 reset_btn.view().set_linear_layout_params(&mut activity, 1, None)?;
95
96 // 第二行按钮
97 let button_layout2 = activity.create_linear_layout_horizontal(Some(layout.id()))?;
98 button_layout2.view().set_margin(&mut activity, 10)?;
99 button_layout2.view().set_height_wrap_content(&mut activity)?;
100 button_layout2.view().set_linear_layout_params(&mut activity, 0, None)?;
101
102 let auto_btn = activity.create_button("▶️ 自动演示", Some(button_layout2.id()))?;
103 auto_btn.view().set_linear_layout_params(&mut activity, 1, None)?;
104
105 let complete_btn = activity.create_button("✅ 完成", Some(button_layout2.id()))?;
106 complete_btn.view().set_linear_layout_params(&mut activity, 1, None)?;
107
108 println!("✓ 界面创建完成\n");
109 println!("━━━━━━━━━━━━━━━━━━━━━━");
110 println!("提示:");
111 println!(" • ➕ 增加 - 进度 +10%");
112 println!(" • ➖ 减少 - 进度 -10%");
113 println!(" • 🔄 重置 - 进度归零");
114 println!(" • ▶️ 自动演示 - 模拟加载过程");
115 println!(" • ✅ 完成 - 进度设为100%");
116 println!("━━━━━━━━━━━━━━━━━━━━━━\n");
117
118 // 进度状态
119 let mut progress1_value = 0;
120 let mut progress2_value = 0;
121
122 // 事件循环
123 loop {
124 let event = read_message(activity.event_stream())?;
125 let event_type = event["type"].as_str().unwrap_or("");
126 let event_value = &event["value"];
127
128 match event_type {
129 "destroy" => {
130 // Activity 已被系统销毁,直接退出即可
131 println!("\n✓ Activity 已关闭");
132 return Ok(());
133 },
134 "click" => {
135 let clicked_id = event_value["id"].as_i64().unwrap_or(-1);
136
137 if clicked_id == inc_btn.id() {
138 // 增加进度
139 progress1_value = (progress1_value + 10).min(100);
140 progress1.set_progress(&mut activity, progress1_value)?;
141 progress1_text.set_text(&mut activity, &format!("{}%", progress1_value))?;
142 println!("➕ 进度: {}%", progress1_value);
143
144 } else if clicked_id == dec_btn.id() {
145 // 减少进度
146 progress1_value = (progress1_value - 10).max(0);
147 progress1.set_progress(&mut activity, progress1_value)?;
148 progress1_text.set_text(&mut activity, &format!("{}%", progress1_value))?;
149 println!("➖ 进度: {}%", progress1_value);
150
151 } else if clicked_id == reset_btn.id() {
152 // 重置
153 progress1_value = 0;
154 progress2_value = 0;
155 progress1.set_progress(&mut activity, 0)?;
156 progress2.set_progress(&mut activity, 0)?;
157 progress1_text.set_text(&mut activity, "0%")?;
158 progress2_text.set_text(&mut activity, "0%")?;
159 progress1_text.set_text_color(&mut activity, 0xFF2196F3u32 as i32)?;
160 progress2_text.set_text_color(&mut activity, 0xFF2196F3u32 as i32)?;
161 println!("🔄 进度已重置");
162
163 } else if clicked_id == complete_btn.id() {
164 // 完成
165 progress1_value = 100;
166 progress2_value = 100;
167 progress1.set_progress(&mut activity, 100)?;
168 progress2.set_progress(&mut activity, 100)?;
169 progress1_text.set_text(&mut activity, "100% ✓")?;
170 progress2_text.set_text(&mut activity, "100% ✓")?;
171 progress1_text.set_text_color(&mut activity, 0xFF4CAF50u32 as i32)?;
172 progress2_text.set_text_color(&mut activity, 0xFF4CAF50u32 as i32)?;
173 println!("✅ 任务完成!");
174
175 } else if clicked_id == auto_btn.id() {
176 // 自动演示 - 模拟加载过程
177 println!("▶️ 开始自动演示...");
178 progress1_value = 0;
179 progress2_value = 0;
180
181 // 模拟两个进度条同时加载
182 for i in 0..=10 {
183 progress1_value = i * 10;
184 progress2_value = i * 10;
185
186 progress1.set_progress(&mut activity, progress1_value)?;
187 progress2.set_progress(&mut activity, progress2_value)?;
188
189 progress1_text.set_text(&mut activity, &format!("{}%", progress1_value))?;
190 progress2_text.set_text(&mut activity, &format!("{}%", progress2_value))?;
191
192 if i == 10 {
193 progress1_text.set_text(&mut activity, "100% ✓")?;
194 progress2_text.set_text(&mut activity, "100% ✓")?;
195 progress1_text.set_text_color(&mut activity, 0xFF4CAF50u32 as i32)?;
196 progress2_text.set_text_color(&mut activity, 0xFF4CAF50u32 as i32)?;
197 }
198
199 println!(" 进度: {}%", progress1_value);
200
201 // 延迟一下,让用户看到进度变化
202 thread::sleep(Duration::from_millis(300));
203 }
204
205 println!("✅ 自动演示完成!");
206 }
207 },
208 _ => {}
209 }
210 }
211}examples/spinner_demo_v2.rs (line 19)
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 NestedScrollView
impl RefUnwindSafe for NestedScrollView
impl Send for NestedScrollView
impl Sync for NestedScrollView
impl Unpin for NestedScrollView
impl UnwindSafe for NestedScrollView
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