NestedScrollView

Struct NestedScrollView 

Source
pub struct NestedScrollView { /* private fields */ }
Expand description

A NestedScrollView provides scrolling capability

Implementations§

Source§

impl NestedScrollView

Source

pub fn new(activity: &mut Activity, parent: Option<i64>) -> Result<Self>

Create a new NestedScrollView

Source

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
Hide additional 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}
Source

pub fn view(&self) -> &View

Get the underlying View

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V