Activity

Struct Activity 

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

Represents a GUI Activity (window)

Implementations§

Source§

impl Activity

Source

pub fn new(dialog: bool) -> Result<Self>

Create a new Activity

§Arguments
  • dialog - If true, creates a dialog-style window; if false, creates a full-screen activity
Examples found in repository?
examples/webview_demo_v2.rs (line 16)
12fn main() -> Result<()> {
13    println!("=== WebView 网页视图演示 (新库版本) ===\n");
14    
15    // 创建 Activity
16    let mut activity = Activity::new(false)?;
17    println!("✓ 连接建立\n");
18    
19    // 创建根布局 (垂直)
20    let root = activity.create_linear_layout(None)?;
21    
22    // 标题文本
23    let title = activity.create_text_view("🌐 WebView 演示", Some(root.id()))?;
24    title.set_text_size(&mut activity, 20)?;
25    title.view().set_height_wrap_content(&mut activity)?;
26    title.view().set_margin(&mut activity, 16)?;
27    title.view().set_linear_layout_params(&mut activity, 0, None)?;
28    
29    // 提示文本
30    let hint = activity.create_text_view(
31        "━━━━━━━━━━━━━━━━━━━━━━\n\
32        演示步骤:\n\
33        1️⃣ 显示HTML内容 (3秒)\n\
34        2️⃣ 加载Google网页 (3秒)\n\
35        3️⃣ 请求JavaScript权限\n\
36        4️⃣ 执行JavaScript代码\n\
37        ━━━━━━━━━━━━━━━━━━━━━━", 
38        Some(root.id()))?;
39    hint.set_text_size(&mut activity, 14)?;
40    hint.view().set_height_wrap_content(&mut activity)?;
41    hint.view().set_margin(&mut activity, 16)?;
42    hint.view().set_linear_layout_params(&mut activity, 0, None)?;
43    
44    // 创建 WebView
45    let webview = activity.create_web_view(Some(root.id()))?;
46    webview.view().set_linear_layout_params(&mut activity, 1, None)?;  // 占据剩余空间
47    
48    println!("✓ 界面创建完成\n");
49    
50    // 演示流程
51    demo_workflow(&mut activity, &webview)?;
52    
53    println!("\n📌 等待用户关闭窗口...");
54    
55    // 事件循环
56    loop {
57        let event = read_message(activity.event_stream())?;
58        let event_type = event["type"].as_str().unwrap_or("");
59        
60        match event_type {
61            "destroy" => {
62                println!("\n✓ Activity 已关闭");
63                return Ok(());
64            },
65            _ => {}
66        }
67    }
68}
More examples
Hide additional examples
examples/button_demo_v2.rs (line 12)
8fn main() -> Result<()> {
9    println!("=== Button 交互演示 (新库版本) ===\n");
10    
11    // 创建 Activity(对话框模式)
12    let mut activity = Activity::new(true)?;
13    println!("✓ 连接建立\n");
14    
15    // 创建主布局
16    let layout = activity.create_linear_layout(None)?;
17    
18    // 创建标题
19    let title = activity.create_text_view("计数器演示 🦀", Some(layout.id()))?;
20    title.set_text_size(&mut activity, 30)?;
21    title.view().set_margin(&mut activity, 10)?;
22    // 设置标题高度为WRAP_CONTENT,避免占用太多空间
23    title.view().set_height_wrap_content(&mut activity)?;
24    // 设置布局权重为0,不占用额外空间
25    title.view().set_linear_layout_params(&mut activity, 0, None)?;
26    
27    // 创建计数显示
28    let counter = activity.create_text_view("点击次数: 0", Some(layout.id()))?;
29    counter.set_text_size(&mut activity, 24)?;
30    counter.view().set_margin(&mut activity, 20)?;
31    // 设置计数器高度为WRAP_CONTENT
32    counter.view().set_height_wrap_content(&mut activity)?;
33    // 给计数器更高的权重,让它获得更多空间
34    counter.view().set_linear_layout_params(&mut activity, 1, None)?;
35    
36    // 创建按钮布局(横向)
37    let button_layout = activity.create_linear_layout_horizontal(Some(layout.id()))?;
38    // 按钮布局也使用WRAP_CONTENT
39    button_layout.view().set_height_wrap_content(&mut activity)?;
40    button_layout.view().set_linear_layout_params(&mut activity, 0, None)?;
41    
42    // 创建按钮
43    let inc_button = activity.create_button("➕ 增加", Some(button_layout.id()))?;
44    inc_button.view().set_linear_layout_params(&mut activity, 1, None)?;  // 均分空间
45    
46    let dec_button = activity.create_button("➖ 减少", Some(button_layout.id()))?;
47    dec_button.view().set_linear_layout_params(&mut activity, 1, None)?;  // 均分空间
48    
49    let reset_button = activity.create_button("🔄 重置", Some(layout.id()))?;
50    reset_button.view().set_height_wrap_content(&mut activity)?;
51    reset_button.view().set_linear_layout_params(&mut activity, 0, None)?;
52    
53    println!("✓ 界面创建完成");
54    println!("  - Counter ID: {}", counter.id());
55    println!("  - Button ID: {}", inc_button.id());
56    println!("━━━━━━━━━━━━━━━━━━━━━━");
57    println!("提示: 点击按钮进行交互");
58    println!("━━━━━━━━━━━━━━━━━━━━━━\n");
59    
60    // 事件循环
61    let mut count = 0;
62    
63    loop {
64        let event = read_message(activity.event_stream())?;
65        let event_type = event["type"].as_str().unwrap_or("");
66        
67        match event_type {
68            "destroy" => {
69                // Activity 已被系统销毁,直接退出即可
70                // 不要调用 activity.finish(),因为 Activity 已经不存在了
71                println!("\n✓ Activity 已关闭");
72                println!("✓ 程序结束");
73                return Ok(());
74            },
75            "click" => {
76                let id = event["value"]["id"].as_i64().unwrap_or(-1);
77                
78                if id == inc_button.id() {
79                    count += 1;
80                    println!("➕ count = {}", count);
81                } else if id == dec_button.id() {
82                    count -= 1;
83                    println!("➖ count = {}", count);
84                } else if id == reset_button.id() {
85                    count = 0;
86                    println!("🔄 count = {}", count);
87                }
88                
89                // 更新文本
90                counter.set_text(&mut activity, &format!("点击次数: {}", count))?;
91                
92                // 根据计数改变颜色
93                let color = if count > 0 {
94                    0xFF4CAF50u32 as i32  // 绿色
95                } else if count < 0 {
96                    0xFFF44336u32 as i32  // 红色
97                } else {
98                    0xFF2196F3u32 as i32  // 蓝色
99                };
100                counter.set_text_color(&mut activity, color)?;
101            },
102            _ => {}
103        }
104    }
105}
examples/tab_layout_demo_v2.rs (line 13)
9fn main() -> Result<()> {
10    println!("=== TabLayout 标签页演示 (新库版本) ===\n");
11
12    // 创建连接和 Activity
13    let mut activity = Activity::new(false)?;
14    println!("✓ 连接建立");
15
16    // 创建根布局(垂直)
17    let root = activity.create_linear_layout(None)?;
18    
19    // 创建 TabLayout(在顶部)
20    let tabs = activity.create_tab_layout(Some(root.id()))?;
21    tabs.view().set_linear_layout_params(&mut activity, 0, None)?;
22    tabs.view().set_height(&mut activity, -2)?; // WRAP_CONTENT
23    
24    // 设置标签列表
25    tabs.set_list(&mut activity, &["首页", "消息", "我的"])?;
26    
27    // 创建内容区域
28    let content_area = activity.create_linear_layout(Some(root.id()))?;
29    content_area.view().set_linear_layout_params(&mut activity, 1, None)?; // weight=1 占据剩余空间
30    
31    // 创建三个页面的内容(初始全部隐藏)
32    // 页面1 - 首页
33    let page1 = activity.create_linear_layout(Some(content_area.id()))?;
34    
35    let title1 = activity.create_text_view("📱 首页", Some(page1.id()))?;
36    title1.set_text_size(&mut activity, 28)?;
37    
38    let content1 = activity.create_text_view("\n欢迎使用 TabLayout!\n\n这是首页内容。\n\n☝️ 点击顶部标签切换页面", Some(page1.id()))?;
39    content1.set_text_size(&mut activity, 18)?;
40    
41    // 页面2 - 消息
42    let page2 = activity.create_linear_layout(Some(content_area.id()))?;
43    activity.send(&serde_json::json!({
44        "method": "setVisibility",
45        "params": {
46            "aid": activity.id(),
47            "id": page2.id(),
48            "vis": 8  // GONE initially
49        }
50    }))?;
51    
52    let title2 = activity.create_text_view("💬 消息中心", Some(page2.id()))?;
53    title2.set_text_size(&mut activity, 28)?;
54    
55    let content2 = activity.create_text_view("\n这是第二页\n\n你有 3 条新消息\n\n• 系统通知\n• 好友消息\n• 更新提醒", Some(page2.id()))?;
56    content2.set_text_size(&mut activity, 18)?;
57    
58    // 页面3 - 我的
59    let page3 = activity.create_linear_layout(Some(content_area.id()))?;
60    activity.send(&serde_json::json!({
61        "method": "setVisibility",
62        "params": {
63            "aid": activity.id(),
64            "id": page3.id(),
65            "vis": 8  // GONE initially
66        }
67    }))?;
68    
69    let title3 = activity.create_text_view("👤 个人中心", Some(page3.id()))?;
70    title3.set_text_size(&mut activity, 28)?;
71    
72    let content3 = activity.create_text_view("\n这是第三页\n\n个人信息\n\n• 账号设置\n• 隐私设置\n• 关于我们", Some(page3.id()))?;
73    content3.set_text_size(&mut activity, 18)?;
74    
75    println!("\n✓ 界面创建完成");
76    println!("\n━━━━━━━━━━━━━━━━━━━━━━");
77    println!("提示:");
78    println!("  • 点击顶部标签切换页面");
79    println!("  • 观察页面内容变化");
80    println!("━━━━━━━━━━━━━━━━━━━━━━\n");
81    
82    // 当前选中的标签页
83    let mut current_tab = 0;
84    let pages = [page1.id(), page2.id(), page3.id()];
85    
86    // 事件循环
87    loop {
88        let event = read_message(activity.event_stream())?;
89        let event_type = event["type"].as_str().unwrap_or("");
90        
91        match event_type {
92            "destroy" => {
93                println!("\n✓ Activity 已关闭");
94                return Ok(());
95            }
96            "itemselected" => {
97                // TabLayout 被点击
98                if let Some(selected) = event["value"]["selected"].as_i64() {
99                    if event["value"]["id"].as_i64() == Some(tabs.id()) {
100                        let new_tab = selected as usize;
101                        if new_tab != current_tab && new_tab < 3 {
102                            println!("切换到标签 {}: {}", new_tab, ["首页", "消息", "我的"][new_tab]);
103                            
104                            // 隐藏当前页面
105                            activity.send(&serde_json::json!({
106                                "method": "setVisibility",
107                                "params": {
108                                    "aid": activity.id(),
109                                    "id": pages[current_tab],
110                                    "vis": 8  // GONE
111                                }
112                            }))?;
113                            
114                            // 显示新页面
115                            activity.send(&serde_json::json!({
116                                "method": "setVisibility",
117                                "params": {
118                                    "aid": activity.id(),
119                                    "id": pages[new_tab],
120                                    "vis": 0  // VISIBLE
121                                }
122                            }))?;
123                            
124                            current_tab = new_tab;
125                        }
126                    }
127                }
128            }
129            _ => {}
130        }
131    }
132}
examples/image_demo_v2.rs (line 12)
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}
examples/checkbox_demo_v2.rs (line 37)
33fn main() -> Result<()> {
34    println!("=== Checkbox 复选框演示 (新库版本) ===\n");
35    
36    // 创建 Activity(对话框模式)
37    let mut activity = Activity::new(true)?;
38    println!("✓ 连接建立\n");
39    
40    // 创建主布局
41    let layout = activity.create_linear_layout(None)?;
42    
43    // 创建标题
44    let title = activity.create_text_view("选择你喜欢的功能 ✅", Some(layout.id()))?;
45    title.set_text_size(&mut activity, 26)?;
46    title.view().set_margin(&mut activity, 10)?;
47    title.view().set_height_wrap_content(&mut activity)?;
48    
49    // 创建 Checkbox 1 - WiFi (初始未选中)
50    let checkbox1 = activity.create_checkbox_checked("📶 WiFi", Some(layout.id()), false)?;
51    checkbox1.view().set_margin(&mut activity, 5)?;
52    checkbox1.view().set_height_wrap_content(&mut activity)?;
53    
54    // 创建 Checkbox 2 - 蓝牙 (初始选中)
55    let checkbox2 = activity.create_checkbox_checked("📡 蓝牙", Some(layout.id()), true)?;
56    checkbox2.view().set_margin(&mut activity, 5)?;
57    checkbox2.view().set_height_wrap_content(&mut activity)?;
58    
59    // 创建 Checkbox 3 - 定位 (初始未选中)
60    let checkbox3 = activity.create_checkbox_checked("📍 定位服务", Some(layout.id()), false)?;
61    checkbox3.view().set_margin(&mut activity, 5)?;
62    checkbox3.view().set_height_wrap_content(&mut activity)?;
63    
64    // 创建 Checkbox 4 - 通知 (初始选中)
65    let checkbox4 = activity.create_checkbox_checked("🔔 通知", Some(layout.id()), true)?;
66    checkbox4.view().set_margin(&mut activity, 5)?;
67    checkbox4.view().set_height_wrap_content(&mut activity)?;
68    
69    // 创建分隔线
70    let separator = activity.create_text_view("━━━━━━━━━━━━━━━━━━━━", Some(layout.id()))?;
71    separator.view().set_height_wrap_content(&mut activity)?;
72    
73    // 创建状态显示
74    let status = activity.create_text_view("当前选中: 蓝牙, 通知", Some(layout.id()))?;
75    status.view().set_margin(&mut activity, 10)?;
76    status.view().set_height_wrap_content(&mut activity)?;
77    status.set_text_color(&mut activity, 0xFF2196F3u32 as i32)?;
78    
79    // 创建按钮
80    let apply_button = activity.create_button("✅ 应用设置", Some(layout.id()))?;
81    apply_button.view().set_margin(&mut activity, 10)?;
82    apply_button.view().set_height_wrap_content(&mut activity)?;
83    
84    println!("✓ 界面创建完成\n");
85    println!("━━━━━━━━━━━━━━━━━━━━━━");
86    println!("提示:");
87    println!("  • 点击复选框切换状态");
88    println!("  • 观察状态实时更新");
89    println!("  • 点击 '应用设置' 查看最终选择");
90    println!("━━━━━━━━━━━━━━━━━━━━━━\n");
91    
92    // 状态跟踪
93    let mut wifi_checked = false;
94    let mut bluetooth_checked = true;
95    let mut location_checked = false;
96    let mut notification_checked = true;
97    
98    // 事件循环
99    loop {
100        let event = read_message(activity.event_stream())?;
101        let event_type = event["type"].as_str().unwrap_or("");
102        let event_value = &event["value"];
103        
104        match event_type {
105            "destroy" => {
106                // Activity 已被系统销毁,直接退出即可
107                // 不要调用 activity.finish(),因为 Activity 已经不存在了
108                println!("\n✓ Activity 已关闭");
109                return Ok(());
110            },
111            "click" => {
112                let clicked_id = event_value["id"].as_i64().unwrap_or(-1);
113                let is_checked = event_value["set"].as_bool().unwrap_or(false);
114                
115                if clicked_id == checkbox1.id() {
116                    wifi_checked = is_checked;
117                    println!("📶 WiFi: {}", if is_checked { "开启" } else { "关闭" });
118                    update_status_text(&mut activity, &status, 
119                                     wifi_checked, bluetooth_checked, 
120                                     location_checked, notification_checked)?;
121                    
122                } else if clicked_id == checkbox2.id() {
123                    bluetooth_checked = is_checked;
124                    println!("📡 蓝牙: {}", if is_checked { "开启" } else { "关闭" });
125                    update_status_text(&mut activity, &status, 
126                                     wifi_checked, bluetooth_checked, 
127                                     location_checked, notification_checked)?;
128                    
129                } else if clicked_id == checkbox3.id() {
130                    location_checked = is_checked;
131                    println!("📍 定位: {}", if is_checked { "开启" } else { "关闭" });
132                    update_status_text(&mut activity, &status, 
133                                     wifi_checked, bluetooth_checked, 
134                                     location_checked, notification_checked)?;
135                    
136                } else if clicked_id == checkbox4.id() {
137                    notification_checked = is_checked;
138                    println!("🔔 通知: {}", if is_checked { "开启" } else { "关闭" });
139                    update_status_text(&mut activity, &status, 
140                                     wifi_checked, bluetooth_checked, 
141                                     location_checked, notification_checked)?;
142                    
143                } else if clicked_id == apply_button.id() {
144                    println!("\n✅ 应用设置:");
145                    println!("  WiFi: {}", if wifi_checked { "✓" } else { "✗" });
146                    println!("  蓝牙: {}", if bluetooth_checked { "✓" } else { "✗" });
147                    println!("  定位: {}", if location_checked { "✓" } else { "✗" });
148                    println!("  通知: {}", if notification_checked { "✓" } else { "✗" });
149                    
150                    // 显示确认消息
151                    status.set_text(&mut activity, "✅ 设置已应用!")?;
152                    status.set_text_color(&mut activity, 0xFF4CAF50u32 as i32)?;
153                }
154            },
155            _ => {}
156        }
157    }
158}
examples/horizontal_scroll_demo_v2.rs (line 12)
8fn main() -> Result<()> {
9    println!("=== HorizontalScrollView 水平滚动演示 (新库版本) ===\n");
10    
11    // 创建 Activity(全屏模式)
12    let mut activity = Activity::new(false)?;
13    println!("✓ 连接建立\n");
14    
15    // 创建主垂直布局
16    let main_layout = activity.create_linear_layout(None)?;
17    main_layout.view().set_margin(&mut activity, 15)?;
18    
19    // 创建标题
20    let title = activity.create_text_view("↔️ HorizontalScrollView 演示", Some(main_layout.id()))?;
21    title.set_text_size(&mut activity, 26)?;
22    title.view().set_margin(&mut activity, 10)?;
23    title.view().set_height_wrap_content(&mut activity)?;
24    title.view().set_linear_layout_params(&mut activity, 0, None)?;
25    
26    // 创建说明
27    let desc = activity.create_text_view("左右滑动查看更多按钮", Some(main_layout.id()))?;
28    desc.view().set_margin(&mut activity, 5)?;
29    desc.view().set_height_wrap_content(&mut activity)?;
30    desc.view().set_linear_layout_params(&mut activity, 0, None)?;
31    
32    // ========== 第一行: 水果按钮 ==========
33    let section1 = activity.create_text_view("第一行: 水果按钮(左右滑动)", Some(main_layout.id()))?;
34    section1.set_text_size(&mut activity, 18)?;
35    section1.view().set_margin(&mut activity, 10)?;
36    section1.view().set_height_wrap_content(&mut activity)?;
37    section1.view().set_linear_layout_params(&mut activity, 0, None)?;
38    section1.set_text_color(&mut activity, 0xFF2196F3u32 as i32)?;
39    
40    // 创建第一个 HorizontalScrollView
41    let h_scroll1 = activity.create_horizontal_scroll_view(Some(main_layout.id()))?;
42    h_scroll1.view().set_margin(&mut activity, 10)?;
43    h_scroll1.view().set_height_wrap_content(&mut activity)?;
44    h_scroll1.view().set_linear_layout_params(&mut activity, 0, None)?;
45    
46    // 在 HorizontalScrollView 内创建水平 LinearLayout
47    let h_layout1 = activity.create_linear_layout_horizontal(Some(h_scroll1.id()))?;
48    h_layout1.view().set_height_wrap_content(&mut activity)?;
49    
50    // 添加10个水果按钮
51    let fruits = ["🍎 苹果", "🍊 橙子", "🍌 香蕉", "🍇 葡萄", "🍓 草莓", 
52                  "🍑 桃子", "🍒 樱桃", "🍍 菠萝", "🥝 猕猴桃", "🥭 芒果"];
53    let mut fruit_buttons = Vec::new();
54    for fruit in &fruits {
55        let btn = activity.create_button(fruit, Some(h_layout1.id()))?;
56        btn.view().set_width(&mut activity, 180)?;  // 固定宽度180dp
57        btn.view().set_margin(&mut activity, 5)?;
58        fruit_buttons.push(btn);
59    }
60    
61    // ========== 第二行: 数字按钮 ==========
62    let section2 = activity.create_text_view("第二行: 数字按钮(左右滑动)", Some(main_layout.id()))?;
63    section2.set_text_size(&mut activity, 18)?;
64    section2.view().set_margin(&mut activity, 10)?;
65    section2.view().set_height_wrap_content(&mut activity)?;
66    section2.view().set_linear_layout_params(&mut activity, 0, None)?;
67    section2.set_text_color(&mut activity, 0xFF4CAF50u32 as i32)?;
68    
69    // 创建第二个 HorizontalScrollView
70    let h_scroll2 = activity.create_horizontal_scroll_view(Some(main_layout.id()))?;
71    h_scroll2.view().set_margin(&mut activity, 10)?;
72    h_scroll2.view().set_height_wrap_content(&mut activity)?;
73    h_scroll2.view().set_linear_layout_params(&mut activity, 0, None)?;
74    
75    // 在 HorizontalScrollView 内创建水平 LinearLayout
76    let h_layout2 = activity.create_linear_layout_horizontal(Some(h_scroll2.id()))?;
77    h_layout2.view().set_height_wrap_content(&mut activity)?;
78    
79    // 添加20个数字按钮
80    let mut number_buttons = Vec::new();
81    for i in 0..20 {
82        let btn = activity.create_button(&format!("数字 {}", i * 5), Some(h_layout2.id()))?;
83        btn.view().set_width(&mut activity, 150)?;  // 固定宽度150dp
84        btn.view().set_margin(&mut activity, 5)?;
85        number_buttons.push(btn);
86    }
87    
88    // ========== 底部信息 ==========
89    let divider = activity.create_text_view("━━━━━━━━━━━━━━━━━━━━", Some(main_layout.id()))?;
90    divider.view().set_margin(&mut activity, 10)?;
91    divider.view().set_height_wrap_content(&mut activity)?;
92    divider.view().set_linear_layout_params(&mut activity, 0, None)?;
93    
94    let info = activity.create_text_view(
95        "💡 提示:\n\
96        • 在每一行中左右滑动\n\
97        • 点击任意按钮查看效果\n\
98        • HorizontalScrollView 支持水平滚动",
99        Some(main_layout.id())
100    )?;
101    info.view().set_margin(&mut activity, 10)?;
102    info.view().set_height_wrap_content(&mut activity)?;
103    info.view().set_linear_layout_params(&mut activity, 0, None)?;
104    info.set_text_color(&mut activity, 0xFF666666u32 as i32)?;
105    
106    // 状态显示
107    let status = activity.create_text_view("准备就绪 - 尝试左右滑动", Some(main_layout.id()))?;
108    status.view().set_margin(&mut activity, 10)?;
109    status.view().set_height_wrap_content(&mut activity)?;
110    status.view().set_linear_layout_params(&mut activity, 0, None)?;
111    status.set_text_color(&mut activity, 0xFF2196F3u32 as i32)?;
112    
113    println!("✓ 界面创建完成\n");
114    println!("━━━━━━━━━━━━━━━━━━━━━━");
115    println!("提示:");
116    println!("  • 第一行: 10个水果按钮");
117    println!("  • 第二行: 20个数字按钮");
118    println!("  • 左右滑动查看更多内容");
119    println!("━━━━━━━━━━━━━━━━━━━━━━\n");
120    
121    // 事件循环
122    loop {
123        let event = read_message(activity.event_stream())?;
124        let event_type = event["type"].as_str().unwrap_or("");
125        let event_value = &event["value"];
126        
127        match event_type {
128            "destroy" => {
129                println!("\n✓ Activity 已关闭");
130                return Ok(());
131            },
132            "click" => {
133                let clicked_id = event_value["id"].as_i64().unwrap_or(-1);
134                
135                // 检查水果按钮
136                for (i, btn) in fruit_buttons.iter().enumerate() {
137                    if clicked_id == btn.id() {
138                        println!("✅ 选择: {}", fruits[i]);
139                        status.set_text(&mut activity, &format!("✅ 选择: {}", fruits[i]))?;
140                        status.set_text_color(&mut activity, 0xFF4CAF50u32 as i32)?;
141                        break;
142                    }
143                }
144                
145                // 检查数字按钮
146                for (i, btn) in number_buttons.iter().enumerate() {
147                    if clicked_id == btn.id() {
148                        let value = i * 5;
149                        println!("🔢 选择数字: {}", value);
150                        status.set_text(&mut activity, &format!("🔢 选择数字: {}", value))?;
151                        status.set_text_color(&mut activity, 0xFFFF9800u32 as i32)?;
152                        break;
153                    }
154                }
155            },
156            _ => {}
157        }
158    }
159}
Source

pub fn id(&self) -> i64

Get the Activity ID

Examples found in repository?
examples/tab_layout_demo_v2.rs (line 46)
9fn main() -> Result<()> {
10    println!("=== TabLayout 标签页演示 (新库版本) ===\n");
11
12    // 创建连接和 Activity
13    let mut activity = Activity::new(false)?;
14    println!("✓ 连接建立");
15
16    // 创建根布局(垂直)
17    let root = activity.create_linear_layout(None)?;
18    
19    // 创建 TabLayout(在顶部)
20    let tabs = activity.create_tab_layout(Some(root.id()))?;
21    tabs.view().set_linear_layout_params(&mut activity, 0, None)?;
22    tabs.view().set_height(&mut activity, -2)?; // WRAP_CONTENT
23    
24    // 设置标签列表
25    tabs.set_list(&mut activity, &["首页", "消息", "我的"])?;
26    
27    // 创建内容区域
28    let content_area = activity.create_linear_layout(Some(root.id()))?;
29    content_area.view().set_linear_layout_params(&mut activity, 1, None)?; // weight=1 占据剩余空间
30    
31    // 创建三个页面的内容(初始全部隐藏)
32    // 页面1 - 首页
33    let page1 = activity.create_linear_layout(Some(content_area.id()))?;
34    
35    let title1 = activity.create_text_view("📱 首页", Some(page1.id()))?;
36    title1.set_text_size(&mut activity, 28)?;
37    
38    let content1 = activity.create_text_view("\n欢迎使用 TabLayout!\n\n这是首页内容。\n\n☝️ 点击顶部标签切换页面", Some(page1.id()))?;
39    content1.set_text_size(&mut activity, 18)?;
40    
41    // 页面2 - 消息
42    let page2 = activity.create_linear_layout(Some(content_area.id()))?;
43    activity.send(&serde_json::json!({
44        "method": "setVisibility",
45        "params": {
46            "aid": activity.id(),
47            "id": page2.id(),
48            "vis": 8  // GONE initially
49        }
50    }))?;
51    
52    let title2 = activity.create_text_view("💬 消息中心", Some(page2.id()))?;
53    title2.set_text_size(&mut activity, 28)?;
54    
55    let content2 = activity.create_text_view("\n这是第二页\n\n你有 3 条新消息\n\n• 系统通知\n• 好友消息\n• 更新提醒", Some(page2.id()))?;
56    content2.set_text_size(&mut activity, 18)?;
57    
58    // 页面3 - 我的
59    let page3 = activity.create_linear_layout(Some(content_area.id()))?;
60    activity.send(&serde_json::json!({
61        "method": "setVisibility",
62        "params": {
63            "aid": activity.id(),
64            "id": page3.id(),
65            "vis": 8  // GONE initially
66        }
67    }))?;
68    
69    let title3 = activity.create_text_view("👤 个人中心", Some(page3.id()))?;
70    title3.set_text_size(&mut activity, 28)?;
71    
72    let content3 = activity.create_text_view("\n这是第三页\n\n个人信息\n\n• 账号设置\n• 隐私设置\n• 关于我们", Some(page3.id()))?;
73    content3.set_text_size(&mut activity, 18)?;
74    
75    println!("\n✓ 界面创建完成");
76    println!("\n━━━━━━━━━━━━━━━━━━━━━━");
77    println!("提示:");
78    println!("  • 点击顶部标签切换页面");
79    println!("  • 观察页面内容变化");
80    println!("━━━━━━━━━━━━━━━━━━━━━━\n");
81    
82    // 当前选中的标签页
83    let mut current_tab = 0;
84    let pages = [page1.id(), page2.id(), page3.id()];
85    
86    // 事件循环
87    loop {
88        let event = read_message(activity.event_stream())?;
89        let event_type = event["type"].as_str().unwrap_or("");
90        
91        match event_type {
92            "destroy" => {
93                println!("\n✓ Activity 已关闭");
94                return Ok(());
95            }
96            "itemselected" => {
97                // TabLayout 被点击
98                if let Some(selected) = event["value"]["selected"].as_i64() {
99                    if event["value"]["id"].as_i64() == Some(tabs.id()) {
100                        let new_tab = selected as usize;
101                        if new_tab != current_tab && new_tab < 3 {
102                            println!("切换到标签 {}: {}", new_tab, ["首页", "消息", "我的"][new_tab]);
103                            
104                            // 隐藏当前页面
105                            activity.send(&serde_json::json!({
106                                "method": "setVisibility",
107                                "params": {
108                                    "aid": activity.id(),
109                                    "id": pages[current_tab],
110                                    "vis": 8  // GONE
111                                }
112                            }))?;
113                            
114                            // 显示新页面
115                            activity.send(&serde_json::json!({
116                                "method": "setVisibility",
117                                "params": {
118                                    "aid": activity.id(),
119                                    "id": pages[new_tab],
120                                    "vis": 0  // VISIBLE
121                                }
122                            }))?;
123                            
124                            current_tab = new_tab;
125                        }
126                    }
127                }
128            }
129            _ => {}
130        }
131    }
132}
Source

pub fn send_read(&mut self, msg: &Value) -> Result<Value>

Send a message and read response

Source

pub fn send(&mut self, msg: &Value) -> Result<()>

Send a message without waiting for response

Examples found in repository?
examples/tab_layout_demo_v2.rs (lines 43-50)
9fn main() -> Result<()> {
10    println!("=== TabLayout 标签页演示 (新库版本) ===\n");
11
12    // 创建连接和 Activity
13    let mut activity = Activity::new(false)?;
14    println!("✓ 连接建立");
15
16    // 创建根布局(垂直)
17    let root = activity.create_linear_layout(None)?;
18    
19    // 创建 TabLayout(在顶部)
20    let tabs = activity.create_tab_layout(Some(root.id()))?;
21    tabs.view().set_linear_layout_params(&mut activity, 0, None)?;
22    tabs.view().set_height(&mut activity, -2)?; // WRAP_CONTENT
23    
24    // 设置标签列表
25    tabs.set_list(&mut activity, &["首页", "消息", "我的"])?;
26    
27    // 创建内容区域
28    let content_area = activity.create_linear_layout(Some(root.id()))?;
29    content_area.view().set_linear_layout_params(&mut activity, 1, None)?; // weight=1 占据剩余空间
30    
31    // 创建三个页面的内容(初始全部隐藏)
32    // 页面1 - 首页
33    let page1 = activity.create_linear_layout(Some(content_area.id()))?;
34    
35    let title1 = activity.create_text_view("📱 首页", Some(page1.id()))?;
36    title1.set_text_size(&mut activity, 28)?;
37    
38    let content1 = activity.create_text_view("\n欢迎使用 TabLayout!\n\n这是首页内容。\n\n☝️ 点击顶部标签切换页面", Some(page1.id()))?;
39    content1.set_text_size(&mut activity, 18)?;
40    
41    // 页面2 - 消息
42    let page2 = activity.create_linear_layout(Some(content_area.id()))?;
43    activity.send(&serde_json::json!({
44        "method": "setVisibility",
45        "params": {
46            "aid": activity.id(),
47            "id": page2.id(),
48            "vis": 8  // GONE initially
49        }
50    }))?;
51    
52    let title2 = activity.create_text_view("💬 消息中心", Some(page2.id()))?;
53    title2.set_text_size(&mut activity, 28)?;
54    
55    let content2 = activity.create_text_view("\n这是第二页\n\n你有 3 条新消息\n\n• 系统通知\n• 好友消息\n• 更新提醒", Some(page2.id()))?;
56    content2.set_text_size(&mut activity, 18)?;
57    
58    // 页面3 - 我的
59    let page3 = activity.create_linear_layout(Some(content_area.id()))?;
60    activity.send(&serde_json::json!({
61        "method": "setVisibility",
62        "params": {
63            "aid": activity.id(),
64            "id": page3.id(),
65            "vis": 8  // GONE initially
66        }
67    }))?;
68    
69    let title3 = activity.create_text_view("👤 个人中心", Some(page3.id()))?;
70    title3.set_text_size(&mut activity, 28)?;
71    
72    let content3 = activity.create_text_view("\n这是第三页\n\n个人信息\n\n• 账号设置\n• 隐私设置\n• 关于我们", Some(page3.id()))?;
73    content3.set_text_size(&mut activity, 18)?;
74    
75    println!("\n✓ 界面创建完成");
76    println!("\n━━━━━━━━━━━━━━━━━━━━━━");
77    println!("提示:");
78    println!("  • 点击顶部标签切换页面");
79    println!("  • 观察页面内容变化");
80    println!("━━━━━━━━━━━━━━━━━━━━━━\n");
81    
82    // 当前选中的标签页
83    let mut current_tab = 0;
84    let pages = [page1.id(), page2.id(), page3.id()];
85    
86    // 事件循环
87    loop {
88        let event = read_message(activity.event_stream())?;
89        let event_type = event["type"].as_str().unwrap_or("");
90        
91        match event_type {
92            "destroy" => {
93                println!("\n✓ Activity 已关闭");
94                return Ok(());
95            }
96            "itemselected" => {
97                // TabLayout 被点击
98                if let Some(selected) = event["value"]["selected"].as_i64() {
99                    if event["value"]["id"].as_i64() == Some(tabs.id()) {
100                        let new_tab = selected as usize;
101                        if new_tab != current_tab && new_tab < 3 {
102                            println!("切换到标签 {}: {}", new_tab, ["首页", "消息", "我的"][new_tab]);
103                            
104                            // 隐藏当前页面
105                            activity.send(&serde_json::json!({
106                                "method": "setVisibility",
107                                "params": {
108                                    "aid": activity.id(),
109                                    "id": pages[current_tab],
110                                    "vis": 8  // GONE
111                                }
112                            }))?;
113                            
114                            // 显示新页面
115                            activity.send(&serde_json::json!({
116                                "method": "setVisibility",
117                                "params": {
118                                    "aid": activity.id(),
119                                    "id": pages[new_tab],
120                                    "vis": 0  // VISIBLE
121                                }
122                            }))?;
123                            
124                            current_tab = new_tab;
125                        }
126                    }
127                }
128            }
129            _ => {}
130        }
131    }
132}
Source

pub fn event_stream(&mut self) -> &mut UnixStream

Get mutable reference to event stream

Examples found in repository?
examples/webview_demo_v2.rs (line 57)
12fn main() -> Result<()> {
13    println!("=== WebView 网页视图演示 (新库版本) ===\n");
14    
15    // 创建 Activity
16    let mut activity = Activity::new(false)?;
17    println!("✓ 连接建立\n");
18    
19    // 创建根布局 (垂直)
20    let root = activity.create_linear_layout(None)?;
21    
22    // 标题文本
23    let title = activity.create_text_view("🌐 WebView 演示", Some(root.id()))?;
24    title.set_text_size(&mut activity, 20)?;
25    title.view().set_height_wrap_content(&mut activity)?;
26    title.view().set_margin(&mut activity, 16)?;
27    title.view().set_linear_layout_params(&mut activity, 0, None)?;
28    
29    // 提示文本
30    let hint = activity.create_text_view(
31        "━━━━━━━━━━━━━━━━━━━━━━\n\
32        演示步骤:\n\
33        1️⃣ 显示HTML内容 (3秒)\n\
34        2️⃣ 加载Google网页 (3秒)\n\
35        3️⃣ 请求JavaScript权限\n\
36        4️⃣ 执行JavaScript代码\n\
37        ━━━━━━━━━━━━━━━━━━━━━━", 
38        Some(root.id()))?;
39    hint.set_text_size(&mut activity, 14)?;
40    hint.view().set_height_wrap_content(&mut activity)?;
41    hint.view().set_margin(&mut activity, 16)?;
42    hint.view().set_linear_layout_params(&mut activity, 0, None)?;
43    
44    // 创建 WebView
45    let webview = activity.create_web_view(Some(root.id()))?;
46    webview.view().set_linear_layout_params(&mut activity, 1, None)?;  // 占据剩余空间
47    
48    println!("✓ 界面创建完成\n");
49    
50    // 演示流程
51    demo_workflow(&mut activity, &webview)?;
52    
53    println!("\n📌 等待用户关闭窗口...");
54    
55    // 事件循环
56    loop {
57        let event = read_message(activity.event_stream())?;
58        let event_type = event["type"].as_str().unwrap_or("");
59        
60        match event_type {
61            "destroy" => {
62                println!("\n✓ Activity 已关闭");
63                return Ok(());
64            },
65            _ => {}
66        }
67    }
68}
More examples
Hide additional examples
examples/button_demo_v2.rs (line 64)
8fn main() -> Result<()> {
9    println!("=== Button 交互演示 (新库版本) ===\n");
10    
11    // 创建 Activity(对话框模式)
12    let mut activity = Activity::new(true)?;
13    println!("✓ 连接建立\n");
14    
15    // 创建主布局
16    let layout = activity.create_linear_layout(None)?;
17    
18    // 创建标题
19    let title = activity.create_text_view("计数器演示 🦀", Some(layout.id()))?;
20    title.set_text_size(&mut activity, 30)?;
21    title.view().set_margin(&mut activity, 10)?;
22    // 设置标题高度为WRAP_CONTENT,避免占用太多空间
23    title.view().set_height_wrap_content(&mut activity)?;
24    // 设置布局权重为0,不占用额外空间
25    title.view().set_linear_layout_params(&mut activity, 0, None)?;
26    
27    // 创建计数显示
28    let counter = activity.create_text_view("点击次数: 0", Some(layout.id()))?;
29    counter.set_text_size(&mut activity, 24)?;
30    counter.view().set_margin(&mut activity, 20)?;
31    // 设置计数器高度为WRAP_CONTENT
32    counter.view().set_height_wrap_content(&mut activity)?;
33    // 给计数器更高的权重,让它获得更多空间
34    counter.view().set_linear_layout_params(&mut activity, 1, None)?;
35    
36    // 创建按钮布局(横向)
37    let button_layout = activity.create_linear_layout_horizontal(Some(layout.id()))?;
38    // 按钮布局也使用WRAP_CONTENT
39    button_layout.view().set_height_wrap_content(&mut activity)?;
40    button_layout.view().set_linear_layout_params(&mut activity, 0, None)?;
41    
42    // 创建按钮
43    let inc_button = activity.create_button("➕ 增加", Some(button_layout.id()))?;
44    inc_button.view().set_linear_layout_params(&mut activity, 1, None)?;  // 均分空间
45    
46    let dec_button = activity.create_button("➖ 减少", Some(button_layout.id()))?;
47    dec_button.view().set_linear_layout_params(&mut activity, 1, None)?;  // 均分空间
48    
49    let reset_button = activity.create_button("🔄 重置", Some(layout.id()))?;
50    reset_button.view().set_height_wrap_content(&mut activity)?;
51    reset_button.view().set_linear_layout_params(&mut activity, 0, None)?;
52    
53    println!("✓ 界面创建完成");
54    println!("  - Counter ID: {}", counter.id());
55    println!("  - Button ID: {}", inc_button.id());
56    println!("━━━━━━━━━━━━━━━━━━━━━━");
57    println!("提示: 点击按钮进行交互");
58    println!("━━━━━━━━━━━━━━━━━━━━━━\n");
59    
60    // 事件循环
61    let mut count = 0;
62    
63    loop {
64        let event = read_message(activity.event_stream())?;
65        let event_type = event["type"].as_str().unwrap_or("");
66        
67        match event_type {
68            "destroy" => {
69                // Activity 已被系统销毁,直接退出即可
70                // 不要调用 activity.finish(),因为 Activity 已经不存在了
71                println!("\n✓ Activity 已关闭");
72                println!("✓ 程序结束");
73                return Ok(());
74            },
75            "click" => {
76                let id = event["value"]["id"].as_i64().unwrap_or(-1);
77                
78                if id == inc_button.id() {
79                    count += 1;
80                    println!("➕ count = {}", count);
81                } else if id == dec_button.id() {
82                    count -= 1;
83                    println!("➖ count = {}", count);
84                } else if id == reset_button.id() {
85                    count = 0;
86                    println!("🔄 count = {}", count);
87                }
88                
89                // 更新文本
90                counter.set_text(&mut activity, &format!("点击次数: {}", count))?;
91                
92                // 根据计数改变颜色
93                let color = if count > 0 {
94                    0xFF4CAF50u32 as i32  // 绿色
95                } else if count < 0 {
96                    0xFFF44336u32 as i32  // 红色
97                } else {
98                    0xFF2196F3u32 as i32  // 蓝色
99                };
100                counter.set_text_color(&mut activity, color)?;
101            },
102            _ => {}
103        }
104    }
105}
examples/tab_layout_demo_v2.rs (line 88)
9fn main() -> Result<()> {
10    println!("=== TabLayout 标签页演示 (新库版本) ===\n");
11
12    // 创建连接和 Activity
13    let mut activity = Activity::new(false)?;
14    println!("✓ 连接建立");
15
16    // 创建根布局(垂直)
17    let root = activity.create_linear_layout(None)?;
18    
19    // 创建 TabLayout(在顶部)
20    let tabs = activity.create_tab_layout(Some(root.id()))?;
21    tabs.view().set_linear_layout_params(&mut activity, 0, None)?;
22    tabs.view().set_height(&mut activity, -2)?; // WRAP_CONTENT
23    
24    // 设置标签列表
25    tabs.set_list(&mut activity, &["首页", "消息", "我的"])?;
26    
27    // 创建内容区域
28    let content_area = activity.create_linear_layout(Some(root.id()))?;
29    content_area.view().set_linear_layout_params(&mut activity, 1, None)?; // weight=1 占据剩余空间
30    
31    // 创建三个页面的内容(初始全部隐藏)
32    // 页面1 - 首页
33    let page1 = activity.create_linear_layout(Some(content_area.id()))?;
34    
35    let title1 = activity.create_text_view("📱 首页", Some(page1.id()))?;
36    title1.set_text_size(&mut activity, 28)?;
37    
38    let content1 = activity.create_text_view("\n欢迎使用 TabLayout!\n\n这是首页内容。\n\n☝️ 点击顶部标签切换页面", Some(page1.id()))?;
39    content1.set_text_size(&mut activity, 18)?;
40    
41    // 页面2 - 消息
42    let page2 = activity.create_linear_layout(Some(content_area.id()))?;
43    activity.send(&serde_json::json!({
44        "method": "setVisibility",
45        "params": {
46            "aid": activity.id(),
47            "id": page2.id(),
48            "vis": 8  // GONE initially
49        }
50    }))?;
51    
52    let title2 = activity.create_text_view("💬 消息中心", Some(page2.id()))?;
53    title2.set_text_size(&mut activity, 28)?;
54    
55    let content2 = activity.create_text_view("\n这是第二页\n\n你有 3 条新消息\n\n• 系统通知\n• 好友消息\n• 更新提醒", Some(page2.id()))?;
56    content2.set_text_size(&mut activity, 18)?;
57    
58    // 页面3 - 我的
59    let page3 = activity.create_linear_layout(Some(content_area.id()))?;
60    activity.send(&serde_json::json!({
61        "method": "setVisibility",
62        "params": {
63            "aid": activity.id(),
64            "id": page3.id(),
65            "vis": 8  // GONE initially
66        }
67    }))?;
68    
69    let title3 = activity.create_text_view("👤 个人中心", Some(page3.id()))?;
70    title3.set_text_size(&mut activity, 28)?;
71    
72    let content3 = activity.create_text_view("\n这是第三页\n\n个人信息\n\n• 账号设置\n• 隐私设置\n• 关于我们", Some(page3.id()))?;
73    content3.set_text_size(&mut activity, 18)?;
74    
75    println!("\n✓ 界面创建完成");
76    println!("\n━━━━━━━━━━━━━━━━━━━━━━");
77    println!("提示:");
78    println!("  • 点击顶部标签切换页面");
79    println!("  • 观察页面内容变化");
80    println!("━━━━━━━━━━━━━━━━━━━━━━\n");
81    
82    // 当前选中的标签页
83    let mut current_tab = 0;
84    let pages = [page1.id(), page2.id(), page3.id()];
85    
86    // 事件循环
87    loop {
88        let event = read_message(activity.event_stream())?;
89        let event_type = event["type"].as_str().unwrap_or("");
90        
91        match event_type {
92            "destroy" => {
93                println!("\n✓ Activity 已关闭");
94                return Ok(());
95            }
96            "itemselected" => {
97                // TabLayout 被点击
98                if let Some(selected) = event["value"]["selected"].as_i64() {
99                    if event["value"]["id"].as_i64() == Some(tabs.id()) {
100                        let new_tab = selected as usize;
101                        if new_tab != current_tab && new_tab < 3 {
102                            println!("切换到标签 {}: {}", new_tab, ["首页", "消息", "我的"][new_tab]);
103                            
104                            // 隐藏当前页面
105                            activity.send(&serde_json::json!({
106                                "method": "setVisibility",
107                                "params": {
108                                    "aid": activity.id(),
109                                    "id": pages[current_tab],
110                                    "vis": 8  // GONE
111                                }
112                            }))?;
113                            
114                            // 显示新页面
115                            activity.send(&serde_json::json!({
116                                "method": "setVisibility",
117                                "params": {
118                                    "aid": activity.id(),
119                                    "id": pages[new_tab],
120                                    "vis": 0  // VISIBLE
121                                }
122                            }))?;
123                            
124                            current_tab = new_tab;
125                        }
126                    }
127                }
128            }
129            _ => {}
130        }
131    }
132}
examples/image_demo_v2.rs (line 90)
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}
examples/checkbox_demo_v2.rs (line 100)
33fn main() -> Result<()> {
34    println!("=== Checkbox 复选框演示 (新库版本) ===\n");
35    
36    // 创建 Activity(对话框模式)
37    let mut activity = Activity::new(true)?;
38    println!("✓ 连接建立\n");
39    
40    // 创建主布局
41    let layout = activity.create_linear_layout(None)?;
42    
43    // 创建标题
44    let title = activity.create_text_view("选择你喜欢的功能 ✅", Some(layout.id()))?;
45    title.set_text_size(&mut activity, 26)?;
46    title.view().set_margin(&mut activity, 10)?;
47    title.view().set_height_wrap_content(&mut activity)?;
48    
49    // 创建 Checkbox 1 - WiFi (初始未选中)
50    let checkbox1 = activity.create_checkbox_checked("📶 WiFi", Some(layout.id()), false)?;
51    checkbox1.view().set_margin(&mut activity, 5)?;
52    checkbox1.view().set_height_wrap_content(&mut activity)?;
53    
54    // 创建 Checkbox 2 - 蓝牙 (初始选中)
55    let checkbox2 = activity.create_checkbox_checked("📡 蓝牙", Some(layout.id()), true)?;
56    checkbox2.view().set_margin(&mut activity, 5)?;
57    checkbox2.view().set_height_wrap_content(&mut activity)?;
58    
59    // 创建 Checkbox 3 - 定位 (初始未选中)
60    let checkbox3 = activity.create_checkbox_checked("📍 定位服务", Some(layout.id()), false)?;
61    checkbox3.view().set_margin(&mut activity, 5)?;
62    checkbox3.view().set_height_wrap_content(&mut activity)?;
63    
64    // 创建 Checkbox 4 - 通知 (初始选中)
65    let checkbox4 = activity.create_checkbox_checked("🔔 通知", Some(layout.id()), true)?;
66    checkbox4.view().set_margin(&mut activity, 5)?;
67    checkbox4.view().set_height_wrap_content(&mut activity)?;
68    
69    // 创建分隔线
70    let separator = activity.create_text_view("━━━━━━━━━━━━━━━━━━━━", Some(layout.id()))?;
71    separator.view().set_height_wrap_content(&mut activity)?;
72    
73    // 创建状态显示
74    let status = activity.create_text_view("当前选中: 蓝牙, 通知", Some(layout.id()))?;
75    status.view().set_margin(&mut activity, 10)?;
76    status.view().set_height_wrap_content(&mut activity)?;
77    status.set_text_color(&mut activity, 0xFF2196F3u32 as i32)?;
78    
79    // 创建按钮
80    let apply_button = activity.create_button("✅ 应用设置", Some(layout.id()))?;
81    apply_button.view().set_margin(&mut activity, 10)?;
82    apply_button.view().set_height_wrap_content(&mut activity)?;
83    
84    println!("✓ 界面创建完成\n");
85    println!("━━━━━━━━━━━━━━━━━━━━━━");
86    println!("提示:");
87    println!("  • 点击复选框切换状态");
88    println!("  • 观察状态实时更新");
89    println!("  • 点击 '应用设置' 查看最终选择");
90    println!("━━━━━━━━━━━━━━━━━━━━━━\n");
91    
92    // 状态跟踪
93    let mut wifi_checked = false;
94    let mut bluetooth_checked = true;
95    let mut location_checked = false;
96    let mut notification_checked = true;
97    
98    // 事件循环
99    loop {
100        let event = read_message(activity.event_stream())?;
101        let event_type = event["type"].as_str().unwrap_or("");
102        let event_value = &event["value"];
103        
104        match event_type {
105            "destroy" => {
106                // Activity 已被系统销毁,直接退出即可
107                // 不要调用 activity.finish(),因为 Activity 已经不存在了
108                println!("\n✓ Activity 已关闭");
109                return Ok(());
110            },
111            "click" => {
112                let clicked_id = event_value["id"].as_i64().unwrap_or(-1);
113                let is_checked = event_value["set"].as_bool().unwrap_or(false);
114                
115                if clicked_id == checkbox1.id() {
116                    wifi_checked = is_checked;
117                    println!("📶 WiFi: {}", if is_checked { "开启" } else { "关闭" });
118                    update_status_text(&mut activity, &status, 
119                                     wifi_checked, bluetooth_checked, 
120                                     location_checked, notification_checked)?;
121                    
122                } else if clicked_id == checkbox2.id() {
123                    bluetooth_checked = is_checked;
124                    println!("📡 蓝牙: {}", if is_checked { "开启" } else { "关闭" });
125                    update_status_text(&mut activity, &status, 
126                                     wifi_checked, bluetooth_checked, 
127                                     location_checked, notification_checked)?;
128                    
129                } else if clicked_id == checkbox3.id() {
130                    location_checked = is_checked;
131                    println!("📍 定位: {}", if is_checked { "开启" } else { "关闭" });
132                    update_status_text(&mut activity, &status, 
133                                     wifi_checked, bluetooth_checked, 
134                                     location_checked, notification_checked)?;
135                    
136                } else if clicked_id == checkbox4.id() {
137                    notification_checked = is_checked;
138                    println!("🔔 通知: {}", if is_checked { "开启" } else { "关闭" });
139                    update_status_text(&mut activity, &status, 
140                                     wifi_checked, bluetooth_checked, 
141                                     location_checked, notification_checked)?;
142                    
143                } else if clicked_id == apply_button.id() {
144                    println!("\n✅ 应用设置:");
145                    println!("  WiFi: {}", if wifi_checked { "✓" } else { "✗" });
146                    println!("  蓝牙: {}", if bluetooth_checked { "✓" } else { "✗" });
147                    println!("  定位: {}", if location_checked { "✓" } else { "✗" });
148                    println!("  通知: {}", if notification_checked { "✓" } else { "✗" });
149                    
150                    // 显示确认消息
151                    status.set_text(&mut activity, "✅ 设置已应用!")?;
152                    status.set_text_color(&mut activity, 0xFF4CAF50u32 as i32)?;
153                }
154            },
155            _ => {}
156        }
157    }
158}
examples/horizontal_scroll_demo_v2.rs (line 123)
8fn main() -> Result<()> {
9    println!("=== HorizontalScrollView 水平滚动演示 (新库版本) ===\n");
10    
11    // 创建 Activity(全屏模式)
12    let mut activity = Activity::new(false)?;
13    println!("✓ 连接建立\n");
14    
15    // 创建主垂直布局
16    let main_layout = activity.create_linear_layout(None)?;
17    main_layout.view().set_margin(&mut activity, 15)?;
18    
19    // 创建标题
20    let title = activity.create_text_view("↔️ HorizontalScrollView 演示", Some(main_layout.id()))?;
21    title.set_text_size(&mut activity, 26)?;
22    title.view().set_margin(&mut activity, 10)?;
23    title.view().set_height_wrap_content(&mut activity)?;
24    title.view().set_linear_layout_params(&mut activity, 0, None)?;
25    
26    // 创建说明
27    let desc = activity.create_text_view("左右滑动查看更多按钮", Some(main_layout.id()))?;
28    desc.view().set_margin(&mut activity, 5)?;
29    desc.view().set_height_wrap_content(&mut activity)?;
30    desc.view().set_linear_layout_params(&mut activity, 0, None)?;
31    
32    // ========== 第一行: 水果按钮 ==========
33    let section1 = activity.create_text_view("第一行: 水果按钮(左右滑动)", Some(main_layout.id()))?;
34    section1.set_text_size(&mut activity, 18)?;
35    section1.view().set_margin(&mut activity, 10)?;
36    section1.view().set_height_wrap_content(&mut activity)?;
37    section1.view().set_linear_layout_params(&mut activity, 0, None)?;
38    section1.set_text_color(&mut activity, 0xFF2196F3u32 as i32)?;
39    
40    // 创建第一个 HorizontalScrollView
41    let h_scroll1 = activity.create_horizontal_scroll_view(Some(main_layout.id()))?;
42    h_scroll1.view().set_margin(&mut activity, 10)?;
43    h_scroll1.view().set_height_wrap_content(&mut activity)?;
44    h_scroll1.view().set_linear_layout_params(&mut activity, 0, None)?;
45    
46    // 在 HorizontalScrollView 内创建水平 LinearLayout
47    let h_layout1 = activity.create_linear_layout_horizontal(Some(h_scroll1.id()))?;
48    h_layout1.view().set_height_wrap_content(&mut activity)?;
49    
50    // 添加10个水果按钮
51    let fruits = ["🍎 苹果", "🍊 橙子", "🍌 香蕉", "🍇 葡萄", "🍓 草莓", 
52                  "🍑 桃子", "🍒 樱桃", "🍍 菠萝", "🥝 猕猴桃", "🥭 芒果"];
53    let mut fruit_buttons = Vec::new();
54    for fruit in &fruits {
55        let btn = activity.create_button(fruit, Some(h_layout1.id()))?;
56        btn.view().set_width(&mut activity, 180)?;  // 固定宽度180dp
57        btn.view().set_margin(&mut activity, 5)?;
58        fruit_buttons.push(btn);
59    }
60    
61    // ========== 第二行: 数字按钮 ==========
62    let section2 = activity.create_text_view("第二行: 数字按钮(左右滑动)", Some(main_layout.id()))?;
63    section2.set_text_size(&mut activity, 18)?;
64    section2.view().set_margin(&mut activity, 10)?;
65    section2.view().set_height_wrap_content(&mut activity)?;
66    section2.view().set_linear_layout_params(&mut activity, 0, None)?;
67    section2.set_text_color(&mut activity, 0xFF4CAF50u32 as i32)?;
68    
69    // 创建第二个 HorizontalScrollView
70    let h_scroll2 = activity.create_horizontal_scroll_view(Some(main_layout.id()))?;
71    h_scroll2.view().set_margin(&mut activity, 10)?;
72    h_scroll2.view().set_height_wrap_content(&mut activity)?;
73    h_scroll2.view().set_linear_layout_params(&mut activity, 0, None)?;
74    
75    // 在 HorizontalScrollView 内创建水平 LinearLayout
76    let h_layout2 = activity.create_linear_layout_horizontal(Some(h_scroll2.id()))?;
77    h_layout2.view().set_height_wrap_content(&mut activity)?;
78    
79    // 添加20个数字按钮
80    let mut number_buttons = Vec::new();
81    for i in 0..20 {
82        let btn = activity.create_button(&format!("数字 {}", i * 5), Some(h_layout2.id()))?;
83        btn.view().set_width(&mut activity, 150)?;  // 固定宽度150dp
84        btn.view().set_margin(&mut activity, 5)?;
85        number_buttons.push(btn);
86    }
87    
88    // ========== 底部信息 ==========
89    let divider = activity.create_text_view("━━━━━━━━━━━━━━━━━━━━", Some(main_layout.id()))?;
90    divider.view().set_margin(&mut activity, 10)?;
91    divider.view().set_height_wrap_content(&mut activity)?;
92    divider.view().set_linear_layout_params(&mut activity, 0, None)?;
93    
94    let info = activity.create_text_view(
95        "💡 提示:\n\
96        • 在每一行中左右滑动\n\
97        • 点击任意按钮查看效果\n\
98        • HorizontalScrollView 支持水平滚动",
99        Some(main_layout.id())
100    )?;
101    info.view().set_margin(&mut activity, 10)?;
102    info.view().set_height_wrap_content(&mut activity)?;
103    info.view().set_linear_layout_params(&mut activity, 0, None)?;
104    info.set_text_color(&mut activity, 0xFF666666u32 as i32)?;
105    
106    // 状态显示
107    let status = activity.create_text_view("准备就绪 - 尝试左右滑动", Some(main_layout.id()))?;
108    status.view().set_margin(&mut activity, 10)?;
109    status.view().set_height_wrap_content(&mut activity)?;
110    status.view().set_linear_layout_params(&mut activity, 0, None)?;
111    status.set_text_color(&mut activity, 0xFF2196F3u32 as i32)?;
112    
113    println!("✓ 界面创建完成\n");
114    println!("━━━━━━━━━━━━━━━━━━━━━━");
115    println!("提示:");
116    println!("  • 第一行: 10个水果按钮");
117    println!("  • 第二行: 20个数字按钮");
118    println!("  • 左右滑动查看更多内容");
119    println!("━━━━━━━━━━━━━━━━━━━━━━\n");
120    
121    // 事件循环
122    loop {
123        let event = read_message(activity.event_stream())?;
124        let event_type = event["type"].as_str().unwrap_or("");
125        let event_value = &event["value"];
126        
127        match event_type {
128            "destroy" => {
129                println!("\n✓ Activity 已关闭");
130                return Ok(());
131            },
132            "click" => {
133                let clicked_id = event_value["id"].as_i64().unwrap_or(-1);
134                
135                // 检查水果按钮
136                for (i, btn) in fruit_buttons.iter().enumerate() {
137                    if clicked_id == btn.id() {
138                        println!("✅ 选择: {}", fruits[i]);
139                        status.set_text(&mut activity, &format!("✅ 选择: {}", fruits[i]))?;
140                        status.set_text_color(&mut activity, 0xFF4CAF50u32 as i32)?;
141                        break;
142                    }
143                }
144                
145                // 检查数字按钮
146                for (i, btn) in number_buttons.iter().enumerate() {
147                    if clicked_id == btn.id() {
148                        let value = i * 5;
149                        println!("🔢 选择数字: {}", value);
150                        status.set_text(&mut activity, &format!("🔢 选择数字: {}", value))?;
151                        status.set_text_color(&mut activity, 0xFFFF9800u32 as i32)?;
152                        break;
153                    }
154                }
155            },
156            _ => {}
157        }
158    }
159}
Source

pub fn create_linear_layout( &mut self, parent: Option<i64>, ) -> Result<LinearLayout>

Create a LinearLayout

Examples found in repository?
examples/webview_demo_v2.rs (line 20)
12fn main() -> Result<()> {
13    println!("=== WebView 网页视图演示 (新库版本) ===\n");
14    
15    // 创建 Activity
16    let mut activity = Activity::new(false)?;
17    println!("✓ 连接建立\n");
18    
19    // 创建根布局 (垂直)
20    let root = activity.create_linear_layout(None)?;
21    
22    // 标题文本
23    let title = activity.create_text_view("🌐 WebView 演示", Some(root.id()))?;
24    title.set_text_size(&mut activity, 20)?;
25    title.view().set_height_wrap_content(&mut activity)?;
26    title.view().set_margin(&mut activity, 16)?;
27    title.view().set_linear_layout_params(&mut activity, 0, None)?;
28    
29    // 提示文本
30    let hint = activity.create_text_view(
31        "━━━━━━━━━━━━━━━━━━━━━━\n\
32        演示步骤:\n\
33        1️⃣ 显示HTML内容 (3秒)\n\
34        2️⃣ 加载Google网页 (3秒)\n\
35        3️⃣ 请求JavaScript权限\n\
36        4️⃣ 执行JavaScript代码\n\
37        ━━━━━━━━━━━━━━━━━━━━━━", 
38        Some(root.id()))?;
39    hint.set_text_size(&mut activity, 14)?;
40    hint.view().set_height_wrap_content(&mut activity)?;
41    hint.view().set_margin(&mut activity, 16)?;
42    hint.view().set_linear_layout_params(&mut activity, 0, None)?;
43    
44    // 创建 WebView
45    let webview = activity.create_web_view(Some(root.id()))?;
46    webview.view().set_linear_layout_params(&mut activity, 1, None)?;  // 占据剩余空间
47    
48    println!("✓ 界面创建完成\n");
49    
50    // 演示流程
51    demo_workflow(&mut activity, &webview)?;
52    
53    println!("\n📌 等待用户关闭窗口...");
54    
55    // 事件循环
56    loop {
57        let event = read_message(activity.event_stream())?;
58        let event_type = event["type"].as_str().unwrap_or("");
59        
60        match event_type {
61            "destroy" => {
62                println!("\n✓ Activity 已关闭");
63                return Ok(());
64            },
65            _ => {}
66        }
67    }
68}
More examples
Hide additional examples
examples/button_demo_v2.rs (line 16)
8fn main() -> Result<()> {
9    println!("=== Button 交互演示 (新库版本) ===\n");
10    
11    // 创建 Activity(对话框模式)
12    let mut activity = Activity::new(true)?;
13    println!("✓ 连接建立\n");
14    
15    // 创建主布局
16    let layout = activity.create_linear_layout(None)?;
17    
18    // 创建标题
19    let title = activity.create_text_view("计数器演示 🦀", Some(layout.id()))?;
20    title.set_text_size(&mut activity, 30)?;
21    title.view().set_margin(&mut activity, 10)?;
22    // 设置标题高度为WRAP_CONTENT,避免占用太多空间
23    title.view().set_height_wrap_content(&mut activity)?;
24    // 设置布局权重为0,不占用额外空间
25    title.view().set_linear_layout_params(&mut activity, 0, None)?;
26    
27    // 创建计数显示
28    let counter = activity.create_text_view("点击次数: 0", Some(layout.id()))?;
29    counter.set_text_size(&mut activity, 24)?;
30    counter.view().set_margin(&mut activity, 20)?;
31    // 设置计数器高度为WRAP_CONTENT
32    counter.view().set_height_wrap_content(&mut activity)?;
33    // 给计数器更高的权重,让它获得更多空间
34    counter.view().set_linear_layout_params(&mut activity, 1, None)?;
35    
36    // 创建按钮布局(横向)
37    let button_layout = activity.create_linear_layout_horizontal(Some(layout.id()))?;
38    // 按钮布局也使用WRAP_CONTENT
39    button_layout.view().set_height_wrap_content(&mut activity)?;
40    button_layout.view().set_linear_layout_params(&mut activity, 0, None)?;
41    
42    // 创建按钮
43    let inc_button = activity.create_button("➕ 增加", Some(button_layout.id()))?;
44    inc_button.view().set_linear_layout_params(&mut activity, 1, None)?;  // 均分空间
45    
46    let dec_button = activity.create_button("➖ 减少", Some(button_layout.id()))?;
47    dec_button.view().set_linear_layout_params(&mut activity, 1, None)?;  // 均分空间
48    
49    let reset_button = activity.create_button("🔄 重置", Some(layout.id()))?;
50    reset_button.view().set_height_wrap_content(&mut activity)?;
51    reset_button.view().set_linear_layout_params(&mut activity, 0, None)?;
52    
53    println!("✓ 界面创建完成");
54    println!("  - Counter ID: {}", counter.id());
55    println!("  - Button ID: {}", inc_button.id());
56    println!("━━━━━━━━━━━━━━━━━━━━━━");
57    println!("提示: 点击按钮进行交互");
58    println!("━━━━━━━━━━━━━━━━━━━━━━\n");
59    
60    // 事件循环
61    let mut count = 0;
62    
63    loop {
64        let event = read_message(activity.event_stream())?;
65        let event_type = event["type"].as_str().unwrap_or("");
66        
67        match event_type {
68            "destroy" => {
69                // Activity 已被系统销毁,直接退出即可
70                // 不要调用 activity.finish(),因为 Activity 已经不存在了
71                println!("\n✓ Activity 已关闭");
72                println!("✓ 程序结束");
73                return Ok(());
74            },
75            "click" => {
76                let id = event["value"]["id"].as_i64().unwrap_or(-1);
77                
78                if id == inc_button.id() {
79                    count += 1;
80                    println!("➕ count = {}", count);
81                } else if id == dec_button.id() {
82                    count -= 1;
83                    println!("➖ count = {}", count);
84                } else if id == reset_button.id() {
85                    count = 0;
86                    println!("🔄 count = {}", count);
87                }
88                
89                // 更新文本
90                counter.set_text(&mut activity, &format!("点击次数: {}", count))?;
91                
92                // 根据计数改变颜色
93                let color = if count > 0 {
94                    0xFF4CAF50u32 as i32  // 绿色
95                } else if count < 0 {
96                    0xFFF44336u32 as i32  // 红色
97                } else {
98                    0xFF2196F3u32 as i32  // 蓝色
99                };
100                counter.set_text_color(&mut activity, color)?;
101            },
102            _ => {}
103        }
104    }
105}
examples/tab_layout_demo_v2.rs (line 17)
9fn main() -> Result<()> {
10    println!("=== TabLayout 标签页演示 (新库版本) ===\n");
11
12    // 创建连接和 Activity
13    let mut activity = Activity::new(false)?;
14    println!("✓ 连接建立");
15
16    // 创建根布局(垂直)
17    let root = activity.create_linear_layout(None)?;
18    
19    // 创建 TabLayout(在顶部)
20    let tabs = activity.create_tab_layout(Some(root.id()))?;
21    tabs.view().set_linear_layout_params(&mut activity, 0, None)?;
22    tabs.view().set_height(&mut activity, -2)?; // WRAP_CONTENT
23    
24    // 设置标签列表
25    tabs.set_list(&mut activity, &["首页", "消息", "我的"])?;
26    
27    // 创建内容区域
28    let content_area = activity.create_linear_layout(Some(root.id()))?;
29    content_area.view().set_linear_layout_params(&mut activity, 1, None)?; // weight=1 占据剩余空间
30    
31    // 创建三个页面的内容(初始全部隐藏)
32    // 页面1 - 首页
33    let page1 = activity.create_linear_layout(Some(content_area.id()))?;
34    
35    let title1 = activity.create_text_view("📱 首页", Some(page1.id()))?;
36    title1.set_text_size(&mut activity, 28)?;
37    
38    let content1 = activity.create_text_view("\n欢迎使用 TabLayout!\n\n这是首页内容。\n\n☝️ 点击顶部标签切换页面", Some(page1.id()))?;
39    content1.set_text_size(&mut activity, 18)?;
40    
41    // 页面2 - 消息
42    let page2 = activity.create_linear_layout(Some(content_area.id()))?;
43    activity.send(&serde_json::json!({
44        "method": "setVisibility",
45        "params": {
46            "aid": activity.id(),
47            "id": page2.id(),
48            "vis": 8  // GONE initially
49        }
50    }))?;
51    
52    let title2 = activity.create_text_view("💬 消息中心", Some(page2.id()))?;
53    title2.set_text_size(&mut activity, 28)?;
54    
55    let content2 = activity.create_text_view("\n这是第二页\n\n你有 3 条新消息\n\n• 系统通知\n• 好友消息\n• 更新提醒", Some(page2.id()))?;
56    content2.set_text_size(&mut activity, 18)?;
57    
58    // 页面3 - 我的
59    let page3 = activity.create_linear_layout(Some(content_area.id()))?;
60    activity.send(&serde_json::json!({
61        "method": "setVisibility",
62        "params": {
63            "aid": activity.id(),
64            "id": page3.id(),
65            "vis": 8  // GONE initially
66        }
67    }))?;
68    
69    let title3 = activity.create_text_view("👤 个人中心", Some(page3.id()))?;
70    title3.set_text_size(&mut activity, 28)?;
71    
72    let content3 = activity.create_text_view("\n这是第三页\n\n个人信息\n\n• 账号设置\n• 隐私设置\n• 关于我们", Some(page3.id()))?;
73    content3.set_text_size(&mut activity, 18)?;
74    
75    println!("\n✓ 界面创建完成");
76    println!("\n━━━━━━━━━━━━━━━━━━━━━━");
77    println!("提示:");
78    println!("  • 点击顶部标签切换页面");
79    println!("  • 观察页面内容变化");
80    println!("━━━━━━━━━━━━━━━━━━━━━━\n");
81    
82    // 当前选中的标签页
83    let mut current_tab = 0;
84    let pages = [page1.id(), page2.id(), page3.id()];
85    
86    // 事件循环
87    loop {
88        let event = read_message(activity.event_stream())?;
89        let event_type = event["type"].as_str().unwrap_or("");
90        
91        match event_type {
92            "destroy" => {
93                println!("\n✓ Activity 已关闭");
94                return Ok(());
95            }
96            "itemselected" => {
97                // TabLayout 被点击
98                if let Some(selected) = event["value"]["selected"].as_i64() {
99                    if event["value"]["id"].as_i64() == Some(tabs.id()) {
100                        let new_tab = selected as usize;
101                        if new_tab != current_tab && new_tab < 3 {
102                            println!("切换到标签 {}: {}", new_tab, ["首页", "消息", "我的"][new_tab]);
103                            
104                            // 隐藏当前页面
105                            activity.send(&serde_json::json!({
106                                "method": "setVisibility",
107                                "params": {
108                                    "aid": activity.id(),
109                                    "id": pages[current_tab],
110                                    "vis": 8  // GONE
111                                }
112                            }))?;
113                            
114                            // 显示新页面
115                            activity.send(&serde_json::json!({
116                                "method": "setVisibility",
117                                "params": {
118                                    "aid": activity.id(),
119                                    "id": pages[new_tab],
120                                    "vis": 0  // VISIBLE
121                                }
122                            }))?;
123                            
124                            current_tab = new_tab;
125                        }
126                    }
127                }
128            }
129            _ => {}
130        }
131    }
132}
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}
examples/checkbox_demo_v2.rs (line 41)
33fn main() -> Result<()> {
34    println!("=== Checkbox 复选框演示 (新库版本) ===\n");
35    
36    // 创建 Activity(对话框模式)
37    let mut activity = Activity::new(true)?;
38    println!("✓ 连接建立\n");
39    
40    // 创建主布局
41    let layout = activity.create_linear_layout(None)?;
42    
43    // 创建标题
44    let title = activity.create_text_view("选择你喜欢的功能 ✅", Some(layout.id()))?;
45    title.set_text_size(&mut activity, 26)?;
46    title.view().set_margin(&mut activity, 10)?;
47    title.view().set_height_wrap_content(&mut activity)?;
48    
49    // 创建 Checkbox 1 - WiFi (初始未选中)
50    let checkbox1 = activity.create_checkbox_checked("📶 WiFi", Some(layout.id()), false)?;
51    checkbox1.view().set_margin(&mut activity, 5)?;
52    checkbox1.view().set_height_wrap_content(&mut activity)?;
53    
54    // 创建 Checkbox 2 - 蓝牙 (初始选中)
55    let checkbox2 = activity.create_checkbox_checked("📡 蓝牙", Some(layout.id()), true)?;
56    checkbox2.view().set_margin(&mut activity, 5)?;
57    checkbox2.view().set_height_wrap_content(&mut activity)?;
58    
59    // 创建 Checkbox 3 - 定位 (初始未选中)
60    let checkbox3 = activity.create_checkbox_checked("📍 定位服务", Some(layout.id()), false)?;
61    checkbox3.view().set_margin(&mut activity, 5)?;
62    checkbox3.view().set_height_wrap_content(&mut activity)?;
63    
64    // 创建 Checkbox 4 - 通知 (初始选中)
65    let checkbox4 = activity.create_checkbox_checked("🔔 通知", Some(layout.id()), true)?;
66    checkbox4.view().set_margin(&mut activity, 5)?;
67    checkbox4.view().set_height_wrap_content(&mut activity)?;
68    
69    // 创建分隔线
70    let separator = activity.create_text_view("━━━━━━━━━━━━━━━━━━━━", Some(layout.id()))?;
71    separator.view().set_height_wrap_content(&mut activity)?;
72    
73    // 创建状态显示
74    let status = activity.create_text_view("当前选中: 蓝牙, 通知", Some(layout.id()))?;
75    status.view().set_margin(&mut activity, 10)?;
76    status.view().set_height_wrap_content(&mut activity)?;
77    status.set_text_color(&mut activity, 0xFF2196F3u32 as i32)?;
78    
79    // 创建按钮
80    let apply_button = activity.create_button("✅ 应用设置", Some(layout.id()))?;
81    apply_button.view().set_margin(&mut activity, 10)?;
82    apply_button.view().set_height_wrap_content(&mut activity)?;
83    
84    println!("✓ 界面创建完成\n");
85    println!("━━━━━━━━━━━━━━━━━━━━━━");
86    println!("提示:");
87    println!("  • 点击复选框切换状态");
88    println!("  • 观察状态实时更新");
89    println!("  • 点击 '应用设置' 查看最终选择");
90    println!("━━━━━━━━━━━━━━━━━━━━━━\n");
91    
92    // 状态跟踪
93    let mut wifi_checked = false;
94    let mut bluetooth_checked = true;
95    let mut location_checked = false;
96    let mut notification_checked = true;
97    
98    // 事件循环
99    loop {
100        let event = read_message(activity.event_stream())?;
101        let event_type = event["type"].as_str().unwrap_or("");
102        let event_value = &event["value"];
103        
104        match event_type {
105            "destroy" => {
106                // Activity 已被系统销毁,直接退出即可
107                // 不要调用 activity.finish(),因为 Activity 已经不存在了
108                println!("\n✓ Activity 已关闭");
109                return Ok(());
110            },
111            "click" => {
112                let clicked_id = event_value["id"].as_i64().unwrap_or(-1);
113                let is_checked = event_value["set"].as_bool().unwrap_or(false);
114                
115                if clicked_id == checkbox1.id() {
116                    wifi_checked = is_checked;
117                    println!("📶 WiFi: {}", if is_checked { "开启" } else { "关闭" });
118                    update_status_text(&mut activity, &status, 
119                                     wifi_checked, bluetooth_checked, 
120                                     location_checked, notification_checked)?;
121                    
122                } else if clicked_id == checkbox2.id() {
123                    bluetooth_checked = is_checked;
124                    println!("📡 蓝牙: {}", if is_checked { "开启" } else { "关闭" });
125                    update_status_text(&mut activity, &status, 
126                                     wifi_checked, bluetooth_checked, 
127                                     location_checked, notification_checked)?;
128                    
129                } else if clicked_id == checkbox3.id() {
130                    location_checked = is_checked;
131                    println!("📍 定位: {}", if is_checked { "开启" } else { "关闭" });
132                    update_status_text(&mut activity, &status, 
133                                     wifi_checked, bluetooth_checked, 
134                                     location_checked, notification_checked)?;
135                    
136                } else if clicked_id == checkbox4.id() {
137                    notification_checked = is_checked;
138                    println!("🔔 通知: {}", if is_checked { "开启" } else { "关闭" });
139                    update_status_text(&mut activity, &status, 
140                                     wifi_checked, bluetooth_checked, 
141                                     location_checked, notification_checked)?;
142                    
143                } else if clicked_id == apply_button.id() {
144                    println!("\n✅ 应用设置:");
145                    println!("  WiFi: {}", if wifi_checked { "✓" } else { "✗" });
146                    println!("  蓝牙: {}", if bluetooth_checked { "✓" } else { "✗" });
147                    println!("  定位: {}", if location_checked { "✓" } else { "✗" });
148                    println!("  通知: {}", if notification_checked { "✓" } else { "✗" });
149                    
150                    // 显示确认消息
151                    status.set_text(&mut activity, "✅ 设置已应用!")?;
152                    status.set_text_color(&mut activity, 0xFF4CAF50u32 as i32)?;
153                }
154            },
155            _ => {}
156        }
157    }
158}
examples/horizontal_scroll_demo_v2.rs (line 16)
8fn main() -> Result<()> {
9    println!("=== HorizontalScrollView 水平滚动演示 (新库版本) ===\n");
10    
11    // 创建 Activity(全屏模式)
12    let mut activity = Activity::new(false)?;
13    println!("✓ 连接建立\n");
14    
15    // 创建主垂直布局
16    let main_layout = activity.create_linear_layout(None)?;
17    main_layout.view().set_margin(&mut activity, 15)?;
18    
19    // 创建标题
20    let title = activity.create_text_view("↔️ HorizontalScrollView 演示", Some(main_layout.id()))?;
21    title.set_text_size(&mut activity, 26)?;
22    title.view().set_margin(&mut activity, 10)?;
23    title.view().set_height_wrap_content(&mut activity)?;
24    title.view().set_linear_layout_params(&mut activity, 0, None)?;
25    
26    // 创建说明
27    let desc = activity.create_text_view("左右滑动查看更多按钮", Some(main_layout.id()))?;
28    desc.view().set_margin(&mut activity, 5)?;
29    desc.view().set_height_wrap_content(&mut activity)?;
30    desc.view().set_linear_layout_params(&mut activity, 0, None)?;
31    
32    // ========== 第一行: 水果按钮 ==========
33    let section1 = activity.create_text_view("第一行: 水果按钮(左右滑动)", Some(main_layout.id()))?;
34    section1.set_text_size(&mut activity, 18)?;
35    section1.view().set_margin(&mut activity, 10)?;
36    section1.view().set_height_wrap_content(&mut activity)?;
37    section1.view().set_linear_layout_params(&mut activity, 0, None)?;
38    section1.set_text_color(&mut activity, 0xFF2196F3u32 as i32)?;
39    
40    // 创建第一个 HorizontalScrollView
41    let h_scroll1 = activity.create_horizontal_scroll_view(Some(main_layout.id()))?;
42    h_scroll1.view().set_margin(&mut activity, 10)?;
43    h_scroll1.view().set_height_wrap_content(&mut activity)?;
44    h_scroll1.view().set_linear_layout_params(&mut activity, 0, None)?;
45    
46    // 在 HorizontalScrollView 内创建水平 LinearLayout
47    let h_layout1 = activity.create_linear_layout_horizontal(Some(h_scroll1.id()))?;
48    h_layout1.view().set_height_wrap_content(&mut activity)?;
49    
50    // 添加10个水果按钮
51    let fruits = ["🍎 苹果", "🍊 橙子", "🍌 香蕉", "🍇 葡萄", "🍓 草莓", 
52                  "🍑 桃子", "🍒 樱桃", "🍍 菠萝", "🥝 猕猴桃", "🥭 芒果"];
53    let mut fruit_buttons = Vec::new();
54    for fruit in &fruits {
55        let btn = activity.create_button(fruit, Some(h_layout1.id()))?;
56        btn.view().set_width(&mut activity, 180)?;  // 固定宽度180dp
57        btn.view().set_margin(&mut activity, 5)?;
58        fruit_buttons.push(btn);
59    }
60    
61    // ========== 第二行: 数字按钮 ==========
62    let section2 = activity.create_text_view("第二行: 数字按钮(左右滑动)", Some(main_layout.id()))?;
63    section2.set_text_size(&mut activity, 18)?;
64    section2.view().set_margin(&mut activity, 10)?;
65    section2.view().set_height_wrap_content(&mut activity)?;
66    section2.view().set_linear_layout_params(&mut activity, 0, None)?;
67    section2.set_text_color(&mut activity, 0xFF4CAF50u32 as i32)?;
68    
69    // 创建第二个 HorizontalScrollView
70    let h_scroll2 = activity.create_horizontal_scroll_view(Some(main_layout.id()))?;
71    h_scroll2.view().set_margin(&mut activity, 10)?;
72    h_scroll2.view().set_height_wrap_content(&mut activity)?;
73    h_scroll2.view().set_linear_layout_params(&mut activity, 0, None)?;
74    
75    // 在 HorizontalScrollView 内创建水平 LinearLayout
76    let h_layout2 = activity.create_linear_layout_horizontal(Some(h_scroll2.id()))?;
77    h_layout2.view().set_height_wrap_content(&mut activity)?;
78    
79    // 添加20个数字按钮
80    let mut number_buttons = Vec::new();
81    for i in 0..20 {
82        let btn = activity.create_button(&format!("数字 {}", i * 5), Some(h_layout2.id()))?;
83        btn.view().set_width(&mut activity, 150)?;  // 固定宽度150dp
84        btn.view().set_margin(&mut activity, 5)?;
85        number_buttons.push(btn);
86    }
87    
88    // ========== 底部信息 ==========
89    let divider = activity.create_text_view("━━━━━━━━━━━━━━━━━━━━", Some(main_layout.id()))?;
90    divider.view().set_margin(&mut activity, 10)?;
91    divider.view().set_height_wrap_content(&mut activity)?;
92    divider.view().set_linear_layout_params(&mut activity, 0, None)?;
93    
94    let info = activity.create_text_view(
95        "💡 提示:\n\
96        • 在每一行中左右滑动\n\
97        • 点击任意按钮查看效果\n\
98        • HorizontalScrollView 支持水平滚动",
99        Some(main_layout.id())
100    )?;
101    info.view().set_margin(&mut activity, 10)?;
102    info.view().set_height_wrap_content(&mut activity)?;
103    info.view().set_linear_layout_params(&mut activity, 0, None)?;
104    info.set_text_color(&mut activity, 0xFF666666u32 as i32)?;
105    
106    // 状态显示
107    let status = activity.create_text_view("准备就绪 - 尝试左右滑动", Some(main_layout.id()))?;
108    status.view().set_margin(&mut activity, 10)?;
109    status.view().set_height_wrap_content(&mut activity)?;
110    status.view().set_linear_layout_params(&mut activity, 0, None)?;
111    status.set_text_color(&mut activity, 0xFF2196F3u32 as i32)?;
112    
113    println!("✓ 界面创建完成\n");
114    println!("━━━━━━━━━━━━━━━━━━━━━━");
115    println!("提示:");
116    println!("  • 第一行: 10个水果按钮");
117    println!("  • 第二行: 20个数字按钮");
118    println!("  • 左右滑动查看更多内容");
119    println!("━━━━━━━━━━━━━━━━━━━━━━\n");
120    
121    // 事件循环
122    loop {
123        let event = read_message(activity.event_stream())?;
124        let event_type = event["type"].as_str().unwrap_or("");
125        let event_value = &event["value"];
126        
127        match event_type {
128            "destroy" => {
129                println!("\n✓ Activity 已关闭");
130                return Ok(());
131            },
132            "click" => {
133                let clicked_id = event_value["id"].as_i64().unwrap_or(-1);
134                
135                // 检查水果按钮
136                for (i, btn) in fruit_buttons.iter().enumerate() {
137                    if clicked_id == btn.id() {
138                        println!("✅ 选择: {}", fruits[i]);
139                        status.set_text(&mut activity, &format!("✅ 选择: {}", fruits[i]))?;
140                        status.set_text_color(&mut activity, 0xFF4CAF50u32 as i32)?;
141                        break;
142                    }
143                }
144                
145                // 检查数字按钮
146                for (i, btn) in number_buttons.iter().enumerate() {
147                    if clicked_id == btn.id() {
148                        let value = i * 5;
149                        println!("🔢 选择数字: {}", value);
150                        status.set_text(&mut activity, &format!("🔢 选择数字: {}", value))?;
151                        status.set_text_color(&mut activity, 0xFFFF9800u32 as i32)?;
152                        break;
153                    }
154                }
155            },
156            _ => {}
157        }
158    }
159}
Source

pub fn create_linear_layout_horizontal( &mut self, parent: Option<i64>, ) -> Result<LinearLayout>

Create a LinearLayout with specified orientation

Examples found in repository?
examples/button_demo_v2.rs (line 37)
8fn main() -> Result<()> {
9    println!("=== Button 交互演示 (新库版本) ===\n");
10    
11    // 创建 Activity(对话框模式)
12    let mut activity = Activity::new(true)?;
13    println!("✓ 连接建立\n");
14    
15    // 创建主布局
16    let layout = activity.create_linear_layout(None)?;
17    
18    // 创建标题
19    let title = activity.create_text_view("计数器演示 🦀", Some(layout.id()))?;
20    title.set_text_size(&mut activity, 30)?;
21    title.view().set_margin(&mut activity, 10)?;
22    // 设置标题高度为WRAP_CONTENT,避免占用太多空间
23    title.view().set_height_wrap_content(&mut activity)?;
24    // 设置布局权重为0,不占用额外空间
25    title.view().set_linear_layout_params(&mut activity, 0, None)?;
26    
27    // 创建计数显示
28    let counter = activity.create_text_view("点击次数: 0", Some(layout.id()))?;
29    counter.set_text_size(&mut activity, 24)?;
30    counter.view().set_margin(&mut activity, 20)?;
31    // 设置计数器高度为WRAP_CONTENT
32    counter.view().set_height_wrap_content(&mut activity)?;
33    // 给计数器更高的权重,让它获得更多空间
34    counter.view().set_linear_layout_params(&mut activity, 1, None)?;
35    
36    // 创建按钮布局(横向)
37    let button_layout = activity.create_linear_layout_horizontal(Some(layout.id()))?;
38    // 按钮布局也使用WRAP_CONTENT
39    button_layout.view().set_height_wrap_content(&mut activity)?;
40    button_layout.view().set_linear_layout_params(&mut activity, 0, None)?;
41    
42    // 创建按钮
43    let inc_button = activity.create_button("➕ 增加", Some(button_layout.id()))?;
44    inc_button.view().set_linear_layout_params(&mut activity, 1, None)?;  // 均分空间
45    
46    let dec_button = activity.create_button("➖ 减少", Some(button_layout.id()))?;
47    dec_button.view().set_linear_layout_params(&mut activity, 1, None)?;  // 均分空间
48    
49    let reset_button = activity.create_button("🔄 重置", Some(layout.id()))?;
50    reset_button.view().set_height_wrap_content(&mut activity)?;
51    reset_button.view().set_linear_layout_params(&mut activity, 0, None)?;
52    
53    println!("✓ 界面创建完成");
54    println!("  - Counter ID: {}", counter.id());
55    println!("  - Button ID: {}", inc_button.id());
56    println!("━━━━━━━━━━━━━━━━━━━━━━");
57    println!("提示: 点击按钮进行交互");
58    println!("━━━━━━━━━━━━━━━━━━━━━━\n");
59    
60    // 事件循环
61    let mut count = 0;
62    
63    loop {
64        let event = read_message(activity.event_stream())?;
65        let event_type = event["type"].as_str().unwrap_or("");
66        
67        match event_type {
68            "destroy" => {
69                // Activity 已被系统销毁,直接退出即可
70                // 不要调用 activity.finish(),因为 Activity 已经不存在了
71                println!("\n✓ Activity 已关闭");
72                println!("✓ 程序结束");
73                return Ok(());
74            },
75            "click" => {
76                let id = event["value"]["id"].as_i64().unwrap_or(-1);
77                
78                if id == inc_button.id() {
79                    count += 1;
80                    println!("➕ count = {}", count);
81                } else if id == dec_button.id() {
82                    count -= 1;
83                    println!("➖ count = {}", count);
84                } else if id == reset_button.id() {
85                    count = 0;
86                    println!("🔄 count = {}", count);
87                }
88                
89                // 更新文本
90                counter.set_text(&mut activity, &format!("点击次数: {}", count))?;
91                
92                // 根据计数改变颜色
93                let color = if count > 0 {
94                    0xFF4CAF50u32 as i32  // 绿色
95                } else if count < 0 {
96                    0xFFF44336u32 as i32  // 红色
97                } else {
98                    0xFF2196F3u32 as i32  // 蓝色
99                };
100                counter.set_text_color(&mut activity, color)?;
101            },
102            _ => {}
103        }
104    }
105}
More examples
Hide additional examples
examples/image_demo_v2.rs (line 56)
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}
examples/horizontal_scroll_demo_v2.rs (line 47)
8fn main() -> Result<()> {
9    println!("=== HorizontalScrollView 水平滚动演示 (新库版本) ===\n");
10    
11    // 创建 Activity(全屏模式)
12    let mut activity = Activity::new(false)?;
13    println!("✓ 连接建立\n");
14    
15    // 创建主垂直布局
16    let main_layout = activity.create_linear_layout(None)?;
17    main_layout.view().set_margin(&mut activity, 15)?;
18    
19    // 创建标题
20    let title = activity.create_text_view("↔️ HorizontalScrollView 演示", Some(main_layout.id()))?;
21    title.set_text_size(&mut activity, 26)?;
22    title.view().set_margin(&mut activity, 10)?;
23    title.view().set_height_wrap_content(&mut activity)?;
24    title.view().set_linear_layout_params(&mut activity, 0, None)?;
25    
26    // 创建说明
27    let desc = activity.create_text_view("左右滑动查看更多按钮", Some(main_layout.id()))?;
28    desc.view().set_margin(&mut activity, 5)?;
29    desc.view().set_height_wrap_content(&mut activity)?;
30    desc.view().set_linear_layout_params(&mut activity, 0, None)?;
31    
32    // ========== 第一行: 水果按钮 ==========
33    let section1 = activity.create_text_view("第一行: 水果按钮(左右滑动)", Some(main_layout.id()))?;
34    section1.set_text_size(&mut activity, 18)?;
35    section1.view().set_margin(&mut activity, 10)?;
36    section1.view().set_height_wrap_content(&mut activity)?;
37    section1.view().set_linear_layout_params(&mut activity, 0, None)?;
38    section1.set_text_color(&mut activity, 0xFF2196F3u32 as i32)?;
39    
40    // 创建第一个 HorizontalScrollView
41    let h_scroll1 = activity.create_horizontal_scroll_view(Some(main_layout.id()))?;
42    h_scroll1.view().set_margin(&mut activity, 10)?;
43    h_scroll1.view().set_height_wrap_content(&mut activity)?;
44    h_scroll1.view().set_linear_layout_params(&mut activity, 0, None)?;
45    
46    // 在 HorizontalScrollView 内创建水平 LinearLayout
47    let h_layout1 = activity.create_linear_layout_horizontal(Some(h_scroll1.id()))?;
48    h_layout1.view().set_height_wrap_content(&mut activity)?;
49    
50    // 添加10个水果按钮
51    let fruits = ["🍎 苹果", "🍊 橙子", "🍌 香蕉", "🍇 葡萄", "🍓 草莓", 
52                  "🍑 桃子", "🍒 樱桃", "🍍 菠萝", "🥝 猕猴桃", "🥭 芒果"];
53    let mut fruit_buttons = Vec::new();
54    for fruit in &fruits {
55        let btn = activity.create_button(fruit, Some(h_layout1.id()))?;
56        btn.view().set_width(&mut activity, 180)?;  // 固定宽度180dp
57        btn.view().set_margin(&mut activity, 5)?;
58        fruit_buttons.push(btn);
59    }
60    
61    // ========== 第二行: 数字按钮 ==========
62    let section2 = activity.create_text_view("第二行: 数字按钮(左右滑动)", Some(main_layout.id()))?;
63    section2.set_text_size(&mut activity, 18)?;
64    section2.view().set_margin(&mut activity, 10)?;
65    section2.view().set_height_wrap_content(&mut activity)?;
66    section2.view().set_linear_layout_params(&mut activity, 0, None)?;
67    section2.set_text_color(&mut activity, 0xFF4CAF50u32 as i32)?;
68    
69    // 创建第二个 HorizontalScrollView
70    let h_scroll2 = activity.create_horizontal_scroll_view(Some(main_layout.id()))?;
71    h_scroll2.view().set_margin(&mut activity, 10)?;
72    h_scroll2.view().set_height_wrap_content(&mut activity)?;
73    h_scroll2.view().set_linear_layout_params(&mut activity, 0, None)?;
74    
75    // 在 HorizontalScrollView 内创建水平 LinearLayout
76    let h_layout2 = activity.create_linear_layout_horizontal(Some(h_scroll2.id()))?;
77    h_layout2.view().set_height_wrap_content(&mut activity)?;
78    
79    // 添加20个数字按钮
80    let mut number_buttons = Vec::new();
81    for i in 0..20 {
82        let btn = activity.create_button(&format!("数字 {}", i * 5), Some(h_layout2.id()))?;
83        btn.view().set_width(&mut activity, 150)?;  // 固定宽度150dp
84        btn.view().set_margin(&mut activity, 5)?;
85        number_buttons.push(btn);
86    }
87    
88    // ========== 底部信息 ==========
89    let divider = activity.create_text_view("━━━━━━━━━━━━━━━━━━━━", Some(main_layout.id()))?;
90    divider.view().set_margin(&mut activity, 10)?;
91    divider.view().set_height_wrap_content(&mut activity)?;
92    divider.view().set_linear_layout_params(&mut activity, 0, None)?;
93    
94    let info = activity.create_text_view(
95        "💡 提示:\n\
96        • 在每一行中左右滑动\n\
97        • 点击任意按钮查看效果\n\
98        • HorizontalScrollView 支持水平滚动",
99        Some(main_layout.id())
100    )?;
101    info.view().set_margin(&mut activity, 10)?;
102    info.view().set_height_wrap_content(&mut activity)?;
103    info.view().set_linear_layout_params(&mut activity, 0, None)?;
104    info.set_text_color(&mut activity, 0xFF666666u32 as i32)?;
105    
106    // 状态显示
107    let status = activity.create_text_view("准备就绪 - 尝试左右滑动", Some(main_layout.id()))?;
108    status.view().set_margin(&mut activity, 10)?;
109    status.view().set_height_wrap_content(&mut activity)?;
110    status.view().set_linear_layout_params(&mut activity, 0, None)?;
111    status.set_text_color(&mut activity, 0xFF2196F3u32 as i32)?;
112    
113    println!("✓ 界面创建完成\n");
114    println!("━━━━━━━━━━━━━━━━━━━━━━");
115    println!("提示:");
116    println!("  • 第一行: 10个水果按钮");
117    println!("  • 第二行: 20个数字按钮");
118    println!("  • 左右滑动查看更多内容");
119    println!("━━━━━━━━━━━━━━━━━━━━━━\n");
120    
121    // 事件循环
122    loop {
123        let event = read_message(activity.event_stream())?;
124        let event_type = event["type"].as_str().unwrap_or("");
125        let event_value = &event["value"];
126        
127        match event_type {
128            "destroy" => {
129                println!("\n✓ Activity 已关闭");
130                return Ok(());
131            },
132            "click" => {
133                let clicked_id = event_value["id"].as_i64().unwrap_or(-1);
134                
135                // 检查水果按钮
136                for (i, btn) in fruit_buttons.iter().enumerate() {
137                    if clicked_id == btn.id() {
138                        println!("✅ 选择: {}", fruits[i]);
139                        status.set_text(&mut activity, &format!("✅ 选择: {}", fruits[i]))?;
140                        status.set_text_color(&mut activity, 0xFF4CAF50u32 as i32)?;
141                        break;
142                    }
143                }
144                
145                // 检查数字按钮
146                for (i, btn) in number_buttons.iter().enumerate() {
147                    if clicked_id == btn.id() {
148                        let value = i * 5;
149                        println!("🔢 选择数字: {}", value);
150                        status.set_text(&mut activity, &format!("🔢 选择数字: {}", value))?;
151                        status.set_text_color(&mut activity, 0xFFFF9800u32 as i32)?;
152                        break;
153                    }
154                }
155            },
156            _ => {}
157        }
158    }
159}
examples/switch_demo_v2.rs (line 116)
48fn main() -> Result<()> {
49    println!("=== Switch 开关演示 (新库版本) ===\n");
50    
51    // 创建 Activity(对话框模式)
52    let mut activity = Activity::new(true)?;
53    println!("✓ 连接建立\n");
54    
55    // 创建主布局
56    let layout = activity.create_linear_layout(None)?;
57    
58    // 创建标题
59    let title = activity.create_text_view("智能家居控制 🏠", Some(layout.id()))?;
60    title.set_text_size(&mut activity, 28)?;
61    title.view().set_margin(&mut activity, 10)?;
62    title.view().set_height_wrap_content(&mut activity)?;
63    title.view().set_linear_layout_params(&mut activity, 0, None)?;
64    
65    // 创建说明
66    let desc = activity.create_text_view("滑动开关控制设备", Some(layout.id()))?;
67    desc.view().set_margin(&mut activity, 5)?;
68    desc.view().set_height_wrap_content(&mut activity)?;
69    desc.view().set_linear_layout_params(&mut activity, 0, None)?;
70    
71    // 创建 Switch 1 - 客厅灯(初始开启)
72    let switch1 = activity.create_switch_checked("💡 客厅灯", Some(layout.id()), true)?;
73    switch1.view().set_margin(&mut activity, 8)?;
74    switch1.view().set_height_wrap_content(&mut activity)?;
75    switch1.view().set_linear_layout_params(&mut activity, 0, None)?;
76    
77    // 创建 Switch 2 - 空调(初始关闭)
78    let switch2 = activity.create_switch_checked("❄️ 空调", Some(layout.id()), false)?;
79    switch2.view().set_margin(&mut activity, 8)?;
80    switch2.view().set_height_wrap_content(&mut activity)?;
81    switch2.view().set_linear_layout_params(&mut activity, 0, None)?;
82    
83    // 创建 Switch 3 - 加湿器(初始关闭)
84    let switch3 = activity.create_switch_checked("💧 加湿器", Some(layout.id()), false)?;
85    switch3.view().set_margin(&mut activity, 8)?;
86    switch3.view().set_height_wrap_content(&mut activity)?;
87    switch3.view().set_linear_layout_params(&mut activity, 0, None)?;
88    
89    // 创建 Switch 4 - 窗帘(初始开启)
90    let switch4 = activity.create_switch_checked("🪟 电动窗帘", Some(layout.id()), true)?;
91    switch4.view().set_margin(&mut activity, 8)?;
92    switch4.view().set_height_wrap_content(&mut activity)?;
93    switch4.view().set_linear_layout_params(&mut activity, 0, None)?;
94    
95    // 创建 Switch 5 - 音乐(初始关闭)
96    let switch5 = activity.create_switch_checked("🎵 背景音乐", Some(layout.id()), false)?;
97    switch5.view().set_margin(&mut activity, 8)?;
98    switch5.view().set_height_wrap_content(&mut activity)?;
99    switch5.view().set_linear_layout_params(&mut activity, 0, None)?;
100    
101    // 创建分隔线
102    let divider = activity.create_text_view("━━━━━━━━━━━━━━━━━━━━", Some(layout.id()))?;
103    divider.view().set_margin(&mut activity, 10)?;
104    divider.view().set_height_wrap_content(&mut activity)?;
105    divider.view().set_linear_layout_params(&mut activity, 0, None)?;
106    
107    // 创建状态显示
108    let status = activity.create_text_view("已开启: 客厅灯, 窗帘", Some(layout.id()))?;
109    status.set_text_size(&mut activity, 16)?;
110    status.view().set_margin(&mut activity, 10)?;
111    status.view().set_height_wrap_content(&mut activity)?;
112    status.view().set_linear_layout_params(&mut activity, 0, None)?;
113    status.set_text_color(&mut activity, 0xFF4CAF50u32 as i32)?;
114    
115    // 创建按钮布局(水平)
116    let button_layout = activity.create_linear_layout_horizontal(Some(layout.id()))?;
117    button_layout.view().set_margin(&mut activity, 10)?;
118    button_layout.view().set_height_wrap_content(&mut activity)?;
119    button_layout.view().set_linear_layout_params(&mut activity, 0, None)?;
120    
121    // 创建全部开启按钮
122    let all_on_btn = activity.create_button("🔆 全部开启", Some(button_layout.id()))?;
123    all_on_btn.view().set_linear_layout_params(&mut activity, 1, None)?;
124    
125    // 创建全部关闭按钮
126    let all_off_btn = activity.create_button("🌙 全部关闭", Some(button_layout.id()))?;
127    all_off_btn.view().set_linear_layout_params(&mut activity, 1, None)?;
128    
129    println!("✓ 界面创建完成\n");
130    println!("━━━━━━━━━━━━━━━━━━━━━━");
131    println!("提示:");
132    println!("  • 滑动开关切换设备状态");
133    println!("  • 观察状态实时更新");
134    println!("  • 使用 '全部开启/关闭' 按钮");
135    println!("━━━━━━━━━━━━━━━━━━━━━━\n");
136    
137    // 状态跟踪
138    let mut light_on = true;
139    let mut ac_on = false;
140    let mut humidifier_on = false;
141    let mut curtain_on = true;
142    let mut music_on = false;
143    
144    // 事件循环
145    loop {
146        let event = read_message(activity.event_stream())?;
147        let event_type = event["type"].as_str().unwrap_or("");
148        let event_value = &event["value"];
149        
150        match event_type {
151            "destroy" => {
152                // Activity 已被系统销毁,直接退出即可
153                // 不要调用 activity.finish(),因为 Activity 已经不存在了
154                println!("\n✓ Activity 已关闭");
155                return Ok(());
156            },
157            "click" => {
158                let clicked_id = event_value["id"].as_i64().unwrap_or(-1);
159                let is_checked = event_value["set"].as_bool().unwrap_or(false);
160                
161                if clicked_id == switch1.id() {
162                    light_on = is_checked;
163                    println!("💡 客厅灯: {}", if is_checked { "开启" } else { "关闭" });
164                } else if clicked_id == switch2.id() {
165                    ac_on = is_checked;
166                    println!("❄️ 空调: {}", if is_checked { "开启" } else { "关闭" });
167                } else if clicked_id == switch3.id() {
168                    humidifier_on = is_checked;
169                    println!("💧 加湿器: {}", if is_checked { "开启" } else { "关闭" });
170                } else if clicked_id == switch4.id() {
171                    curtain_on = is_checked;
172                    println!("🪟 窗帘: {}", if is_checked { "打开" } else { "关闭" });
173                } else if clicked_id == switch5.id() {
174                    music_on = is_checked;
175                    println!("🎵 音乐: {}", if is_checked { "播放" } else { "停止" });
176                } else if clicked_id == all_on_btn.id() {
177                    println!("\n🔆 全部开启");
178                    light_on = true;
179                    ac_on = true;
180                    humidifier_on = true;
181                    curtain_on = true;
182                    music_on = true;
183                    
184                    switch1.set_checked(&mut activity, true)?;
185                    switch2.set_checked(&mut activity, true)?;
186                    switch3.set_checked(&mut activity, true)?;
187                    switch4.set_checked(&mut activity, true)?;
188                    switch5.set_checked(&mut activity, true)?;
189                } else if clicked_id == all_off_btn.id() {
190                    println!("\n🌙 全部关闭");
191                    light_on = false;
192                    ac_on = false;
193                    humidifier_on = false;
194                    curtain_on = false;
195                    music_on = false;
196                    
197                    switch1.set_checked(&mut activity, false)?;
198                    switch2.set_checked(&mut activity, false)?;
199                    switch3.set_checked(&mut activity, false)?;
200                    switch4.set_checked(&mut activity, false)?;
201                    switch5.set_checked(&mut activity, false)?;
202                }
203                
204                update_status(&mut activity, &status, 
205                            light_on, ac_on, humidifier_on, curtain_on, music_on)?;
206            },
207            _ => {}
208        }
209    }
210}
examples/toggle_demo_v2.rs (line 69)
8fn main() -> Result<()> {
9    println!("=== ToggleButton 切换按钮演示 (新库版本) ===\n");
10    
11    // 创建 Activity(对话框模式)
12    let mut activity = Activity::new(true)?;
13    println!("✓ 连接建立\n");
14    
15    // 创建主布局
16    let layout = activity.create_linear_layout(None)?;
17    
18    // 创建标题
19    let title = activity.create_text_view("🔘 ToggleButton 演示", Some(layout.id()))?;
20    title.set_text_size(&mut activity, 26)?;
21    title.view().set_margin(&mut activity, 10)?;
22    title.view().set_height_wrap_content(&mut activity)?;
23    title.view().set_linear_layout_params(&mut activity, 0, None)?;
24    
25    // 创建说明
26    let desc = activity.create_text_view("ToggleButton 是带开关状态的按钮", Some(layout.id()))?;
27    desc.view().set_margin(&mut activity, 5)?;
28    desc.view().set_height_wrap_content(&mut activity)?;
29    desc.view().set_linear_layout_params(&mut activity, 0, None)?;
30    
31    // 创建 ToggleButton 1 - WiFi(关闭)
32    let toggle1 = activity.create_toggle_button_checked("📶 WiFi", Some(layout.id()), false)?;
33    toggle1.view().set_margin(&mut activity, 8)?;
34    toggle1.view().set_height_wrap_content(&mut activity)?;
35    toggle1.view().set_linear_layout_params(&mut activity, 0, None)?;
36    
37    // 创建 ToggleButton 2 - 蓝牙(开启)
38    let toggle2 = activity.create_toggle_button_checked("📡 蓝牙", Some(layout.id()), true)?;
39    toggle2.view().set_margin(&mut activity, 8)?;
40    toggle2.view().set_height_wrap_content(&mut activity)?;
41    toggle2.view().set_linear_layout_params(&mut activity, 0, None)?;
42    
43    // 创建 ToggleButton 3 - GPS(关闭)
44    let toggle3 = activity.create_toggle_button_checked("🛰️ GPS", Some(layout.id()), false)?;
45    toggle3.view().set_margin(&mut activity, 8)?;
46    toggle3.view().set_height_wrap_content(&mut activity)?;
47    toggle3.view().set_linear_layout_params(&mut activity, 0, None)?;
48    
49    // 创建 ToggleButton 4 - 飞行模式(关闭)
50    let toggle4 = activity.create_toggle_button_checked("✈️ 飞行模式", Some(layout.id()), false)?;
51    toggle4.view().set_margin(&mut activity, 8)?;
52    toggle4.view().set_height_wrap_content(&mut activity)?;
53    toggle4.view().set_linear_layout_params(&mut activity, 0, None)?;
54    
55    // 创建分隔线
56    let divider = activity.create_text_view("━━━━━━━━━━━━━━━━━━━━", Some(layout.id()))?;
57    divider.view().set_margin(&mut activity, 10)?;
58    divider.view().set_height_wrap_content(&mut activity)?;
59    divider.view().set_linear_layout_params(&mut activity, 0, None)?;
60    
61    // 创建状态显示
62    let status = activity.create_text_view("当前开启: 蓝牙", Some(layout.id()))?;
63    status.view().set_margin(&mut activity, 10)?;
64    status.view().set_height_wrap_content(&mut activity)?;
65    status.view().set_linear_layout_params(&mut activity, 0, None)?;
66    status.set_text_color(&mut activity, 0xFF2196F3u32 as i32)?;
67    
68    // 创建按钮布局
69    let button_layout = activity.create_linear_layout_horizontal(Some(layout.id()))?;
70    button_layout.view().set_margin(&mut activity, 10)?;
71    button_layout.view().set_height_wrap_content(&mut activity)?;
72    button_layout.view().set_linear_layout_params(&mut activity, 0, None)?;
73    
74    let all_on_btn = activity.create_button("🔆 全部开启", Some(button_layout.id()))?;
75    all_on_btn.view().set_linear_layout_params(&mut activity, 1, None)?;
76    
77    let all_off_btn = activity.create_button("🌙 全部关闭", Some(button_layout.id()))?;
78    all_off_btn.view().set_linear_layout_params(&mut activity, 1, None)?;
79    
80    println!("✓ 界面创建完成\n");
81    println!("━━━━━━━━━━━━━━━━━━━━━━");
82    println!("提示:");
83    println!("  • 点击 ToggleButton 切换状态");
84    println!("  • ToggleButton 开启时按钮会凹陷");
85    println!("  • 使用按钮控制全部开关");
86    println!("━━━━━━━━━━━━━━━━━━━━━━\n");
87    
88    // 状态跟踪
89    let mut wifi_on = false;
90    let mut bluetooth_on = true;
91    let mut gps_on = false;
92    let mut airplane_on = false;
93    
94    // 更新状态显示的辅助函数
95    let update_status = |activity: &mut Activity, 
96                         status: &TextView,
97                         wifi: bool, 
98                         bt: bool, 
99                         gps: bool, 
100                         airplane: bool| -> Result<()> {
101        let mut active = Vec::new();
102        if wifi { active.push("WiFi"); }
103        if bt { active.push("蓝牙"); }
104        if gps { active.push("GPS"); }
105        if airplane { active.push("飞行模式"); }
106        
107        let text = if active.is_empty() {
108            "当前开启: 无".to_string()
109        } else {
110            format!("当前开启: {}", active.join(", "))
111        };
112        
113        status.set_text(activity, &text)?;
114        
115        // 如果开启飞行模式,文字显示橙色警告
116        let color = if airplane {
117            0xFFFF9800u32 as i32  // 橙色
118        } else if active.is_empty() {
119            0xFF9E9E9Eu32 as i32  // 灰色
120        } else {
121            0xFF2196F3u32 as i32  // 蓝色
122        };
123        status.set_text_color(activity, color)?;
124        
125        Ok(())
126    };
127    
128    // 事件循环
129    loop {
130        let event = read_message(activity.event_stream())?;
131        let event_type = event["type"].as_str().unwrap_or("");
132        let event_value = &event["value"];
133        
134        match event_type {
135            "destroy" => {
136                // Activity 已被系统销毁,直接退出即可
137                println!("\n✓ Activity 已关闭");
138                return Ok(());
139            },
140            "click" => {
141                let clicked_id = event_value["id"].as_i64().unwrap_or(-1);
142                let is_checked = event_value["set"].as_bool().unwrap_or(false);
143                
144                if clicked_id == toggle1.id() {
145                    wifi_on = is_checked;
146                    println!("📶 WiFi: {}", if is_checked { "开启" } else { "关闭" });
147                } else if clicked_id == toggle2.id() {
148                    bluetooth_on = is_checked;
149                    println!("📡 蓝牙: {}", if is_checked { "开启" } else { "关闭" });
150                } else if clicked_id == toggle3.id() {
151                    gps_on = is_checked;
152                    println!("🛰️ GPS: {}", if is_checked { "开启" } else { "关闭" });
153                } else if clicked_id == toggle4.id() {
154                    airplane_on = is_checked;
155                    println!("✈️ 飞行模式: {}", if is_checked { "开启" } else { "关闭" });
156                } else if clicked_id == all_on_btn.id() {
157                    println!("\n🔆 全部开启");
158                    wifi_on = true;
159                    bluetooth_on = true;
160                    gps_on = true;
161                    airplane_on = true;
162                    
163                    toggle1.set_checked(&mut activity, true)?;
164                    toggle2.set_checked(&mut activity, true)?;
165                    toggle3.set_checked(&mut activity, true)?;
166                    toggle4.set_checked(&mut activity, true)?;
167                } else if clicked_id == all_off_btn.id() {
168                    println!("\n🌙 全部关闭");
169                    wifi_on = false;
170                    bluetooth_on = false;
171                    gps_on = false;
172                    airplane_on = false;
173                    
174                    toggle1.set_checked(&mut activity, false)?;
175                    toggle2.set_checked(&mut activity, false)?;
176                    toggle3.set_checked(&mut activity, false)?;
177                    toggle4.set_checked(&mut activity, false)?;
178                }
179                
180                update_status(&mut activity, &status, wifi_on, bluetooth_on, gps_on, airplane_on)?;
181            },
182            _ => {}
183        }
184    }
185}
examples/space_demo_v2.rs (line 89)
8fn main() -> Result<()> {
9    println!("=== Space 空白间隔演示 (新库版本) ===\n");
10    
11    // 创建 Activity(对话框模式)
12    let mut activity = Activity::new(true)?;
13    println!("✓ 连接建立\n");
14    
15    // 创建主布局
16    let layout = activity.create_linear_layout(None)?;
17    
18    // 创建标题
19    let title = activity.create_text_view("📐 Space 间隔演示", Some(layout.id()))?;
20    title.set_text_size(&mut activity, 26)?;
21    title.view().set_margin(&mut activity, 10)?;
22    title.view().set_height_wrap_content(&mut activity)?;
23    title.view().set_linear_layout_params(&mut activity, 0, None)?;
24    
25    // ========== 示例1: 固定高度的间隔 ==========
26    let section1 = activity.create_text_view("示例1: 固定高度间隔", Some(layout.id()))?;
27    section1.set_text_size(&mut activity, 18)?;
28    section1.view().set_margin(&mut activity, 10)?;
29    section1.view().set_height_wrap_content(&mut activity)?;
30    section1.view().set_linear_layout_params(&mut activity, 0, None)?;
31    section1.set_text_color(&mut activity, 0xFF2196F3u32 as i32)?;
32    
33    let text1a = activity.create_text_view("这是第一个元素", Some(layout.id()))?;
34    text1a.view().set_margin(&mut activity, 5)?;
35    text1a.view().set_height_wrap_content(&mut activity)?;
36    text1a.view().set_linear_layout_params(&mut activity, 0, None)?;
37    
38    // 创建一个 50dp 高度的 Space
39    let space1 = activity.create_space(Some(layout.id()))?;
40    space1.view().set_height(&mut activity, 50)?;
41    space1.view().set_linear_layout_params(&mut activity, 0, None)?;
42    
43    let text1b = activity.create_text_view("这是第二个元素(上方有50dp间隔)", Some(layout.id()))?;
44    text1b.view().set_margin(&mut activity, 5)?;
45    text1b.view().set_height_wrap_content(&mut activity)?;
46    text1b.view().set_linear_layout_params(&mut activity, 0, None)?;
47    
48    // ========== 示例2: 权重间隔(弹性空间)==========
49    let divider1 = activity.create_text_view("━━━━━━━━━━━━━━━━━━━━", Some(layout.id()))?;
50    divider1.view().set_margin(&mut activity, 10)?;
51    divider1.view().set_height_wrap_content(&mut activity)?;
52    divider1.view().set_linear_layout_params(&mut activity, 0, None)?;
53    
54    let section2 = activity.create_text_view("示例2: 权重间隔(填充剩余空间)", Some(layout.id()))?;
55    section2.set_text_size(&mut activity, 18)?;
56    section2.view().set_margin(&mut activity, 10)?;
57    section2.view().set_height_wrap_content(&mut activity)?;
58    section2.view().set_linear_layout_params(&mut activity, 0, None)?;
59    section2.set_text_color(&mut activity, 0xFF4CAF50u32 as i32)?;
60    
61    let text2a = activity.create_text_view("顶部内容", Some(layout.id()))?;
62    text2a.view().set_margin(&mut activity, 5)?;
63    text2a.view().set_height_wrap_content(&mut activity)?;
64    text2a.view().set_linear_layout_params(&mut activity, 0, None)?;
65    
66    // 创建一个 weight=1 的 Space,它会占据所有剩余空间
67    let space2 = activity.create_space(Some(layout.id()))?;
68    space2.view().set_linear_layout_params(&mut activity, 1, None)?;
69    
70    let text2b = activity.create_text_view("底部内容(被推到底部)", Some(layout.id()))?;
71    text2b.view().set_margin(&mut activity, 5)?;
72    text2b.view().set_height_wrap_content(&mut activity)?;
73    text2b.view().set_linear_layout_params(&mut activity, 0, None)?;
74    
75    // ========== 示例3: 水平间隔 ==========
76    let divider2 = activity.create_text_view("━━━━━━━━━━━━━━━━━━━━", Some(layout.id()))?;
77    divider2.view().set_margin(&mut activity, 10)?;
78    divider2.view().set_height_wrap_content(&mut activity)?;
79    divider2.view().set_linear_layout_params(&mut activity, 0, None)?;
80    
81    let section3 = activity.create_text_view("示例3: 水平间隔", Some(layout.id()))?;
82    section3.set_text_size(&mut activity, 18)?;
83    section3.view().set_margin(&mut activity, 10)?;
84    section3.view().set_height_wrap_content(&mut activity)?;
85    section3.view().set_linear_layout_params(&mut activity, 0, None)?;
86    section3.set_text_color(&mut activity, 0xFFFF9800u32 as i32)?;
87    
88    // 创建水平布局
89    let h_layout = activity.create_linear_layout_horizontal(Some(layout.id()))?;
90    h_layout.view().set_margin(&mut activity, 5)?;
91    h_layout.view().set_height_wrap_content(&mut activity)?;
92    h_layout.view().set_linear_layout_params(&mut activity, 0, None)?;
93    
94    let btn1 = activity.create_button("按钮1", Some(h_layout.id()))?;
95    btn1.view().set_linear_layout_params(&mut activity, 0, None)?;
96    
97    // 水平 Space,宽度30dp
98    let h_space = activity.create_space(Some(h_layout.id()))?;
99    h_space.view().set_width(&mut activity, 30)?;
100    h_space.view().set_linear_layout_params(&mut activity, 0, None)?;
101    
102    let btn2 = activity.create_button("按钮2", Some(h_layout.id()))?;
103    btn2.view().set_linear_layout_params(&mut activity, 0, None)?;
104    
105    // 弹性水平 Space(weight=1),把按钮3推到右边
106    let h_space2 = activity.create_space(Some(h_layout.id()))?;
107    h_space2.view().set_linear_layout_params(&mut activity, 1, None)?;
108    
109    let btn3 = activity.create_button("按钮3", Some(h_layout.id()))?;
110    btn3.view().set_linear_layout_params(&mut activity, 0, None)?;
111    
112    // ========== 底部说明 ==========
113    let divider3 = activity.create_text_view("━━━━━━━━━━━━━━━━━━━━", Some(layout.id()))?;
114    divider3.view().set_margin(&mut activity, 10)?;
115    divider3.view().set_height_wrap_content(&mut activity)?;
116    divider3.view().set_linear_layout_params(&mut activity, 0, None)?;
117    
118    let info = activity.create_text_view(
119        "💡 Space 用途:\n\
120        • 固定间隔:设置固定宽度/高度\n\
121        • 弹性间隔:使用 weight 填充空间\n\
122        • 推送元素:将元素推到边缘",
123        Some(layout.id())
124    )?;
125    info.view().set_margin(&mut activity, 10)?;
126    info.view().set_height_wrap_content(&mut activity)?;
127    info.view().set_linear_layout_params(&mut activity, 0, None)?;
128    info.set_text_color(&mut activity, 0xFF666666u32 as i32)?;
129    
130    println!("✓ 界面创建完成\n");
131    println!("━━━━━━━━━━━━━━━━━━━━━━");
132    println!("提示:");
133    println!("  • 观察不同类型的 Space 效果");
134    println!("  • Space 本身是不可见的");
135    println!("  • 使用 Space 可以精确控制布局");
136    println!("━━━━━━━━━━━━━━━━━━━━━━\n");
137    
138    // 事件循环
139    loop {
140        let event = read_message(activity.event_stream())?;
141        let event_type = event["type"].as_str().unwrap_or("");
142        let event_value = &event["value"];
143        
144        match event_type {
145            "destroy" => {
146                // Activity 已被系统销毁,直接退出即可
147                println!("\n✓ Activity 已关闭");
148                return Ok(());
149            },
150            "click" => {
151                let clicked_id = event_value["id"].as_i64().unwrap_or(-1);
152                
153                if clicked_id == btn1.id() {
154                    println!("点击了按钮1");
155                    info.set_text(&mut activity, "✅ 按钮1 被点击")?;
156                    info.set_text_color(&mut activity, 0xFF4CAF50u32 as i32)?;
157                } else if clicked_id == btn2.id() {
158                    println!("点击了按钮2");
159                    info.set_text(&mut activity, "✅ 按钮2 被点击(左侧有30dp间隔)")?;
160                    info.set_text_color(&mut activity, 0xFF2196F3u32 as i32)?;
161                } else if clicked_id == btn3.id() {
162                    println!("点击了按钮3");
163                    info.set_text(&mut activity, "✅ 按钮3 被点击(被弹性Space推到右边)")?;
164                    info.set_text_color(&mut activity, 0xFFFF9800u32 as i32)?;
165                }
166            },
167            _ => {}
168        }
169    }
170}
Source

pub fn create_nested_scroll_view( &mut self, parent: Option<i64>, ) -> Result<NestedScrollView>

Create a NestedScrollView

Examples found in repository?
examples/image_demo_v2.rs (line 16)
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 16)
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 18)
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 16)
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 create_text_view( &mut self, text: &str, parent: Option<i64>, ) -> Result<TextView>

Create a TextView

Examples found in repository?
examples/webview_demo_v2.rs (line 23)
12fn main() -> Result<()> {
13    println!("=== WebView 网页视图演示 (新库版本) ===\n");
14    
15    // 创建 Activity
16    let mut activity = Activity::new(false)?;
17    println!("✓ 连接建立\n");
18    
19    // 创建根布局 (垂直)
20    let root = activity.create_linear_layout(None)?;
21    
22    // 标题文本
23    let title = activity.create_text_view("🌐 WebView 演示", Some(root.id()))?;
24    title.set_text_size(&mut activity, 20)?;
25    title.view().set_height_wrap_content(&mut activity)?;
26    title.view().set_margin(&mut activity, 16)?;
27    title.view().set_linear_layout_params(&mut activity, 0, None)?;
28    
29    // 提示文本
30    let hint = activity.create_text_view(
31        "━━━━━━━━━━━━━━━━━━━━━━\n\
32        演示步骤:\n\
33        1️⃣ 显示HTML内容 (3秒)\n\
34        2️⃣ 加载Google网页 (3秒)\n\
35        3️⃣ 请求JavaScript权限\n\
36        4️⃣ 执行JavaScript代码\n\
37        ━━━━━━━━━━━━━━━━━━━━━━", 
38        Some(root.id()))?;
39    hint.set_text_size(&mut activity, 14)?;
40    hint.view().set_height_wrap_content(&mut activity)?;
41    hint.view().set_margin(&mut activity, 16)?;
42    hint.view().set_linear_layout_params(&mut activity, 0, None)?;
43    
44    // 创建 WebView
45    let webview = activity.create_web_view(Some(root.id()))?;
46    webview.view().set_linear_layout_params(&mut activity, 1, None)?;  // 占据剩余空间
47    
48    println!("✓ 界面创建完成\n");
49    
50    // 演示流程
51    demo_workflow(&mut activity, &webview)?;
52    
53    println!("\n📌 等待用户关闭窗口...");
54    
55    // 事件循环
56    loop {
57        let event = read_message(activity.event_stream())?;
58        let event_type = event["type"].as_str().unwrap_or("");
59        
60        match event_type {
61            "destroy" => {
62                println!("\n✓ Activity 已关闭");
63                return Ok(());
64            },
65            _ => {}
66        }
67    }
68}
More examples
Hide additional examples
examples/button_demo_v2.rs (line 19)
8fn main() -> Result<()> {
9    println!("=== Button 交互演示 (新库版本) ===\n");
10    
11    // 创建 Activity(对话框模式)
12    let mut activity = Activity::new(true)?;
13    println!("✓ 连接建立\n");
14    
15    // 创建主布局
16    let layout = activity.create_linear_layout(None)?;
17    
18    // 创建标题
19    let title = activity.create_text_view("计数器演示 🦀", Some(layout.id()))?;
20    title.set_text_size(&mut activity, 30)?;
21    title.view().set_margin(&mut activity, 10)?;
22    // 设置标题高度为WRAP_CONTENT,避免占用太多空间
23    title.view().set_height_wrap_content(&mut activity)?;
24    // 设置布局权重为0,不占用额外空间
25    title.view().set_linear_layout_params(&mut activity, 0, None)?;
26    
27    // 创建计数显示
28    let counter = activity.create_text_view("点击次数: 0", Some(layout.id()))?;
29    counter.set_text_size(&mut activity, 24)?;
30    counter.view().set_margin(&mut activity, 20)?;
31    // 设置计数器高度为WRAP_CONTENT
32    counter.view().set_height_wrap_content(&mut activity)?;
33    // 给计数器更高的权重,让它获得更多空间
34    counter.view().set_linear_layout_params(&mut activity, 1, None)?;
35    
36    // 创建按钮布局(横向)
37    let button_layout = activity.create_linear_layout_horizontal(Some(layout.id()))?;
38    // 按钮布局也使用WRAP_CONTENT
39    button_layout.view().set_height_wrap_content(&mut activity)?;
40    button_layout.view().set_linear_layout_params(&mut activity, 0, None)?;
41    
42    // 创建按钮
43    let inc_button = activity.create_button("➕ 增加", Some(button_layout.id()))?;
44    inc_button.view().set_linear_layout_params(&mut activity, 1, None)?;  // 均分空间
45    
46    let dec_button = activity.create_button("➖ 减少", Some(button_layout.id()))?;
47    dec_button.view().set_linear_layout_params(&mut activity, 1, None)?;  // 均分空间
48    
49    let reset_button = activity.create_button("🔄 重置", Some(layout.id()))?;
50    reset_button.view().set_height_wrap_content(&mut activity)?;
51    reset_button.view().set_linear_layout_params(&mut activity, 0, None)?;
52    
53    println!("✓ 界面创建完成");
54    println!("  - Counter ID: {}", counter.id());
55    println!("  - Button ID: {}", inc_button.id());
56    println!("━━━━━━━━━━━━━━━━━━━━━━");
57    println!("提示: 点击按钮进行交互");
58    println!("━━━━━━━━━━━━━━━━━━━━━━\n");
59    
60    // 事件循环
61    let mut count = 0;
62    
63    loop {
64        let event = read_message(activity.event_stream())?;
65        let event_type = event["type"].as_str().unwrap_or("");
66        
67        match event_type {
68            "destroy" => {
69                // Activity 已被系统销毁,直接退出即可
70                // 不要调用 activity.finish(),因为 Activity 已经不存在了
71                println!("\n✓ Activity 已关闭");
72                println!("✓ 程序结束");
73                return Ok(());
74            },
75            "click" => {
76                let id = event["value"]["id"].as_i64().unwrap_or(-1);
77                
78                if id == inc_button.id() {
79                    count += 1;
80                    println!("➕ count = {}", count);
81                } else if id == dec_button.id() {
82                    count -= 1;
83                    println!("➖ count = {}", count);
84                } else if id == reset_button.id() {
85                    count = 0;
86                    println!("🔄 count = {}", count);
87                }
88                
89                // 更新文本
90                counter.set_text(&mut activity, &format!("点击次数: {}", count))?;
91                
92                // 根据计数改变颜色
93                let color = if count > 0 {
94                    0xFF4CAF50u32 as i32  // 绿色
95                } else if count < 0 {
96                    0xFFF44336u32 as i32  // 红色
97                } else {
98                    0xFF2196F3u32 as i32  // 蓝色
99                };
100                counter.set_text_color(&mut activity, color)?;
101            },
102            _ => {}
103        }
104    }
105}
examples/tab_layout_demo_v2.rs (line 35)
9fn main() -> Result<()> {
10    println!("=== TabLayout 标签页演示 (新库版本) ===\n");
11
12    // 创建连接和 Activity
13    let mut activity = Activity::new(false)?;
14    println!("✓ 连接建立");
15
16    // 创建根布局(垂直)
17    let root = activity.create_linear_layout(None)?;
18    
19    // 创建 TabLayout(在顶部)
20    let tabs = activity.create_tab_layout(Some(root.id()))?;
21    tabs.view().set_linear_layout_params(&mut activity, 0, None)?;
22    tabs.view().set_height(&mut activity, -2)?; // WRAP_CONTENT
23    
24    // 设置标签列表
25    tabs.set_list(&mut activity, &["首页", "消息", "我的"])?;
26    
27    // 创建内容区域
28    let content_area = activity.create_linear_layout(Some(root.id()))?;
29    content_area.view().set_linear_layout_params(&mut activity, 1, None)?; // weight=1 占据剩余空间
30    
31    // 创建三个页面的内容(初始全部隐藏)
32    // 页面1 - 首页
33    let page1 = activity.create_linear_layout(Some(content_area.id()))?;
34    
35    let title1 = activity.create_text_view("📱 首页", Some(page1.id()))?;
36    title1.set_text_size(&mut activity, 28)?;
37    
38    let content1 = activity.create_text_view("\n欢迎使用 TabLayout!\n\n这是首页内容。\n\n☝️ 点击顶部标签切换页面", Some(page1.id()))?;
39    content1.set_text_size(&mut activity, 18)?;
40    
41    // 页面2 - 消息
42    let page2 = activity.create_linear_layout(Some(content_area.id()))?;
43    activity.send(&serde_json::json!({
44        "method": "setVisibility",
45        "params": {
46            "aid": activity.id(),
47            "id": page2.id(),
48            "vis": 8  // GONE initially
49        }
50    }))?;
51    
52    let title2 = activity.create_text_view("💬 消息中心", Some(page2.id()))?;
53    title2.set_text_size(&mut activity, 28)?;
54    
55    let content2 = activity.create_text_view("\n这是第二页\n\n你有 3 条新消息\n\n• 系统通知\n• 好友消息\n• 更新提醒", Some(page2.id()))?;
56    content2.set_text_size(&mut activity, 18)?;
57    
58    // 页面3 - 我的
59    let page3 = activity.create_linear_layout(Some(content_area.id()))?;
60    activity.send(&serde_json::json!({
61        "method": "setVisibility",
62        "params": {
63            "aid": activity.id(),
64            "id": page3.id(),
65            "vis": 8  // GONE initially
66        }
67    }))?;
68    
69    let title3 = activity.create_text_view("👤 个人中心", Some(page3.id()))?;
70    title3.set_text_size(&mut activity, 28)?;
71    
72    let content3 = activity.create_text_view("\n这是第三页\n\n个人信息\n\n• 账号设置\n• 隐私设置\n• 关于我们", Some(page3.id()))?;
73    content3.set_text_size(&mut activity, 18)?;
74    
75    println!("\n✓ 界面创建完成");
76    println!("\n━━━━━━━━━━━━━━━━━━━━━━");
77    println!("提示:");
78    println!("  • 点击顶部标签切换页面");
79    println!("  • 观察页面内容变化");
80    println!("━━━━━━━━━━━━━━━━━━━━━━\n");
81    
82    // 当前选中的标签页
83    let mut current_tab = 0;
84    let pages = [page1.id(), page2.id(), page3.id()];
85    
86    // 事件循环
87    loop {
88        let event = read_message(activity.event_stream())?;
89        let event_type = event["type"].as_str().unwrap_or("");
90        
91        match event_type {
92            "destroy" => {
93                println!("\n✓ Activity 已关闭");
94                return Ok(());
95            }
96            "itemselected" => {
97                // TabLayout 被点击
98                if let Some(selected) = event["value"]["selected"].as_i64() {
99                    if event["value"]["id"].as_i64() == Some(tabs.id()) {
100                        let new_tab = selected as usize;
101                        if new_tab != current_tab && new_tab < 3 {
102                            println!("切换到标签 {}: {}", new_tab, ["首页", "消息", "我的"][new_tab]);
103                            
104                            // 隐藏当前页面
105                            activity.send(&serde_json::json!({
106                                "method": "setVisibility",
107                                "params": {
108                                    "aid": activity.id(),
109                                    "id": pages[current_tab],
110                                    "vis": 8  // GONE
111                                }
112                            }))?;
113                            
114                            // 显示新页面
115                            activity.send(&serde_json::json!({
116                                "method": "setVisibility",
117                                "params": {
118                                    "aid": activity.id(),
119                                    "id": pages[new_tab],
120                                    "vis": 0  // VISIBLE
121                                }
122                            }))?;
123                            
124                            current_tab = new_tab;
125                        }
126                    }
127                }
128            }
129            _ => {}
130        }
131    }
132}
examples/image_demo_v2.rs (line 23)
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}
examples/checkbox_demo_v2.rs (line 44)
33fn main() -> Result<()> {
34    println!("=== Checkbox 复选框演示 (新库版本) ===\n");
35    
36    // 创建 Activity(对话框模式)
37    let mut activity = Activity::new(true)?;
38    println!("✓ 连接建立\n");
39    
40    // 创建主布局
41    let layout = activity.create_linear_layout(None)?;
42    
43    // 创建标题
44    let title = activity.create_text_view("选择你喜欢的功能 ✅", Some(layout.id()))?;
45    title.set_text_size(&mut activity, 26)?;
46    title.view().set_margin(&mut activity, 10)?;
47    title.view().set_height_wrap_content(&mut activity)?;
48    
49    // 创建 Checkbox 1 - WiFi (初始未选中)
50    let checkbox1 = activity.create_checkbox_checked("📶 WiFi", Some(layout.id()), false)?;
51    checkbox1.view().set_margin(&mut activity, 5)?;
52    checkbox1.view().set_height_wrap_content(&mut activity)?;
53    
54    // 创建 Checkbox 2 - 蓝牙 (初始选中)
55    let checkbox2 = activity.create_checkbox_checked("📡 蓝牙", Some(layout.id()), true)?;
56    checkbox2.view().set_margin(&mut activity, 5)?;
57    checkbox2.view().set_height_wrap_content(&mut activity)?;
58    
59    // 创建 Checkbox 3 - 定位 (初始未选中)
60    let checkbox3 = activity.create_checkbox_checked("📍 定位服务", Some(layout.id()), false)?;
61    checkbox3.view().set_margin(&mut activity, 5)?;
62    checkbox3.view().set_height_wrap_content(&mut activity)?;
63    
64    // 创建 Checkbox 4 - 通知 (初始选中)
65    let checkbox4 = activity.create_checkbox_checked("🔔 通知", Some(layout.id()), true)?;
66    checkbox4.view().set_margin(&mut activity, 5)?;
67    checkbox4.view().set_height_wrap_content(&mut activity)?;
68    
69    // 创建分隔线
70    let separator = activity.create_text_view("━━━━━━━━━━━━━━━━━━━━", Some(layout.id()))?;
71    separator.view().set_height_wrap_content(&mut activity)?;
72    
73    // 创建状态显示
74    let status = activity.create_text_view("当前选中: 蓝牙, 通知", Some(layout.id()))?;
75    status.view().set_margin(&mut activity, 10)?;
76    status.view().set_height_wrap_content(&mut activity)?;
77    status.set_text_color(&mut activity, 0xFF2196F3u32 as i32)?;
78    
79    // 创建按钮
80    let apply_button = activity.create_button("✅ 应用设置", Some(layout.id()))?;
81    apply_button.view().set_margin(&mut activity, 10)?;
82    apply_button.view().set_height_wrap_content(&mut activity)?;
83    
84    println!("✓ 界面创建完成\n");
85    println!("━━━━━━━━━━━━━━━━━━━━━━");
86    println!("提示:");
87    println!("  • 点击复选框切换状态");
88    println!("  • 观察状态实时更新");
89    println!("  • 点击 '应用设置' 查看最终选择");
90    println!("━━━━━━━━━━━━━━━━━━━━━━\n");
91    
92    // 状态跟踪
93    let mut wifi_checked = false;
94    let mut bluetooth_checked = true;
95    let mut location_checked = false;
96    let mut notification_checked = true;
97    
98    // 事件循环
99    loop {
100        let event = read_message(activity.event_stream())?;
101        let event_type = event["type"].as_str().unwrap_or("");
102        let event_value = &event["value"];
103        
104        match event_type {
105            "destroy" => {
106                // Activity 已被系统销毁,直接退出即可
107                // 不要调用 activity.finish(),因为 Activity 已经不存在了
108                println!("\n✓ Activity 已关闭");
109                return Ok(());
110            },
111            "click" => {
112                let clicked_id = event_value["id"].as_i64().unwrap_or(-1);
113                let is_checked = event_value["set"].as_bool().unwrap_or(false);
114                
115                if clicked_id == checkbox1.id() {
116                    wifi_checked = is_checked;
117                    println!("📶 WiFi: {}", if is_checked { "开启" } else { "关闭" });
118                    update_status_text(&mut activity, &status, 
119                                     wifi_checked, bluetooth_checked, 
120                                     location_checked, notification_checked)?;
121                    
122                } else if clicked_id == checkbox2.id() {
123                    bluetooth_checked = is_checked;
124                    println!("📡 蓝牙: {}", if is_checked { "开启" } else { "关闭" });
125                    update_status_text(&mut activity, &status, 
126                                     wifi_checked, bluetooth_checked, 
127                                     location_checked, notification_checked)?;
128                    
129                } else if clicked_id == checkbox3.id() {
130                    location_checked = is_checked;
131                    println!("📍 定位: {}", if is_checked { "开启" } else { "关闭" });
132                    update_status_text(&mut activity, &status, 
133                                     wifi_checked, bluetooth_checked, 
134                                     location_checked, notification_checked)?;
135                    
136                } else if clicked_id == checkbox4.id() {
137                    notification_checked = is_checked;
138                    println!("🔔 通知: {}", if is_checked { "开启" } else { "关闭" });
139                    update_status_text(&mut activity, &status, 
140                                     wifi_checked, bluetooth_checked, 
141                                     location_checked, notification_checked)?;
142                    
143                } else if clicked_id == apply_button.id() {
144                    println!("\n✅ 应用设置:");
145                    println!("  WiFi: {}", if wifi_checked { "✓" } else { "✗" });
146                    println!("  蓝牙: {}", if bluetooth_checked { "✓" } else { "✗" });
147                    println!("  定位: {}", if location_checked { "✓" } else { "✗" });
148                    println!("  通知: {}", if notification_checked { "✓" } else { "✗" });
149                    
150                    // 显示确认消息
151                    status.set_text(&mut activity, "✅ 设置已应用!")?;
152                    status.set_text_color(&mut activity, 0xFF4CAF50u32 as i32)?;
153                }
154            },
155            _ => {}
156        }
157    }
158}
examples/horizontal_scroll_demo_v2.rs (line 20)
8fn main() -> Result<()> {
9    println!("=== HorizontalScrollView 水平滚动演示 (新库版本) ===\n");
10    
11    // 创建 Activity(全屏模式)
12    let mut activity = Activity::new(false)?;
13    println!("✓ 连接建立\n");
14    
15    // 创建主垂直布局
16    let main_layout = activity.create_linear_layout(None)?;
17    main_layout.view().set_margin(&mut activity, 15)?;
18    
19    // 创建标题
20    let title = activity.create_text_view("↔️ HorizontalScrollView 演示", Some(main_layout.id()))?;
21    title.set_text_size(&mut activity, 26)?;
22    title.view().set_margin(&mut activity, 10)?;
23    title.view().set_height_wrap_content(&mut activity)?;
24    title.view().set_linear_layout_params(&mut activity, 0, None)?;
25    
26    // 创建说明
27    let desc = activity.create_text_view("左右滑动查看更多按钮", Some(main_layout.id()))?;
28    desc.view().set_margin(&mut activity, 5)?;
29    desc.view().set_height_wrap_content(&mut activity)?;
30    desc.view().set_linear_layout_params(&mut activity, 0, None)?;
31    
32    // ========== 第一行: 水果按钮 ==========
33    let section1 = activity.create_text_view("第一行: 水果按钮(左右滑动)", Some(main_layout.id()))?;
34    section1.set_text_size(&mut activity, 18)?;
35    section1.view().set_margin(&mut activity, 10)?;
36    section1.view().set_height_wrap_content(&mut activity)?;
37    section1.view().set_linear_layout_params(&mut activity, 0, None)?;
38    section1.set_text_color(&mut activity, 0xFF2196F3u32 as i32)?;
39    
40    // 创建第一个 HorizontalScrollView
41    let h_scroll1 = activity.create_horizontal_scroll_view(Some(main_layout.id()))?;
42    h_scroll1.view().set_margin(&mut activity, 10)?;
43    h_scroll1.view().set_height_wrap_content(&mut activity)?;
44    h_scroll1.view().set_linear_layout_params(&mut activity, 0, None)?;
45    
46    // 在 HorizontalScrollView 内创建水平 LinearLayout
47    let h_layout1 = activity.create_linear_layout_horizontal(Some(h_scroll1.id()))?;
48    h_layout1.view().set_height_wrap_content(&mut activity)?;
49    
50    // 添加10个水果按钮
51    let fruits = ["🍎 苹果", "🍊 橙子", "🍌 香蕉", "🍇 葡萄", "🍓 草莓", 
52                  "🍑 桃子", "🍒 樱桃", "🍍 菠萝", "🥝 猕猴桃", "🥭 芒果"];
53    let mut fruit_buttons = Vec::new();
54    for fruit in &fruits {
55        let btn = activity.create_button(fruit, Some(h_layout1.id()))?;
56        btn.view().set_width(&mut activity, 180)?;  // 固定宽度180dp
57        btn.view().set_margin(&mut activity, 5)?;
58        fruit_buttons.push(btn);
59    }
60    
61    // ========== 第二行: 数字按钮 ==========
62    let section2 = activity.create_text_view("第二行: 数字按钮(左右滑动)", Some(main_layout.id()))?;
63    section2.set_text_size(&mut activity, 18)?;
64    section2.view().set_margin(&mut activity, 10)?;
65    section2.view().set_height_wrap_content(&mut activity)?;
66    section2.view().set_linear_layout_params(&mut activity, 0, None)?;
67    section2.set_text_color(&mut activity, 0xFF4CAF50u32 as i32)?;
68    
69    // 创建第二个 HorizontalScrollView
70    let h_scroll2 = activity.create_horizontal_scroll_view(Some(main_layout.id()))?;
71    h_scroll2.view().set_margin(&mut activity, 10)?;
72    h_scroll2.view().set_height_wrap_content(&mut activity)?;
73    h_scroll2.view().set_linear_layout_params(&mut activity, 0, None)?;
74    
75    // 在 HorizontalScrollView 内创建水平 LinearLayout
76    let h_layout2 = activity.create_linear_layout_horizontal(Some(h_scroll2.id()))?;
77    h_layout2.view().set_height_wrap_content(&mut activity)?;
78    
79    // 添加20个数字按钮
80    let mut number_buttons = Vec::new();
81    for i in 0..20 {
82        let btn = activity.create_button(&format!("数字 {}", i * 5), Some(h_layout2.id()))?;
83        btn.view().set_width(&mut activity, 150)?;  // 固定宽度150dp
84        btn.view().set_margin(&mut activity, 5)?;
85        number_buttons.push(btn);
86    }
87    
88    // ========== 底部信息 ==========
89    let divider = activity.create_text_view("━━━━━━━━━━━━━━━━━━━━", Some(main_layout.id()))?;
90    divider.view().set_margin(&mut activity, 10)?;
91    divider.view().set_height_wrap_content(&mut activity)?;
92    divider.view().set_linear_layout_params(&mut activity, 0, None)?;
93    
94    let info = activity.create_text_view(
95        "💡 提示:\n\
96        • 在每一行中左右滑动\n\
97        • 点击任意按钮查看效果\n\
98        • HorizontalScrollView 支持水平滚动",
99        Some(main_layout.id())
100    )?;
101    info.view().set_margin(&mut activity, 10)?;
102    info.view().set_height_wrap_content(&mut activity)?;
103    info.view().set_linear_layout_params(&mut activity, 0, None)?;
104    info.set_text_color(&mut activity, 0xFF666666u32 as i32)?;
105    
106    // 状态显示
107    let status = activity.create_text_view("准备就绪 - 尝试左右滑动", Some(main_layout.id()))?;
108    status.view().set_margin(&mut activity, 10)?;
109    status.view().set_height_wrap_content(&mut activity)?;
110    status.view().set_linear_layout_params(&mut activity, 0, None)?;
111    status.set_text_color(&mut activity, 0xFF2196F3u32 as i32)?;
112    
113    println!("✓ 界面创建完成\n");
114    println!("━━━━━━━━━━━━━━━━━━━━━━");
115    println!("提示:");
116    println!("  • 第一行: 10个水果按钮");
117    println!("  • 第二行: 20个数字按钮");
118    println!("  • 左右滑动查看更多内容");
119    println!("━━━━━━━━━━━━━━━━━━━━━━\n");
120    
121    // 事件循环
122    loop {
123        let event = read_message(activity.event_stream())?;
124        let event_type = event["type"].as_str().unwrap_or("");
125        let event_value = &event["value"];
126        
127        match event_type {
128            "destroy" => {
129                println!("\n✓ Activity 已关闭");
130                return Ok(());
131            },
132            "click" => {
133                let clicked_id = event_value["id"].as_i64().unwrap_or(-1);
134                
135                // 检查水果按钮
136                for (i, btn) in fruit_buttons.iter().enumerate() {
137                    if clicked_id == btn.id() {
138                        println!("✅ 选择: {}", fruits[i]);
139                        status.set_text(&mut activity, &format!("✅ 选择: {}", fruits[i]))?;
140                        status.set_text_color(&mut activity, 0xFF4CAF50u32 as i32)?;
141                        break;
142                    }
143                }
144                
145                // 检查数字按钮
146                for (i, btn) in number_buttons.iter().enumerate() {
147                    if clicked_id == btn.id() {
148                        let value = i * 5;
149                        println!("🔢 选择数字: {}", value);
150                        status.set_text(&mut activity, &format!("🔢 选择数字: {}", value))?;
151                        status.set_text_color(&mut activity, 0xFFFF9800u32 as i32)?;
152                        break;
153                    }
154                }
155            },
156            _ => {}
157        }
158    }
159}
Source

pub fn create_button( &mut self, text: &str, parent: Option<i64>, ) -> Result<Button>

Create a Button

Examples found in repository?
examples/button_demo_v2.rs (line 43)
8fn main() -> Result<()> {
9    println!("=== Button 交互演示 (新库版本) ===\n");
10    
11    // 创建 Activity(对话框模式)
12    let mut activity = Activity::new(true)?;
13    println!("✓ 连接建立\n");
14    
15    // 创建主布局
16    let layout = activity.create_linear_layout(None)?;
17    
18    // 创建标题
19    let title = activity.create_text_view("计数器演示 🦀", Some(layout.id()))?;
20    title.set_text_size(&mut activity, 30)?;
21    title.view().set_margin(&mut activity, 10)?;
22    // 设置标题高度为WRAP_CONTENT,避免占用太多空间
23    title.view().set_height_wrap_content(&mut activity)?;
24    // 设置布局权重为0,不占用额外空间
25    title.view().set_linear_layout_params(&mut activity, 0, None)?;
26    
27    // 创建计数显示
28    let counter = activity.create_text_view("点击次数: 0", Some(layout.id()))?;
29    counter.set_text_size(&mut activity, 24)?;
30    counter.view().set_margin(&mut activity, 20)?;
31    // 设置计数器高度为WRAP_CONTENT
32    counter.view().set_height_wrap_content(&mut activity)?;
33    // 给计数器更高的权重,让它获得更多空间
34    counter.view().set_linear_layout_params(&mut activity, 1, None)?;
35    
36    // 创建按钮布局(横向)
37    let button_layout = activity.create_linear_layout_horizontal(Some(layout.id()))?;
38    // 按钮布局也使用WRAP_CONTENT
39    button_layout.view().set_height_wrap_content(&mut activity)?;
40    button_layout.view().set_linear_layout_params(&mut activity, 0, None)?;
41    
42    // 创建按钮
43    let inc_button = activity.create_button("➕ 增加", Some(button_layout.id()))?;
44    inc_button.view().set_linear_layout_params(&mut activity, 1, None)?;  // 均分空间
45    
46    let dec_button = activity.create_button("➖ 减少", Some(button_layout.id()))?;
47    dec_button.view().set_linear_layout_params(&mut activity, 1, None)?;  // 均分空间
48    
49    let reset_button = activity.create_button("🔄 重置", Some(layout.id()))?;
50    reset_button.view().set_height_wrap_content(&mut activity)?;
51    reset_button.view().set_linear_layout_params(&mut activity, 0, None)?;
52    
53    println!("✓ 界面创建完成");
54    println!("  - Counter ID: {}", counter.id());
55    println!("  - Button ID: {}", inc_button.id());
56    println!("━━━━━━━━━━━━━━━━━━━━━━");
57    println!("提示: 点击按钮进行交互");
58    println!("━━━━━━━━━━━━━━━━━━━━━━\n");
59    
60    // 事件循环
61    let mut count = 0;
62    
63    loop {
64        let event = read_message(activity.event_stream())?;
65        let event_type = event["type"].as_str().unwrap_or("");
66        
67        match event_type {
68            "destroy" => {
69                // Activity 已被系统销毁,直接退出即可
70                // 不要调用 activity.finish(),因为 Activity 已经不存在了
71                println!("\n✓ Activity 已关闭");
72                println!("✓ 程序结束");
73                return Ok(());
74            },
75            "click" => {
76                let id = event["value"]["id"].as_i64().unwrap_or(-1);
77                
78                if id == inc_button.id() {
79                    count += 1;
80                    println!("➕ count = {}", count);
81                } else if id == dec_button.id() {
82                    count -= 1;
83                    println!("➖ count = {}", count);
84                } else if id == reset_button.id() {
85                    count = 0;
86                    println!("🔄 count = {}", count);
87                }
88                
89                // 更新文本
90                counter.set_text(&mut activity, &format!("点击次数: {}", count))?;
91                
92                // 根据计数改变颜色
93                let color = if count > 0 {
94                    0xFF4CAF50u32 as i32  // 绿色
95                } else if count < 0 {
96                    0xFFF44336u32 as i32  // 红色
97                } else {
98                    0xFF2196F3u32 as i32  // 蓝色
99                };
100                counter.set_text_color(&mut activity, color)?;
101            },
102            _ => {}
103        }
104    }
105}
More examples
Hide additional examples
examples/image_demo_v2.rs (line 62)
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}
examples/checkbox_demo_v2.rs (line 80)
33fn main() -> Result<()> {
34    println!("=== Checkbox 复选框演示 (新库版本) ===\n");
35    
36    // 创建 Activity(对话框模式)
37    let mut activity = Activity::new(true)?;
38    println!("✓ 连接建立\n");
39    
40    // 创建主布局
41    let layout = activity.create_linear_layout(None)?;
42    
43    // 创建标题
44    let title = activity.create_text_view("选择你喜欢的功能 ✅", Some(layout.id()))?;
45    title.set_text_size(&mut activity, 26)?;
46    title.view().set_margin(&mut activity, 10)?;
47    title.view().set_height_wrap_content(&mut activity)?;
48    
49    // 创建 Checkbox 1 - WiFi (初始未选中)
50    let checkbox1 = activity.create_checkbox_checked("📶 WiFi", Some(layout.id()), false)?;
51    checkbox1.view().set_margin(&mut activity, 5)?;
52    checkbox1.view().set_height_wrap_content(&mut activity)?;
53    
54    // 创建 Checkbox 2 - 蓝牙 (初始选中)
55    let checkbox2 = activity.create_checkbox_checked("📡 蓝牙", Some(layout.id()), true)?;
56    checkbox2.view().set_margin(&mut activity, 5)?;
57    checkbox2.view().set_height_wrap_content(&mut activity)?;
58    
59    // 创建 Checkbox 3 - 定位 (初始未选中)
60    let checkbox3 = activity.create_checkbox_checked("📍 定位服务", Some(layout.id()), false)?;
61    checkbox3.view().set_margin(&mut activity, 5)?;
62    checkbox3.view().set_height_wrap_content(&mut activity)?;
63    
64    // 创建 Checkbox 4 - 通知 (初始选中)
65    let checkbox4 = activity.create_checkbox_checked("🔔 通知", Some(layout.id()), true)?;
66    checkbox4.view().set_margin(&mut activity, 5)?;
67    checkbox4.view().set_height_wrap_content(&mut activity)?;
68    
69    // 创建分隔线
70    let separator = activity.create_text_view("━━━━━━━━━━━━━━━━━━━━", Some(layout.id()))?;
71    separator.view().set_height_wrap_content(&mut activity)?;
72    
73    // 创建状态显示
74    let status = activity.create_text_view("当前选中: 蓝牙, 通知", Some(layout.id()))?;
75    status.view().set_margin(&mut activity, 10)?;
76    status.view().set_height_wrap_content(&mut activity)?;
77    status.set_text_color(&mut activity, 0xFF2196F3u32 as i32)?;
78    
79    // 创建按钮
80    let apply_button = activity.create_button("✅ 应用设置", Some(layout.id()))?;
81    apply_button.view().set_margin(&mut activity, 10)?;
82    apply_button.view().set_height_wrap_content(&mut activity)?;
83    
84    println!("✓ 界面创建完成\n");
85    println!("━━━━━━━━━━━━━━━━━━━━━━");
86    println!("提示:");
87    println!("  • 点击复选框切换状态");
88    println!("  • 观察状态实时更新");
89    println!("  • 点击 '应用设置' 查看最终选择");
90    println!("━━━━━━━━━━━━━━━━━━━━━━\n");
91    
92    // 状态跟踪
93    let mut wifi_checked = false;
94    let mut bluetooth_checked = true;
95    let mut location_checked = false;
96    let mut notification_checked = true;
97    
98    // 事件循环
99    loop {
100        let event = read_message(activity.event_stream())?;
101        let event_type = event["type"].as_str().unwrap_or("");
102        let event_value = &event["value"];
103        
104        match event_type {
105            "destroy" => {
106                // Activity 已被系统销毁,直接退出即可
107                // 不要调用 activity.finish(),因为 Activity 已经不存在了
108                println!("\n✓ Activity 已关闭");
109                return Ok(());
110            },
111            "click" => {
112                let clicked_id = event_value["id"].as_i64().unwrap_or(-1);
113                let is_checked = event_value["set"].as_bool().unwrap_or(false);
114                
115                if clicked_id == checkbox1.id() {
116                    wifi_checked = is_checked;
117                    println!("📶 WiFi: {}", if is_checked { "开启" } else { "关闭" });
118                    update_status_text(&mut activity, &status, 
119                                     wifi_checked, bluetooth_checked, 
120                                     location_checked, notification_checked)?;
121                    
122                } else if clicked_id == checkbox2.id() {
123                    bluetooth_checked = is_checked;
124                    println!("📡 蓝牙: {}", if is_checked { "开启" } else { "关闭" });
125                    update_status_text(&mut activity, &status, 
126                                     wifi_checked, bluetooth_checked, 
127                                     location_checked, notification_checked)?;
128                    
129                } else if clicked_id == checkbox3.id() {
130                    location_checked = is_checked;
131                    println!("📍 定位: {}", if is_checked { "开启" } else { "关闭" });
132                    update_status_text(&mut activity, &status, 
133                                     wifi_checked, bluetooth_checked, 
134                                     location_checked, notification_checked)?;
135                    
136                } else if clicked_id == checkbox4.id() {
137                    notification_checked = is_checked;
138                    println!("🔔 通知: {}", if is_checked { "开启" } else { "关闭" });
139                    update_status_text(&mut activity, &status, 
140                                     wifi_checked, bluetooth_checked, 
141                                     location_checked, notification_checked)?;
142                    
143                } else if clicked_id == apply_button.id() {
144                    println!("\n✅ 应用设置:");
145                    println!("  WiFi: {}", if wifi_checked { "✓" } else { "✗" });
146                    println!("  蓝牙: {}", if bluetooth_checked { "✓" } else { "✗" });
147                    println!("  定位: {}", if location_checked { "✓" } else { "✗" });
148                    println!("  通知: {}", if notification_checked { "✓" } else { "✗" });
149                    
150                    // 显示确认消息
151                    status.set_text(&mut activity, "✅ 设置已应用!")?;
152                    status.set_text_color(&mut activity, 0xFF4CAF50u32 as i32)?;
153                }
154            },
155            _ => {}
156        }
157    }
158}
examples/horizontal_scroll_demo_v2.rs (line 55)
8fn main() -> Result<()> {
9    println!("=== HorizontalScrollView 水平滚动演示 (新库版本) ===\n");
10    
11    // 创建 Activity(全屏模式)
12    let mut activity = Activity::new(false)?;
13    println!("✓ 连接建立\n");
14    
15    // 创建主垂直布局
16    let main_layout = activity.create_linear_layout(None)?;
17    main_layout.view().set_margin(&mut activity, 15)?;
18    
19    // 创建标题
20    let title = activity.create_text_view("↔️ HorizontalScrollView 演示", Some(main_layout.id()))?;
21    title.set_text_size(&mut activity, 26)?;
22    title.view().set_margin(&mut activity, 10)?;
23    title.view().set_height_wrap_content(&mut activity)?;
24    title.view().set_linear_layout_params(&mut activity, 0, None)?;
25    
26    // 创建说明
27    let desc = activity.create_text_view("左右滑动查看更多按钮", Some(main_layout.id()))?;
28    desc.view().set_margin(&mut activity, 5)?;
29    desc.view().set_height_wrap_content(&mut activity)?;
30    desc.view().set_linear_layout_params(&mut activity, 0, None)?;
31    
32    // ========== 第一行: 水果按钮 ==========
33    let section1 = activity.create_text_view("第一行: 水果按钮(左右滑动)", Some(main_layout.id()))?;
34    section1.set_text_size(&mut activity, 18)?;
35    section1.view().set_margin(&mut activity, 10)?;
36    section1.view().set_height_wrap_content(&mut activity)?;
37    section1.view().set_linear_layout_params(&mut activity, 0, None)?;
38    section1.set_text_color(&mut activity, 0xFF2196F3u32 as i32)?;
39    
40    // 创建第一个 HorizontalScrollView
41    let h_scroll1 = activity.create_horizontal_scroll_view(Some(main_layout.id()))?;
42    h_scroll1.view().set_margin(&mut activity, 10)?;
43    h_scroll1.view().set_height_wrap_content(&mut activity)?;
44    h_scroll1.view().set_linear_layout_params(&mut activity, 0, None)?;
45    
46    // 在 HorizontalScrollView 内创建水平 LinearLayout
47    let h_layout1 = activity.create_linear_layout_horizontal(Some(h_scroll1.id()))?;
48    h_layout1.view().set_height_wrap_content(&mut activity)?;
49    
50    // 添加10个水果按钮
51    let fruits = ["🍎 苹果", "🍊 橙子", "🍌 香蕉", "🍇 葡萄", "🍓 草莓", 
52                  "🍑 桃子", "🍒 樱桃", "🍍 菠萝", "🥝 猕猴桃", "🥭 芒果"];
53    let mut fruit_buttons = Vec::new();
54    for fruit in &fruits {
55        let btn = activity.create_button(fruit, Some(h_layout1.id()))?;
56        btn.view().set_width(&mut activity, 180)?;  // 固定宽度180dp
57        btn.view().set_margin(&mut activity, 5)?;
58        fruit_buttons.push(btn);
59    }
60    
61    // ========== 第二行: 数字按钮 ==========
62    let section2 = activity.create_text_view("第二行: 数字按钮(左右滑动)", Some(main_layout.id()))?;
63    section2.set_text_size(&mut activity, 18)?;
64    section2.view().set_margin(&mut activity, 10)?;
65    section2.view().set_height_wrap_content(&mut activity)?;
66    section2.view().set_linear_layout_params(&mut activity, 0, None)?;
67    section2.set_text_color(&mut activity, 0xFF4CAF50u32 as i32)?;
68    
69    // 创建第二个 HorizontalScrollView
70    let h_scroll2 = activity.create_horizontal_scroll_view(Some(main_layout.id()))?;
71    h_scroll2.view().set_margin(&mut activity, 10)?;
72    h_scroll2.view().set_height_wrap_content(&mut activity)?;
73    h_scroll2.view().set_linear_layout_params(&mut activity, 0, None)?;
74    
75    // 在 HorizontalScrollView 内创建水平 LinearLayout
76    let h_layout2 = activity.create_linear_layout_horizontal(Some(h_scroll2.id()))?;
77    h_layout2.view().set_height_wrap_content(&mut activity)?;
78    
79    // 添加20个数字按钮
80    let mut number_buttons = Vec::new();
81    for i in 0..20 {
82        let btn = activity.create_button(&format!("数字 {}", i * 5), Some(h_layout2.id()))?;
83        btn.view().set_width(&mut activity, 150)?;  // 固定宽度150dp
84        btn.view().set_margin(&mut activity, 5)?;
85        number_buttons.push(btn);
86    }
87    
88    // ========== 底部信息 ==========
89    let divider = activity.create_text_view("━━━━━━━━━━━━━━━━━━━━", Some(main_layout.id()))?;
90    divider.view().set_margin(&mut activity, 10)?;
91    divider.view().set_height_wrap_content(&mut activity)?;
92    divider.view().set_linear_layout_params(&mut activity, 0, None)?;
93    
94    let info = activity.create_text_view(
95        "💡 提示:\n\
96        • 在每一行中左右滑动\n\
97        • 点击任意按钮查看效果\n\
98        • HorizontalScrollView 支持水平滚动",
99        Some(main_layout.id())
100    )?;
101    info.view().set_margin(&mut activity, 10)?;
102    info.view().set_height_wrap_content(&mut activity)?;
103    info.view().set_linear_layout_params(&mut activity, 0, None)?;
104    info.set_text_color(&mut activity, 0xFF666666u32 as i32)?;
105    
106    // 状态显示
107    let status = activity.create_text_view("准备就绪 - 尝试左右滑动", Some(main_layout.id()))?;
108    status.view().set_margin(&mut activity, 10)?;
109    status.view().set_height_wrap_content(&mut activity)?;
110    status.view().set_linear_layout_params(&mut activity, 0, None)?;
111    status.set_text_color(&mut activity, 0xFF2196F3u32 as i32)?;
112    
113    println!("✓ 界面创建完成\n");
114    println!("━━━━━━━━━━━━━━━━━━━━━━");
115    println!("提示:");
116    println!("  • 第一行: 10个水果按钮");
117    println!("  • 第二行: 20个数字按钮");
118    println!("  • 左右滑动查看更多内容");
119    println!("━━━━━━━━━━━━━━━━━━━━━━\n");
120    
121    // 事件循环
122    loop {
123        let event = read_message(activity.event_stream())?;
124        let event_type = event["type"].as_str().unwrap_or("");
125        let event_value = &event["value"];
126        
127        match event_type {
128            "destroy" => {
129                println!("\n✓ Activity 已关闭");
130                return Ok(());
131            },
132            "click" => {
133                let clicked_id = event_value["id"].as_i64().unwrap_or(-1);
134                
135                // 检查水果按钮
136                for (i, btn) in fruit_buttons.iter().enumerate() {
137                    if clicked_id == btn.id() {
138                        println!("✅ 选择: {}", fruits[i]);
139                        status.set_text(&mut activity, &format!("✅ 选择: {}", fruits[i]))?;
140                        status.set_text_color(&mut activity, 0xFF4CAF50u32 as i32)?;
141                        break;
142                    }
143                }
144                
145                // 检查数字按钮
146                for (i, btn) in number_buttons.iter().enumerate() {
147                    if clicked_id == btn.id() {
148                        let value = i * 5;
149                        println!("🔢 选择数字: {}", value);
150                        status.set_text(&mut activity, &format!("🔢 选择数字: {}", value))?;
151                        status.set_text_color(&mut activity, 0xFFFF9800u32 as i32)?;
152                        break;
153                    }
154                }
155            },
156            _ => {}
157        }
158    }
159}
examples/switch_demo_v2.rs (line 122)
48fn main() -> Result<()> {
49    println!("=== Switch 开关演示 (新库版本) ===\n");
50    
51    // 创建 Activity(对话框模式)
52    let mut activity = Activity::new(true)?;
53    println!("✓ 连接建立\n");
54    
55    // 创建主布局
56    let layout = activity.create_linear_layout(None)?;
57    
58    // 创建标题
59    let title = activity.create_text_view("智能家居控制 🏠", Some(layout.id()))?;
60    title.set_text_size(&mut activity, 28)?;
61    title.view().set_margin(&mut activity, 10)?;
62    title.view().set_height_wrap_content(&mut activity)?;
63    title.view().set_linear_layout_params(&mut activity, 0, None)?;
64    
65    // 创建说明
66    let desc = activity.create_text_view("滑动开关控制设备", Some(layout.id()))?;
67    desc.view().set_margin(&mut activity, 5)?;
68    desc.view().set_height_wrap_content(&mut activity)?;
69    desc.view().set_linear_layout_params(&mut activity, 0, None)?;
70    
71    // 创建 Switch 1 - 客厅灯(初始开启)
72    let switch1 = activity.create_switch_checked("💡 客厅灯", Some(layout.id()), true)?;
73    switch1.view().set_margin(&mut activity, 8)?;
74    switch1.view().set_height_wrap_content(&mut activity)?;
75    switch1.view().set_linear_layout_params(&mut activity, 0, None)?;
76    
77    // 创建 Switch 2 - 空调(初始关闭)
78    let switch2 = activity.create_switch_checked("❄️ 空调", Some(layout.id()), false)?;
79    switch2.view().set_margin(&mut activity, 8)?;
80    switch2.view().set_height_wrap_content(&mut activity)?;
81    switch2.view().set_linear_layout_params(&mut activity, 0, None)?;
82    
83    // 创建 Switch 3 - 加湿器(初始关闭)
84    let switch3 = activity.create_switch_checked("💧 加湿器", Some(layout.id()), false)?;
85    switch3.view().set_margin(&mut activity, 8)?;
86    switch3.view().set_height_wrap_content(&mut activity)?;
87    switch3.view().set_linear_layout_params(&mut activity, 0, None)?;
88    
89    // 创建 Switch 4 - 窗帘(初始开启)
90    let switch4 = activity.create_switch_checked("🪟 电动窗帘", Some(layout.id()), true)?;
91    switch4.view().set_margin(&mut activity, 8)?;
92    switch4.view().set_height_wrap_content(&mut activity)?;
93    switch4.view().set_linear_layout_params(&mut activity, 0, None)?;
94    
95    // 创建 Switch 5 - 音乐(初始关闭)
96    let switch5 = activity.create_switch_checked("🎵 背景音乐", Some(layout.id()), false)?;
97    switch5.view().set_margin(&mut activity, 8)?;
98    switch5.view().set_height_wrap_content(&mut activity)?;
99    switch5.view().set_linear_layout_params(&mut activity, 0, None)?;
100    
101    // 创建分隔线
102    let divider = activity.create_text_view("━━━━━━━━━━━━━━━━━━━━", Some(layout.id()))?;
103    divider.view().set_margin(&mut activity, 10)?;
104    divider.view().set_height_wrap_content(&mut activity)?;
105    divider.view().set_linear_layout_params(&mut activity, 0, None)?;
106    
107    // 创建状态显示
108    let status = activity.create_text_view("已开启: 客厅灯, 窗帘", Some(layout.id()))?;
109    status.set_text_size(&mut activity, 16)?;
110    status.view().set_margin(&mut activity, 10)?;
111    status.view().set_height_wrap_content(&mut activity)?;
112    status.view().set_linear_layout_params(&mut activity, 0, None)?;
113    status.set_text_color(&mut activity, 0xFF4CAF50u32 as i32)?;
114    
115    // 创建按钮布局(水平)
116    let button_layout = activity.create_linear_layout_horizontal(Some(layout.id()))?;
117    button_layout.view().set_margin(&mut activity, 10)?;
118    button_layout.view().set_height_wrap_content(&mut activity)?;
119    button_layout.view().set_linear_layout_params(&mut activity, 0, None)?;
120    
121    // 创建全部开启按钮
122    let all_on_btn = activity.create_button("🔆 全部开启", Some(button_layout.id()))?;
123    all_on_btn.view().set_linear_layout_params(&mut activity, 1, None)?;
124    
125    // 创建全部关闭按钮
126    let all_off_btn = activity.create_button("🌙 全部关闭", Some(button_layout.id()))?;
127    all_off_btn.view().set_linear_layout_params(&mut activity, 1, None)?;
128    
129    println!("✓ 界面创建完成\n");
130    println!("━━━━━━━━━━━━━━━━━━━━━━");
131    println!("提示:");
132    println!("  • 滑动开关切换设备状态");
133    println!("  • 观察状态实时更新");
134    println!("  • 使用 '全部开启/关闭' 按钮");
135    println!("━━━━━━━━━━━━━━━━━━━━━━\n");
136    
137    // 状态跟踪
138    let mut light_on = true;
139    let mut ac_on = false;
140    let mut humidifier_on = false;
141    let mut curtain_on = true;
142    let mut music_on = false;
143    
144    // 事件循环
145    loop {
146        let event = read_message(activity.event_stream())?;
147        let event_type = event["type"].as_str().unwrap_or("");
148        let event_value = &event["value"];
149        
150        match event_type {
151            "destroy" => {
152                // Activity 已被系统销毁,直接退出即可
153                // 不要调用 activity.finish(),因为 Activity 已经不存在了
154                println!("\n✓ Activity 已关闭");
155                return Ok(());
156            },
157            "click" => {
158                let clicked_id = event_value["id"].as_i64().unwrap_or(-1);
159                let is_checked = event_value["set"].as_bool().unwrap_or(false);
160                
161                if clicked_id == switch1.id() {
162                    light_on = is_checked;
163                    println!("💡 客厅灯: {}", if is_checked { "开启" } else { "关闭" });
164                } else if clicked_id == switch2.id() {
165                    ac_on = is_checked;
166                    println!("❄️ 空调: {}", if is_checked { "开启" } else { "关闭" });
167                } else if clicked_id == switch3.id() {
168                    humidifier_on = is_checked;
169                    println!("💧 加湿器: {}", if is_checked { "开启" } else { "关闭" });
170                } else if clicked_id == switch4.id() {
171                    curtain_on = is_checked;
172                    println!("🪟 窗帘: {}", if is_checked { "打开" } else { "关闭" });
173                } else if clicked_id == switch5.id() {
174                    music_on = is_checked;
175                    println!("🎵 音乐: {}", if is_checked { "播放" } else { "停止" });
176                } else if clicked_id == all_on_btn.id() {
177                    println!("\n🔆 全部开启");
178                    light_on = true;
179                    ac_on = true;
180                    humidifier_on = true;
181                    curtain_on = true;
182                    music_on = true;
183                    
184                    switch1.set_checked(&mut activity, true)?;
185                    switch2.set_checked(&mut activity, true)?;
186                    switch3.set_checked(&mut activity, true)?;
187                    switch4.set_checked(&mut activity, true)?;
188                    switch5.set_checked(&mut activity, true)?;
189                } else if clicked_id == all_off_btn.id() {
190                    println!("\n🌙 全部关闭");
191                    light_on = false;
192                    ac_on = false;
193                    humidifier_on = false;
194                    curtain_on = false;
195                    music_on = false;
196                    
197                    switch1.set_checked(&mut activity, false)?;
198                    switch2.set_checked(&mut activity, false)?;
199                    switch3.set_checked(&mut activity, false)?;
200                    switch4.set_checked(&mut activity, false)?;
201                    switch5.set_checked(&mut activity, false)?;
202                }
203                
204                update_status(&mut activity, &status, 
205                            light_on, ac_on, humidifier_on, curtain_on, music_on)?;
206            },
207            _ => {}
208        }
209    }
210}
examples/toggle_demo_v2.rs (line 74)
8fn main() -> Result<()> {
9    println!("=== ToggleButton 切换按钮演示 (新库版本) ===\n");
10    
11    // 创建 Activity(对话框模式)
12    let mut activity = Activity::new(true)?;
13    println!("✓ 连接建立\n");
14    
15    // 创建主布局
16    let layout = activity.create_linear_layout(None)?;
17    
18    // 创建标题
19    let title = activity.create_text_view("🔘 ToggleButton 演示", Some(layout.id()))?;
20    title.set_text_size(&mut activity, 26)?;
21    title.view().set_margin(&mut activity, 10)?;
22    title.view().set_height_wrap_content(&mut activity)?;
23    title.view().set_linear_layout_params(&mut activity, 0, None)?;
24    
25    // 创建说明
26    let desc = activity.create_text_view("ToggleButton 是带开关状态的按钮", Some(layout.id()))?;
27    desc.view().set_margin(&mut activity, 5)?;
28    desc.view().set_height_wrap_content(&mut activity)?;
29    desc.view().set_linear_layout_params(&mut activity, 0, None)?;
30    
31    // 创建 ToggleButton 1 - WiFi(关闭)
32    let toggle1 = activity.create_toggle_button_checked("📶 WiFi", Some(layout.id()), false)?;
33    toggle1.view().set_margin(&mut activity, 8)?;
34    toggle1.view().set_height_wrap_content(&mut activity)?;
35    toggle1.view().set_linear_layout_params(&mut activity, 0, None)?;
36    
37    // 创建 ToggleButton 2 - 蓝牙(开启)
38    let toggle2 = activity.create_toggle_button_checked("📡 蓝牙", Some(layout.id()), true)?;
39    toggle2.view().set_margin(&mut activity, 8)?;
40    toggle2.view().set_height_wrap_content(&mut activity)?;
41    toggle2.view().set_linear_layout_params(&mut activity, 0, None)?;
42    
43    // 创建 ToggleButton 3 - GPS(关闭)
44    let toggle3 = activity.create_toggle_button_checked("🛰️ GPS", Some(layout.id()), false)?;
45    toggle3.view().set_margin(&mut activity, 8)?;
46    toggle3.view().set_height_wrap_content(&mut activity)?;
47    toggle3.view().set_linear_layout_params(&mut activity, 0, None)?;
48    
49    // 创建 ToggleButton 4 - 飞行模式(关闭)
50    let toggle4 = activity.create_toggle_button_checked("✈️ 飞行模式", Some(layout.id()), false)?;
51    toggle4.view().set_margin(&mut activity, 8)?;
52    toggle4.view().set_height_wrap_content(&mut activity)?;
53    toggle4.view().set_linear_layout_params(&mut activity, 0, None)?;
54    
55    // 创建分隔线
56    let divider = activity.create_text_view("━━━━━━━━━━━━━━━━━━━━", Some(layout.id()))?;
57    divider.view().set_margin(&mut activity, 10)?;
58    divider.view().set_height_wrap_content(&mut activity)?;
59    divider.view().set_linear_layout_params(&mut activity, 0, None)?;
60    
61    // 创建状态显示
62    let status = activity.create_text_view("当前开启: 蓝牙", Some(layout.id()))?;
63    status.view().set_margin(&mut activity, 10)?;
64    status.view().set_height_wrap_content(&mut activity)?;
65    status.view().set_linear_layout_params(&mut activity, 0, None)?;
66    status.set_text_color(&mut activity, 0xFF2196F3u32 as i32)?;
67    
68    // 创建按钮布局
69    let button_layout = activity.create_linear_layout_horizontal(Some(layout.id()))?;
70    button_layout.view().set_margin(&mut activity, 10)?;
71    button_layout.view().set_height_wrap_content(&mut activity)?;
72    button_layout.view().set_linear_layout_params(&mut activity, 0, None)?;
73    
74    let all_on_btn = activity.create_button("🔆 全部开启", Some(button_layout.id()))?;
75    all_on_btn.view().set_linear_layout_params(&mut activity, 1, None)?;
76    
77    let all_off_btn = activity.create_button("🌙 全部关闭", Some(button_layout.id()))?;
78    all_off_btn.view().set_linear_layout_params(&mut activity, 1, None)?;
79    
80    println!("✓ 界面创建完成\n");
81    println!("━━━━━━━━━━━━━━━━━━━━━━");
82    println!("提示:");
83    println!("  • 点击 ToggleButton 切换状态");
84    println!("  • ToggleButton 开启时按钮会凹陷");
85    println!("  • 使用按钮控制全部开关");
86    println!("━━━━━━━━━━━━━━━━━━━━━━\n");
87    
88    // 状态跟踪
89    let mut wifi_on = false;
90    let mut bluetooth_on = true;
91    let mut gps_on = false;
92    let mut airplane_on = false;
93    
94    // 更新状态显示的辅助函数
95    let update_status = |activity: &mut Activity, 
96                         status: &TextView,
97                         wifi: bool, 
98                         bt: bool, 
99                         gps: bool, 
100                         airplane: bool| -> Result<()> {
101        let mut active = Vec::new();
102        if wifi { active.push("WiFi"); }
103        if bt { active.push("蓝牙"); }
104        if gps { active.push("GPS"); }
105        if airplane { active.push("飞行模式"); }
106        
107        let text = if active.is_empty() {
108            "当前开启: 无".to_string()
109        } else {
110            format!("当前开启: {}", active.join(", "))
111        };
112        
113        status.set_text(activity, &text)?;
114        
115        // 如果开启飞行模式,文字显示橙色警告
116        let color = if airplane {
117            0xFFFF9800u32 as i32  // 橙色
118        } else if active.is_empty() {
119            0xFF9E9E9Eu32 as i32  // 灰色
120        } else {
121            0xFF2196F3u32 as i32  // 蓝色
122        };
123        status.set_text_color(activity, color)?;
124        
125        Ok(())
126    };
127    
128    // 事件循环
129    loop {
130        let event = read_message(activity.event_stream())?;
131        let event_type = event["type"].as_str().unwrap_or("");
132        let event_value = &event["value"];
133        
134        match event_type {
135            "destroy" => {
136                // Activity 已被系统销毁,直接退出即可
137                println!("\n✓ Activity 已关闭");
138                return Ok(());
139            },
140            "click" => {
141                let clicked_id = event_value["id"].as_i64().unwrap_or(-1);
142                let is_checked = event_value["set"].as_bool().unwrap_or(false);
143                
144                if clicked_id == toggle1.id() {
145                    wifi_on = is_checked;
146                    println!("📶 WiFi: {}", if is_checked { "开启" } else { "关闭" });
147                } else if clicked_id == toggle2.id() {
148                    bluetooth_on = is_checked;
149                    println!("📡 蓝牙: {}", if is_checked { "开启" } else { "关闭" });
150                } else if clicked_id == toggle3.id() {
151                    gps_on = is_checked;
152                    println!("🛰️ GPS: {}", if is_checked { "开启" } else { "关闭" });
153                } else if clicked_id == toggle4.id() {
154                    airplane_on = is_checked;
155                    println!("✈️ 飞行模式: {}", if is_checked { "开启" } else { "关闭" });
156                } else if clicked_id == all_on_btn.id() {
157                    println!("\n🔆 全部开启");
158                    wifi_on = true;
159                    bluetooth_on = true;
160                    gps_on = true;
161                    airplane_on = true;
162                    
163                    toggle1.set_checked(&mut activity, true)?;
164                    toggle2.set_checked(&mut activity, true)?;
165                    toggle3.set_checked(&mut activity, true)?;
166                    toggle4.set_checked(&mut activity, true)?;
167                } else if clicked_id == all_off_btn.id() {
168                    println!("\n🌙 全部关闭");
169                    wifi_on = false;
170                    bluetooth_on = false;
171                    gps_on = false;
172                    airplane_on = false;
173                    
174                    toggle1.set_checked(&mut activity, false)?;
175                    toggle2.set_checked(&mut activity, false)?;
176                    toggle3.set_checked(&mut activity, false)?;
177                    toggle4.set_checked(&mut activity, false)?;
178                }
179                
180                update_status(&mut activity, &status, wifi_on, bluetooth_on, gps_on, airplane_on)?;
181            },
182            _ => {}
183        }
184    }
185}
Source

pub fn create_edit_text( &mut self, text: &str, parent: Option<i64>, ) -> Result<EditText>

Create an EditText

Examples found in repository?
examples/input_demo_v2.rs (line 32)
8fn main() -> Result<()> {
9    println!("=== 输入框交互演示 (新库版本) ===\n");
10    
11    // 创建 Activity(对话框模式)
12    let mut activity = Activity::new(true)?;
13    println!("✓ 连接建立\n");
14    
15    // 创建主布局
16    let layout = activity.create_linear_layout(None)?;
17    
18    // 创建标题
19    let title = activity.create_text_view("文本输入演示 📝", Some(layout.id()))?;
20    title.set_text_size(&mut activity, 28)?;
21    title.view().set_margin(&mut activity, 10)?;
22    title.view().set_height_wrap_content(&mut activity)?;
23    title.view().set_linear_layout_params(&mut activity, 0, None)?;
24    
25    // 创建说明文本
26    let desc1 = activity.create_text_view("在下方输入你的名字:", Some(layout.id()))?;
27    desc1.view().set_margin(&mut activity, 5)?;
28    desc1.view().set_height_wrap_content(&mut activity)?;
29    desc1.view().set_linear_layout_params(&mut activity, 0, None)?;
30    
31    // 创建输入框 1 - 姓名(单行文本)
32    let name_input = activity.create_edit_text("", Some(layout.id()))?;
33    name_input.set_hint(&mut activity, "请输入姓名")?;
34    name_input.view().set_margin(&mut activity, 5)?;
35    name_input.view().set_height_wrap_content(&mut activity)?;
36    name_input.view().set_linear_layout_params(&mut activity, 0, None)?;
37    
38    // 创建说明文本2
39    let desc2 = activity.create_text_view("输入一个数字:", Some(layout.id()))?;
40    desc2.view().set_margin(&mut activity, 5)?;
41    desc2.view().set_height_wrap_content(&mut activity)?;
42    desc2.view().set_linear_layout_params(&mut activity, 0, None)?;
43    
44    // 创建输入框 2 - 数字
45    let number_input = activity.create_edit_text("0", Some(layout.id()))?;
46    number_input.set_hint(&mut activity, "请输入数字")?;
47    number_input.view().set_margin(&mut activity, 5)?;
48    number_input.view().set_height_wrap_content(&mut activity)?;
49    number_input.view().set_linear_layout_params(&mut activity, 0, None)?;
50    
51    // 创建说明文本3
52    let desc3 = activity.create_text_view("输入多行消息:", Some(layout.id()))?;
53    desc3.view().set_margin(&mut activity, 5)?;
54    desc3.view().set_height_wrap_content(&mut activity)?;
55    desc3.view().set_linear_layout_params(&mut activity, 0, None)?;
56    
57    // 创建输入框 3 - 多行文本
58    let message_input = activity.create_edit_text_multiline("", Some(layout.id()))?;
59    message_input.set_hint(&mut activity, "请输入消息(支持多行)")?;
60    message_input.view().set_margin(&mut activity, 5)?;
61    // 多行文本需要更多空间
62    message_input.view().set_linear_layout_params(&mut activity, 1, None)?;
63    
64    // 创建按钮布局(水平)
65    let button_layout = activity.create_linear_layout_horizontal(Some(layout.id()))?;
66    button_layout.view().set_margin(&mut activity, 10)?;
67    button_layout.view().set_height_wrap_content(&mut activity)?;
68    button_layout.view().set_linear_layout_params(&mut activity, 0, None)?;
69    
70    // 创建提交按钮
71    let submit_button = activity.create_button("✅ 提交", Some(button_layout.id()))?;
72    submit_button.view().set_linear_layout_params(&mut activity, 1, None)?;
73    
74    // 创建清空按钮
75    let clear_button = activity.create_button("🗑️ 清空", Some(button_layout.id()))?;
76    clear_button.view().set_linear_layout_params(&mut activity, 1, None)?;
77    
78    // 创建测试按钮
79    let test_button = activity.create_button("🧪 测试", Some(button_layout.id()))?;
80    test_button.view().set_linear_layout_params(&mut activity, 1, None)?;
81    
82    // 创建分隔线
83    let divider = activity.create_text_view("━━━━━━━━━━━━━━━━━━━━", Some(layout.id()))?;
84    divider.view().set_margin(&mut activity, 10)?;
85    divider.view().set_height_wrap_content(&mut activity)?;
86    divider.view().set_linear_layout_params(&mut activity, 0, None)?;
87    
88    // 创建结果显示区域
89    let result = activity.create_text_view("结果将显示在这里...", Some(layout.id()))?;
90    result.set_text_size(&mut activity, 16)?;
91    result.view().set_margin(&mut activity, 10)?;
92    result.view().set_linear_layout_params(&mut activity, 1, None)?;
93    
94    println!("✓ 界面创建完成\n");
95    println!("━━━━━━━━━━━━━━━━━━━━━━");
96    println!("提示:");
97    println!("  • 在输入框中输入内容");
98    println!("  • 点击 '提交' 查看输入的内容");
99    println!("  • 点击 '清空' 清除所有输入");
100    println!("  • 点击 '测试' 填充测试数据");
101    println!("━━━━━━━━━━━━━━━━━━━━━━\n");
102    
103    // 事件循环
104    loop {
105        let event = read_message(activity.event_stream())?;
106        let event_type = event["type"].as_str().unwrap_or("");
107        let event_value = &event["value"];
108        
109        match event_type {
110            "destroy" => {
111                // Activity 已被系统销毁,直接退出即可
112                // 不要调用 activity.finish(),因为 Activity 已经不存在了
113                println!("\n✓ Activity 已关闭");
114                return Ok(());
115            },
116            "click" => {
117                let clicked_id = event_value["id"].as_i64().unwrap_or(-1);
118                
119                if clicked_id == submit_button.id() {
120                    println!("📨 提交按钮被点击");
121                    
122                    // 获取姓名输入框的文本
123                    let name = name_input.get_text(&mut activity)?;
124                    
125                    // 获取数字输入框的文本
126                    let number_str = number_input.get_text(&mut activity)?;
127                    let number: i32 = number_str.parse().unwrap_or(0);
128                    
129                    // 获取多行消息
130                    let message = message_input.get_text(&mut activity)?;
131                    
132                    // 构建结果文本
133                    let result_text = if name.is_empty() {
134                        "⚠️ 请输入姓名!".to_string()
135                    } else {
136                        let doubled = number * 2;
137                        let msg_part = if message.is_empty() {
138                            String::new()
139                        } else {
140                            format!("\n\n消息:\n{}", message)
141                        };
142                        
143                        format!(
144                            "✅ 提交成功!\n\n\
145                            姓名: {}\n\
146                            数字: {} (x2 = {}){}",
147                            name, number, doubled, msg_part
148                        )
149                    };
150                    
151                    // 更新结果显示
152                    result.set_text(&mut activity, &result_text)?;
153                    
154                    // 根据结果改变颜色
155                    let color = if name.is_empty() {
156                        0xFFF44336u32 as i32  // 红色(错误)
157                    } else {
158                        0xFF4CAF50u32 as i32  // 绿色(成功)
159                    };
160                    result.set_text_color(&mut activity, color)?;
161                    
162                    println!("   姓名: {}", name);
163                    println!("   数字: {}", number);
164                    println!("   消息: {}", if message.is_empty() { "(空)" } else { &message });
165                    
166                } else if clicked_id == clear_button.id() {
167                    println!("🗑️ 清空按钮被点击");
168                    
169                    // 清空所有输入框
170                    name_input.set_text(&mut activity, "")?;
171                    number_input.set_text(&mut activity, "0")?;
172                    message_input.set_text(&mut activity, "")?;
173                    
174                    // 清空结果显示
175                    result.set_text(&mut activity, "已清空所有输入")?;
176                    result.set_text_color(&mut activity, 0xFF9E9E9Eu32 as i32)?;
177                    
178                } else if clicked_id == test_button.id() {
179                    println!("🧪 测试按钮被点击");
180                    
181                    // 填充测试数据
182                    name_input.set_text(&mut activity, "张三")?;
183                    number_input.set_text(&mut activity, "42")?;
184                    message_input.set_text(&mut activity, "这是一条测试消息。\n使用Rust编写的Termux:GUI应用!")?;
185                    
186                    result.set_text(&mut activity, "✅ 已填充测试数据\n点击 '提交' 按钮查看结果")?;
187                    result.set_text_color(&mut activity, 0xFF2196F3u32 as i32)?;
188                }
189            },
190            "text" => {
191                // EditText 文本变化事件(可选)
192                let view_id = event_value["id"].as_i64().unwrap_or(-1);
193                let text = event_value["text"].as_str().unwrap_or("");
194                
195                if view_id == name_input.id() {
196                    println!("📝 姓名输入框内容变化: {}", text);
197                } else if view_id == number_input.id() {
198                    println!("🔢 数字输入框内容变化: {}", text);
199                }
200            },
201            _ => {}
202        }
203    }
204}
Source

pub fn create_edit_text_multiline( &mut self, text: &str, parent: Option<i64>, ) -> Result<EditText>

Create a multi-line EditText

Examples found in repository?
examples/input_demo_v2.rs (line 58)
8fn main() -> Result<()> {
9    println!("=== 输入框交互演示 (新库版本) ===\n");
10    
11    // 创建 Activity(对话框模式)
12    let mut activity = Activity::new(true)?;
13    println!("✓ 连接建立\n");
14    
15    // 创建主布局
16    let layout = activity.create_linear_layout(None)?;
17    
18    // 创建标题
19    let title = activity.create_text_view("文本输入演示 📝", Some(layout.id()))?;
20    title.set_text_size(&mut activity, 28)?;
21    title.view().set_margin(&mut activity, 10)?;
22    title.view().set_height_wrap_content(&mut activity)?;
23    title.view().set_linear_layout_params(&mut activity, 0, None)?;
24    
25    // 创建说明文本
26    let desc1 = activity.create_text_view("在下方输入你的名字:", Some(layout.id()))?;
27    desc1.view().set_margin(&mut activity, 5)?;
28    desc1.view().set_height_wrap_content(&mut activity)?;
29    desc1.view().set_linear_layout_params(&mut activity, 0, None)?;
30    
31    // 创建输入框 1 - 姓名(单行文本)
32    let name_input = activity.create_edit_text("", Some(layout.id()))?;
33    name_input.set_hint(&mut activity, "请输入姓名")?;
34    name_input.view().set_margin(&mut activity, 5)?;
35    name_input.view().set_height_wrap_content(&mut activity)?;
36    name_input.view().set_linear_layout_params(&mut activity, 0, None)?;
37    
38    // 创建说明文本2
39    let desc2 = activity.create_text_view("输入一个数字:", Some(layout.id()))?;
40    desc2.view().set_margin(&mut activity, 5)?;
41    desc2.view().set_height_wrap_content(&mut activity)?;
42    desc2.view().set_linear_layout_params(&mut activity, 0, None)?;
43    
44    // 创建输入框 2 - 数字
45    let number_input = activity.create_edit_text("0", Some(layout.id()))?;
46    number_input.set_hint(&mut activity, "请输入数字")?;
47    number_input.view().set_margin(&mut activity, 5)?;
48    number_input.view().set_height_wrap_content(&mut activity)?;
49    number_input.view().set_linear_layout_params(&mut activity, 0, None)?;
50    
51    // 创建说明文本3
52    let desc3 = activity.create_text_view("输入多行消息:", Some(layout.id()))?;
53    desc3.view().set_margin(&mut activity, 5)?;
54    desc3.view().set_height_wrap_content(&mut activity)?;
55    desc3.view().set_linear_layout_params(&mut activity, 0, None)?;
56    
57    // 创建输入框 3 - 多行文本
58    let message_input = activity.create_edit_text_multiline("", Some(layout.id()))?;
59    message_input.set_hint(&mut activity, "请输入消息(支持多行)")?;
60    message_input.view().set_margin(&mut activity, 5)?;
61    // 多行文本需要更多空间
62    message_input.view().set_linear_layout_params(&mut activity, 1, None)?;
63    
64    // 创建按钮布局(水平)
65    let button_layout = activity.create_linear_layout_horizontal(Some(layout.id()))?;
66    button_layout.view().set_margin(&mut activity, 10)?;
67    button_layout.view().set_height_wrap_content(&mut activity)?;
68    button_layout.view().set_linear_layout_params(&mut activity, 0, None)?;
69    
70    // 创建提交按钮
71    let submit_button = activity.create_button("✅ 提交", Some(button_layout.id()))?;
72    submit_button.view().set_linear_layout_params(&mut activity, 1, None)?;
73    
74    // 创建清空按钮
75    let clear_button = activity.create_button("🗑️ 清空", Some(button_layout.id()))?;
76    clear_button.view().set_linear_layout_params(&mut activity, 1, None)?;
77    
78    // 创建测试按钮
79    let test_button = activity.create_button("🧪 测试", Some(button_layout.id()))?;
80    test_button.view().set_linear_layout_params(&mut activity, 1, None)?;
81    
82    // 创建分隔线
83    let divider = activity.create_text_view("━━━━━━━━━━━━━━━━━━━━", Some(layout.id()))?;
84    divider.view().set_margin(&mut activity, 10)?;
85    divider.view().set_height_wrap_content(&mut activity)?;
86    divider.view().set_linear_layout_params(&mut activity, 0, None)?;
87    
88    // 创建结果显示区域
89    let result = activity.create_text_view("结果将显示在这里...", Some(layout.id()))?;
90    result.set_text_size(&mut activity, 16)?;
91    result.view().set_margin(&mut activity, 10)?;
92    result.view().set_linear_layout_params(&mut activity, 1, None)?;
93    
94    println!("✓ 界面创建完成\n");
95    println!("━━━━━━━━━━━━━━━━━━━━━━");
96    println!("提示:");
97    println!("  • 在输入框中输入内容");
98    println!("  • 点击 '提交' 查看输入的内容");
99    println!("  • 点击 '清空' 清除所有输入");
100    println!("  • 点击 '测试' 填充测试数据");
101    println!("━━━━━━━━━━━━━━━━━━━━━━\n");
102    
103    // 事件循环
104    loop {
105        let event = read_message(activity.event_stream())?;
106        let event_type = event["type"].as_str().unwrap_or("");
107        let event_value = &event["value"];
108        
109        match event_type {
110            "destroy" => {
111                // Activity 已被系统销毁,直接退出即可
112                // 不要调用 activity.finish(),因为 Activity 已经不存在了
113                println!("\n✓ Activity 已关闭");
114                return Ok(());
115            },
116            "click" => {
117                let clicked_id = event_value["id"].as_i64().unwrap_or(-1);
118                
119                if clicked_id == submit_button.id() {
120                    println!("📨 提交按钮被点击");
121                    
122                    // 获取姓名输入框的文本
123                    let name = name_input.get_text(&mut activity)?;
124                    
125                    // 获取数字输入框的文本
126                    let number_str = number_input.get_text(&mut activity)?;
127                    let number: i32 = number_str.parse().unwrap_or(0);
128                    
129                    // 获取多行消息
130                    let message = message_input.get_text(&mut activity)?;
131                    
132                    // 构建结果文本
133                    let result_text = if name.is_empty() {
134                        "⚠️ 请输入姓名!".to_string()
135                    } else {
136                        let doubled = number * 2;
137                        let msg_part = if message.is_empty() {
138                            String::new()
139                        } else {
140                            format!("\n\n消息:\n{}", message)
141                        };
142                        
143                        format!(
144                            "✅ 提交成功!\n\n\
145                            姓名: {}\n\
146                            数字: {} (x2 = {}){}",
147                            name, number, doubled, msg_part
148                        )
149                    };
150                    
151                    // 更新结果显示
152                    result.set_text(&mut activity, &result_text)?;
153                    
154                    // 根据结果改变颜色
155                    let color = if name.is_empty() {
156                        0xFFF44336u32 as i32  // 红色(错误)
157                    } else {
158                        0xFF4CAF50u32 as i32  // 绿色(成功)
159                    };
160                    result.set_text_color(&mut activity, color)?;
161                    
162                    println!("   姓名: {}", name);
163                    println!("   数字: {}", number);
164                    println!("   消息: {}", if message.is_empty() { "(空)" } else { &message });
165                    
166                } else if clicked_id == clear_button.id() {
167                    println!("🗑️ 清空按钮被点击");
168                    
169                    // 清空所有输入框
170                    name_input.set_text(&mut activity, "")?;
171                    number_input.set_text(&mut activity, "0")?;
172                    message_input.set_text(&mut activity, "")?;
173                    
174                    // 清空结果显示
175                    result.set_text(&mut activity, "已清空所有输入")?;
176                    result.set_text_color(&mut activity, 0xFF9E9E9Eu32 as i32)?;
177                    
178                } else if clicked_id == test_button.id() {
179                    println!("🧪 测试按钮被点击");
180                    
181                    // 填充测试数据
182                    name_input.set_text(&mut activity, "张三")?;
183                    number_input.set_text(&mut activity, "42")?;
184                    message_input.set_text(&mut activity, "这是一条测试消息。\n使用Rust编写的Termux:GUI应用!")?;
185                    
186                    result.set_text(&mut activity, "✅ 已填充测试数据\n点击 '提交' 按钮查看结果")?;
187                    result.set_text_color(&mut activity, 0xFF2196F3u32 as i32)?;
188                }
189            },
190            "text" => {
191                // EditText 文本变化事件(可选)
192                let view_id = event_value["id"].as_i64().unwrap_or(-1);
193                let text = event_value["text"].as_str().unwrap_or("");
194                
195                if view_id == name_input.id() {
196                    println!("📝 姓名输入框内容变化: {}", text);
197                } else if view_id == number_input.id() {
198                    println!("🔢 数字输入框内容变化: {}", text);
199                }
200            },
201            _ => {}
202        }
203    }
204}
Source

pub fn create_checkbox( &mut self, text: &str, parent: Option<i64>, ) -> Result<Checkbox>

Create a Checkbox

Source

pub fn create_checkbox_checked( &mut self, text: &str, parent: Option<i64>, checked: bool, ) -> Result<Checkbox>

Create a Checkbox with initial checked state

Examples found in repository?
examples/checkbox_demo_v2.rs (line 50)
33fn main() -> Result<()> {
34    println!("=== Checkbox 复选框演示 (新库版本) ===\n");
35    
36    // 创建 Activity(对话框模式)
37    let mut activity = Activity::new(true)?;
38    println!("✓ 连接建立\n");
39    
40    // 创建主布局
41    let layout = activity.create_linear_layout(None)?;
42    
43    // 创建标题
44    let title = activity.create_text_view("选择你喜欢的功能 ✅", Some(layout.id()))?;
45    title.set_text_size(&mut activity, 26)?;
46    title.view().set_margin(&mut activity, 10)?;
47    title.view().set_height_wrap_content(&mut activity)?;
48    
49    // 创建 Checkbox 1 - WiFi (初始未选中)
50    let checkbox1 = activity.create_checkbox_checked("📶 WiFi", Some(layout.id()), false)?;
51    checkbox1.view().set_margin(&mut activity, 5)?;
52    checkbox1.view().set_height_wrap_content(&mut activity)?;
53    
54    // 创建 Checkbox 2 - 蓝牙 (初始选中)
55    let checkbox2 = activity.create_checkbox_checked("📡 蓝牙", Some(layout.id()), true)?;
56    checkbox2.view().set_margin(&mut activity, 5)?;
57    checkbox2.view().set_height_wrap_content(&mut activity)?;
58    
59    // 创建 Checkbox 3 - 定位 (初始未选中)
60    let checkbox3 = activity.create_checkbox_checked("📍 定位服务", Some(layout.id()), false)?;
61    checkbox3.view().set_margin(&mut activity, 5)?;
62    checkbox3.view().set_height_wrap_content(&mut activity)?;
63    
64    // 创建 Checkbox 4 - 通知 (初始选中)
65    let checkbox4 = activity.create_checkbox_checked("🔔 通知", Some(layout.id()), true)?;
66    checkbox4.view().set_margin(&mut activity, 5)?;
67    checkbox4.view().set_height_wrap_content(&mut activity)?;
68    
69    // 创建分隔线
70    let separator = activity.create_text_view("━━━━━━━━━━━━━━━━━━━━", Some(layout.id()))?;
71    separator.view().set_height_wrap_content(&mut activity)?;
72    
73    // 创建状态显示
74    let status = activity.create_text_view("当前选中: 蓝牙, 通知", Some(layout.id()))?;
75    status.view().set_margin(&mut activity, 10)?;
76    status.view().set_height_wrap_content(&mut activity)?;
77    status.set_text_color(&mut activity, 0xFF2196F3u32 as i32)?;
78    
79    // 创建按钮
80    let apply_button = activity.create_button("✅ 应用设置", Some(layout.id()))?;
81    apply_button.view().set_margin(&mut activity, 10)?;
82    apply_button.view().set_height_wrap_content(&mut activity)?;
83    
84    println!("✓ 界面创建完成\n");
85    println!("━━━━━━━━━━━━━━━━━━━━━━");
86    println!("提示:");
87    println!("  • 点击复选框切换状态");
88    println!("  • 观察状态实时更新");
89    println!("  • 点击 '应用设置' 查看最终选择");
90    println!("━━━━━━━━━━━━━━━━━━━━━━\n");
91    
92    // 状态跟踪
93    let mut wifi_checked = false;
94    let mut bluetooth_checked = true;
95    let mut location_checked = false;
96    let mut notification_checked = true;
97    
98    // 事件循环
99    loop {
100        let event = read_message(activity.event_stream())?;
101        let event_type = event["type"].as_str().unwrap_or("");
102        let event_value = &event["value"];
103        
104        match event_type {
105            "destroy" => {
106                // Activity 已被系统销毁,直接退出即可
107                // 不要调用 activity.finish(),因为 Activity 已经不存在了
108                println!("\n✓ Activity 已关闭");
109                return Ok(());
110            },
111            "click" => {
112                let clicked_id = event_value["id"].as_i64().unwrap_or(-1);
113                let is_checked = event_value["set"].as_bool().unwrap_or(false);
114                
115                if clicked_id == checkbox1.id() {
116                    wifi_checked = is_checked;
117                    println!("📶 WiFi: {}", if is_checked { "开启" } else { "关闭" });
118                    update_status_text(&mut activity, &status, 
119                                     wifi_checked, bluetooth_checked, 
120                                     location_checked, notification_checked)?;
121                    
122                } else if clicked_id == checkbox2.id() {
123                    bluetooth_checked = is_checked;
124                    println!("📡 蓝牙: {}", if is_checked { "开启" } else { "关闭" });
125                    update_status_text(&mut activity, &status, 
126                                     wifi_checked, bluetooth_checked, 
127                                     location_checked, notification_checked)?;
128                    
129                } else if clicked_id == checkbox3.id() {
130                    location_checked = is_checked;
131                    println!("📍 定位: {}", if is_checked { "开启" } else { "关闭" });
132                    update_status_text(&mut activity, &status, 
133                                     wifi_checked, bluetooth_checked, 
134                                     location_checked, notification_checked)?;
135                    
136                } else if clicked_id == checkbox4.id() {
137                    notification_checked = is_checked;
138                    println!("🔔 通知: {}", if is_checked { "开启" } else { "关闭" });
139                    update_status_text(&mut activity, &status, 
140                                     wifi_checked, bluetooth_checked, 
141                                     location_checked, notification_checked)?;
142                    
143                } else if clicked_id == apply_button.id() {
144                    println!("\n✅ 应用设置:");
145                    println!("  WiFi: {}", if wifi_checked { "✓" } else { "✗" });
146                    println!("  蓝牙: {}", if bluetooth_checked { "✓" } else { "✗" });
147                    println!("  定位: {}", if location_checked { "✓" } else { "✗" });
148                    println!("  通知: {}", if notification_checked { "✓" } else { "✗" });
149                    
150                    // 显示确认消息
151                    status.set_text(&mut activity, "✅ 设置已应用!")?;
152                    status.set_text_color(&mut activity, 0xFF4CAF50u32 as i32)?;
153                }
154            },
155            _ => {}
156        }
157    }
158}
Source

pub fn create_switch( &mut self, text: &str, parent: Option<i64>, ) -> Result<Switch>

Create a Switch

Source

pub fn create_switch_checked( &mut self, text: &str, parent: Option<i64>, checked: bool, ) -> Result<Switch>

Create a Switch with specified checked state

Examples found in repository?
examples/switch_demo_v2.rs (line 72)
48fn main() -> Result<()> {
49    println!("=== Switch 开关演示 (新库版本) ===\n");
50    
51    // 创建 Activity(对话框模式)
52    let mut activity = Activity::new(true)?;
53    println!("✓ 连接建立\n");
54    
55    // 创建主布局
56    let layout = activity.create_linear_layout(None)?;
57    
58    // 创建标题
59    let title = activity.create_text_view("智能家居控制 🏠", Some(layout.id()))?;
60    title.set_text_size(&mut activity, 28)?;
61    title.view().set_margin(&mut activity, 10)?;
62    title.view().set_height_wrap_content(&mut activity)?;
63    title.view().set_linear_layout_params(&mut activity, 0, None)?;
64    
65    // 创建说明
66    let desc = activity.create_text_view("滑动开关控制设备", Some(layout.id()))?;
67    desc.view().set_margin(&mut activity, 5)?;
68    desc.view().set_height_wrap_content(&mut activity)?;
69    desc.view().set_linear_layout_params(&mut activity, 0, None)?;
70    
71    // 创建 Switch 1 - 客厅灯(初始开启)
72    let switch1 = activity.create_switch_checked("💡 客厅灯", Some(layout.id()), true)?;
73    switch1.view().set_margin(&mut activity, 8)?;
74    switch1.view().set_height_wrap_content(&mut activity)?;
75    switch1.view().set_linear_layout_params(&mut activity, 0, None)?;
76    
77    // 创建 Switch 2 - 空调(初始关闭)
78    let switch2 = activity.create_switch_checked("❄️ 空调", Some(layout.id()), false)?;
79    switch2.view().set_margin(&mut activity, 8)?;
80    switch2.view().set_height_wrap_content(&mut activity)?;
81    switch2.view().set_linear_layout_params(&mut activity, 0, None)?;
82    
83    // 创建 Switch 3 - 加湿器(初始关闭)
84    let switch3 = activity.create_switch_checked("💧 加湿器", Some(layout.id()), false)?;
85    switch3.view().set_margin(&mut activity, 8)?;
86    switch3.view().set_height_wrap_content(&mut activity)?;
87    switch3.view().set_linear_layout_params(&mut activity, 0, None)?;
88    
89    // 创建 Switch 4 - 窗帘(初始开启)
90    let switch4 = activity.create_switch_checked("🪟 电动窗帘", Some(layout.id()), true)?;
91    switch4.view().set_margin(&mut activity, 8)?;
92    switch4.view().set_height_wrap_content(&mut activity)?;
93    switch4.view().set_linear_layout_params(&mut activity, 0, None)?;
94    
95    // 创建 Switch 5 - 音乐(初始关闭)
96    let switch5 = activity.create_switch_checked("🎵 背景音乐", Some(layout.id()), false)?;
97    switch5.view().set_margin(&mut activity, 8)?;
98    switch5.view().set_height_wrap_content(&mut activity)?;
99    switch5.view().set_linear_layout_params(&mut activity, 0, None)?;
100    
101    // 创建分隔线
102    let divider = activity.create_text_view("━━━━━━━━━━━━━━━━━━━━", Some(layout.id()))?;
103    divider.view().set_margin(&mut activity, 10)?;
104    divider.view().set_height_wrap_content(&mut activity)?;
105    divider.view().set_linear_layout_params(&mut activity, 0, None)?;
106    
107    // 创建状态显示
108    let status = activity.create_text_view("已开启: 客厅灯, 窗帘", Some(layout.id()))?;
109    status.set_text_size(&mut activity, 16)?;
110    status.view().set_margin(&mut activity, 10)?;
111    status.view().set_height_wrap_content(&mut activity)?;
112    status.view().set_linear_layout_params(&mut activity, 0, None)?;
113    status.set_text_color(&mut activity, 0xFF4CAF50u32 as i32)?;
114    
115    // 创建按钮布局(水平)
116    let button_layout = activity.create_linear_layout_horizontal(Some(layout.id()))?;
117    button_layout.view().set_margin(&mut activity, 10)?;
118    button_layout.view().set_height_wrap_content(&mut activity)?;
119    button_layout.view().set_linear_layout_params(&mut activity, 0, None)?;
120    
121    // 创建全部开启按钮
122    let all_on_btn = activity.create_button("🔆 全部开启", Some(button_layout.id()))?;
123    all_on_btn.view().set_linear_layout_params(&mut activity, 1, None)?;
124    
125    // 创建全部关闭按钮
126    let all_off_btn = activity.create_button("🌙 全部关闭", Some(button_layout.id()))?;
127    all_off_btn.view().set_linear_layout_params(&mut activity, 1, None)?;
128    
129    println!("✓ 界面创建完成\n");
130    println!("━━━━━━━━━━━━━━━━━━━━━━");
131    println!("提示:");
132    println!("  • 滑动开关切换设备状态");
133    println!("  • 观察状态实时更新");
134    println!("  • 使用 '全部开启/关闭' 按钮");
135    println!("━━━━━━━━━━━━━━━━━━━━━━\n");
136    
137    // 状态跟踪
138    let mut light_on = true;
139    let mut ac_on = false;
140    let mut humidifier_on = false;
141    let mut curtain_on = true;
142    let mut music_on = false;
143    
144    // 事件循环
145    loop {
146        let event = read_message(activity.event_stream())?;
147        let event_type = event["type"].as_str().unwrap_or("");
148        let event_value = &event["value"];
149        
150        match event_type {
151            "destroy" => {
152                // Activity 已被系统销毁,直接退出即可
153                // 不要调用 activity.finish(),因为 Activity 已经不存在了
154                println!("\n✓ Activity 已关闭");
155                return Ok(());
156            },
157            "click" => {
158                let clicked_id = event_value["id"].as_i64().unwrap_or(-1);
159                let is_checked = event_value["set"].as_bool().unwrap_or(false);
160                
161                if clicked_id == switch1.id() {
162                    light_on = is_checked;
163                    println!("💡 客厅灯: {}", if is_checked { "开启" } else { "关闭" });
164                } else if clicked_id == switch2.id() {
165                    ac_on = is_checked;
166                    println!("❄️ 空调: {}", if is_checked { "开启" } else { "关闭" });
167                } else if clicked_id == switch3.id() {
168                    humidifier_on = is_checked;
169                    println!("💧 加湿器: {}", if is_checked { "开启" } else { "关闭" });
170                } else if clicked_id == switch4.id() {
171                    curtain_on = is_checked;
172                    println!("🪟 窗帘: {}", if is_checked { "打开" } else { "关闭" });
173                } else if clicked_id == switch5.id() {
174                    music_on = is_checked;
175                    println!("🎵 音乐: {}", if is_checked { "播放" } else { "停止" });
176                } else if clicked_id == all_on_btn.id() {
177                    println!("\n🔆 全部开启");
178                    light_on = true;
179                    ac_on = true;
180                    humidifier_on = true;
181                    curtain_on = true;
182                    music_on = true;
183                    
184                    switch1.set_checked(&mut activity, true)?;
185                    switch2.set_checked(&mut activity, true)?;
186                    switch3.set_checked(&mut activity, true)?;
187                    switch4.set_checked(&mut activity, true)?;
188                    switch5.set_checked(&mut activity, true)?;
189                } else if clicked_id == all_off_btn.id() {
190                    println!("\n🌙 全部关闭");
191                    light_on = false;
192                    ac_on = false;
193                    humidifier_on = false;
194                    curtain_on = false;
195                    music_on = false;
196                    
197                    switch1.set_checked(&mut activity, false)?;
198                    switch2.set_checked(&mut activity, false)?;
199                    switch3.set_checked(&mut activity, false)?;
200                    switch4.set_checked(&mut activity, false)?;
201                    switch5.set_checked(&mut activity, false)?;
202                }
203                
204                update_status(&mut activity, &status, 
205                            light_on, ac_on, humidifier_on, curtain_on, music_on)?;
206            },
207            _ => {}
208        }
209    }
210}
Source

pub fn create_radio_button( &mut self, text: &str, parent: Option<i64>, ) -> Result<RadioButton>

Create a RadioButton

Source

pub fn create_radio_button_checked( &mut self, text: &str, parent: Option<i64>, checked: bool, ) -> Result<RadioButton>

Create a RadioButton with specified checked state

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

pub fn create_radio_group(&mut self, parent: Option<i64>) -> Result<RadioGroup>

Create a RadioGroup

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

pub fn create_spinner(&mut self, parent: Option<i64>) -> Result<Spinner>

Create a Spinner

Examples found in repository?
examples/spinner_demo_v2.rs (line 36)
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 create_image_view(&mut self, parent: Option<i64>) -> Result<ImageView>

Create an ImageView

Examples found in repository?
examples/image_demo_v2.rs (line 36)
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}
Source

pub fn create_progress_bar( &mut self, parent: Option<i64>, ) -> Result<ProgressBar>

Create a ProgressBar

Examples found in repository?
examples/progress_demo_v2.rs (line 43)
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}
Source

pub fn create_toggle_button( &mut self, text: &str, parent: Option<i64>, ) -> Result<ToggleButton>

Create a ToggleButton

Examples found in repository?
examples/grid_layout_demo_v2.rs (line 109)
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}
Source

pub fn create_toggle_button_checked( &mut self, text: &str, parent: Option<i64>, checked: bool, ) -> Result<ToggleButton>

Create a ToggleButton with specified checked state

Examples found in repository?
examples/toggle_demo_v2.rs (line 32)
8fn main() -> Result<()> {
9    println!("=== ToggleButton 切换按钮演示 (新库版本) ===\n");
10    
11    // 创建 Activity(对话框模式)
12    let mut activity = Activity::new(true)?;
13    println!("✓ 连接建立\n");
14    
15    // 创建主布局
16    let layout = activity.create_linear_layout(None)?;
17    
18    // 创建标题
19    let title = activity.create_text_view("🔘 ToggleButton 演示", Some(layout.id()))?;
20    title.set_text_size(&mut activity, 26)?;
21    title.view().set_margin(&mut activity, 10)?;
22    title.view().set_height_wrap_content(&mut activity)?;
23    title.view().set_linear_layout_params(&mut activity, 0, None)?;
24    
25    // 创建说明
26    let desc = activity.create_text_view("ToggleButton 是带开关状态的按钮", Some(layout.id()))?;
27    desc.view().set_margin(&mut activity, 5)?;
28    desc.view().set_height_wrap_content(&mut activity)?;
29    desc.view().set_linear_layout_params(&mut activity, 0, None)?;
30    
31    // 创建 ToggleButton 1 - WiFi(关闭)
32    let toggle1 = activity.create_toggle_button_checked("📶 WiFi", Some(layout.id()), false)?;
33    toggle1.view().set_margin(&mut activity, 8)?;
34    toggle1.view().set_height_wrap_content(&mut activity)?;
35    toggle1.view().set_linear_layout_params(&mut activity, 0, None)?;
36    
37    // 创建 ToggleButton 2 - 蓝牙(开启)
38    let toggle2 = activity.create_toggle_button_checked("📡 蓝牙", Some(layout.id()), true)?;
39    toggle2.view().set_margin(&mut activity, 8)?;
40    toggle2.view().set_height_wrap_content(&mut activity)?;
41    toggle2.view().set_linear_layout_params(&mut activity, 0, None)?;
42    
43    // 创建 ToggleButton 3 - GPS(关闭)
44    let toggle3 = activity.create_toggle_button_checked("🛰️ GPS", Some(layout.id()), false)?;
45    toggle3.view().set_margin(&mut activity, 8)?;
46    toggle3.view().set_height_wrap_content(&mut activity)?;
47    toggle3.view().set_linear_layout_params(&mut activity, 0, None)?;
48    
49    // 创建 ToggleButton 4 - 飞行模式(关闭)
50    let toggle4 = activity.create_toggle_button_checked("✈️ 飞行模式", Some(layout.id()), false)?;
51    toggle4.view().set_margin(&mut activity, 8)?;
52    toggle4.view().set_height_wrap_content(&mut activity)?;
53    toggle4.view().set_linear_layout_params(&mut activity, 0, None)?;
54    
55    // 创建分隔线
56    let divider = activity.create_text_view("━━━━━━━━━━━━━━━━━━━━", Some(layout.id()))?;
57    divider.view().set_margin(&mut activity, 10)?;
58    divider.view().set_height_wrap_content(&mut activity)?;
59    divider.view().set_linear_layout_params(&mut activity, 0, None)?;
60    
61    // 创建状态显示
62    let status = activity.create_text_view("当前开启: 蓝牙", Some(layout.id()))?;
63    status.view().set_margin(&mut activity, 10)?;
64    status.view().set_height_wrap_content(&mut activity)?;
65    status.view().set_linear_layout_params(&mut activity, 0, None)?;
66    status.set_text_color(&mut activity, 0xFF2196F3u32 as i32)?;
67    
68    // 创建按钮布局
69    let button_layout = activity.create_linear_layout_horizontal(Some(layout.id()))?;
70    button_layout.view().set_margin(&mut activity, 10)?;
71    button_layout.view().set_height_wrap_content(&mut activity)?;
72    button_layout.view().set_linear_layout_params(&mut activity, 0, None)?;
73    
74    let all_on_btn = activity.create_button("🔆 全部开启", Some(button_layout.id()))?;
75    all_on_btn.view().set_linear_layout_params(&mut activity, 1, None)?;
76    
77    let all_off_btn = activity.create_button("🌙 全部关闭", Some(button_layout.id()))?;
78    all_off_btn.view().set_linear_layout_params(&mut activity, 1, None)?;
79    
80    println!("✓ 界面创建完成\n");
81    println!("━━━━━━━━━━━━━━━━━━━━━━");
82    println!("提示:");
83    println!("  • 点击 ToggleButton 切换状态");
84    println!("  • ToggleButton 开启时按钮会凹陷");
85    println!("  • 使用按钮控制全部开关");
86    println!("━━━━━━━━━━━━━━━━━━━━━━\n");
87    
88    // 状态跟踪
89    let mut wifi_on = false;
90    let mut bluetooth_on = true;
91    let mut gps_on = false;
92    let mut airplane_on = false;
93    
94    // 更新状态显示的辅助函数
95    let update_status = |activity: &mut Activity, 
96                         status: &TextView,
97                         wifi: bool, 
98                         bt: bool, 
99                         gps: bool, 
100                         airplane: bool| -> Result<()> {
101        let mut active = Vec::new();
102        if wifi { active.push("WiFi"); }
103        if bt { active.push("蓝牙"); }
104        if gps { active.push("GPS"); }
105        if airplane { active.push("飞行模式"); }
106        
107        let text = if active.is_empty() {
108            "当前开启: 无".to_string()
109        } else {
110            format!("当前开启: {}", active.join(", "))
111        };
112        
113        status.set_text(activity, &text)?;
114        
115        // 如果开启飞行模式,文字显示橙色警告
116        let color = if airplane {
117            0xFFFF9800u32 as i32  // 橙色
118        } else if active.is_empty() {
119            0xFF9E9E9Eu32 as i32  // 灰色
120        } else {
121            0xFF2196F3u32 as i32  // 蓝色
122        };
123        status.set_text_color(activity, color)?;
124        
125        Ok(())
126    };
127    
128    // 事件循环
129    loop {
130        let event = read_message(activity.event_stream())?;
131        let event_type = event["type"].as_str().unwrap_or("");
132        let event_value = &event["value"];
133        
134        match event_type {
135            "destroy" => {
136                // Activity 已被系统销毁,直接退出即可
137                println!("\n✓ Activity 已关闭");
138                return Ok(());
139            },
140            "click" => {
141                let clicked_id = event_value["id"].as_i64().unwrap_or(-1);
142                let is_checked = event_value["set"].as_bool().unwrap_or(false);
143                
144                if clicked_id == toggle1.id() {
145                    wifi_on = is_checked;
146                    println!("📶 WiFi: {}", if is_checked { "开启" } else { "关闭" });
147                } else if clicked_id == toggle2.id() {
148                    bluetooth_on = is_checked;
149                    println!("📡 蓝牙: {}", if is_checked { "开启" } else { "关闭" });
150                } else if clicked_id == toggle3.id() {
151                    gps_on = is_checked;
152                    println!("🛰️ GPS: {}", if is_checked { "开启" } else { "关闭" });
153                } else if clicked_id == toggle4.id() {
154                    airplane_on = is_checked;
155                    println!("✈️ 飞行模式: {}", if is_checked { "开启" } else { "关闭" });
156                } else if clicked_id == all_on_btn.id() {
157                    println!("\n🔆 全部开启");
158                    wifi_on = true;
159                    bluetooth_on = true;
160                    gps_on = true;
161                    airplane_on = true;
162                    
163                    toggle1.set_checked(&mut activity, true)?;
164                    toggle2.set_checked(&mut activity, true)?;
165                    toggle3.set_checked(&mut activity, true)?;
166                    toggle4.set_checked(&mut activity, true)?;
167                } else if clicked_id == all_off_btn.id() {
168                    println!("\n🌙 全部关闭");
169                    wifi_on = false;
170                    bluetooth_on = false;
171                    gps_on = false;
172                    airplane_on = false;
173                    
174                    toggle1.set_checked(&mut activity, false)?;
175                    toggle2.set_checked(&mut activity, false)?;
176                    toggle3.set_checked(&mut activity, false)?;
177                    toggle4.set_checked(&mut activity, false)?;
178                }
179                
180                update_status(&mut activity, &status, wifi_on, bluetooth_on, gps_on, airplane_on)?;
181            },
182            _ => {}
183        }
184    }
185}
Source

pub fn create_space(&mut self, parent: Option<i64>) -> Result<Space>

Create a Space (empty space for layout)

Examples found in repository?
examples/space_demo_v2.rs (line 39)
8fn main() -> Result<()> {
9    println!("=== Space 空白间隔演示 (新库版本) ===\n");
10    
11    // 创建 Activity(对话框模式)
12    let mut activity = Activity::new(true)?;
13    println!("✓ 连接建立\n");
14    
15    // 创建主布局
16    let layout = activity.create_linear_layout(None)?;
17    
18    // 创建标题
19    let title = activity.create_text_view("📐 Space 间隔演示", Some(layout.id()))?;
20    title.set_text_size(&mut activity, 26)?;
21    title.view().set_margin(&mut activity, 10)?;
22    title.view().set_height_wrap_content(&mut activity)?;
23    title.view().set_linear_layout_params(&mut activity, 0, None)?;
24    
25    // ========== 示例1: 固定高度的间隔 ==========
26    let section1 = activity.create_text_view("示例1: 固定高度间隔", Some(layout.id()))?;
27    section1.set_text_size(&mut activity, 18)?;
28    section1.view().set_margin(&mut activity, 10)?;
29    section1.view().set_height_wrap_content(&mut activity)?;
30    section1.view().set_linear_layout_params(&mut activity, 0, None)?;
31    section1.set_text_color(&mut activity, 0xFF2196F3u32 as i32)?;
32    
33    let text1a = activity.create_text_view("这是第一个元素", Some(layout.id()))?;
34    text1a.view().set_margin(&mut activity, 5)?;
35    text1a.view().set_height_wrap_content(&mut activity)?;
36    text1a.view().set_linear_layout_params(&mut activity, 0, None)?;
37    
38    // 创建一个 50dp 高度的 Space
39    let space1 = activity.create_space(Some(layout.id()))?;
40    space1.view().set_height(&mut activity, 50)?;
41    space1.view().set_linear_layout_params(&mut activity, 0, None)?;
42    
43    let text1b = activity.create_text_view("这是第二个元素(上方有50dp间隔)", Some(layout.id()))?;
44    text1b.view().set_margin(&mut activity, 5)?;
45    text1b.view().set_height_wrap_content(&mut activity)?;
46    text1b.view().set_linear_layout_params(&mut activity, 0, None)?;
47    
48    // ========== 示例2: 权重间隔(弹性空间)==========
49    let divider1 = activity.create_text_view("━━━━━━━━━━━━━━━━━━━━", Some(layout.id()))?;
50    divider1.view().set_margin(&mut activity, 10)?;
51    divider1.view().set_height_wrap_content(&mut activity)?;
52    divider1.view().set_linear_layout_params(&mut activity, 0, None)?;
53    
54    let section2 = activity.create_text_view("示例2: 权重间隔(填充剩余空间)", Some(layout.id()))?;
55    section2.set_text_size(&mut activity, 18)?;
56    section2.view().set_margin(&mut activity, 10)?;
57    section2.view().set_height_wrap_content(&mut activity)?;
58    section2.view().set_linear_layout_params(&mut activity, 0, None)?;
59    section2.set_text_color(&mut activity, 0xFF4CAF50u32 as i32)?;
60    
61    let text2a = activity.create_text_view("顶部内容", Some(layout.id()))?;
62    text2a.view().set_margin(&mut activity, 5)?;
63    text2a.view().set_height_wrap_content(&mut activity)?;
64    text2a.view().set_linear_layout_params(&mut activity, 0, None)?;
65    
66    // 创建一个 weight=1 的 Space,它会占据所有剩余空间
67    let space2 = activity.create_space(Some(layout.id()))?;
68    space2.view().set_linear_layout_params(&mut activity, 1, None)?;
69    
70    let text2b = activity.create_text_view("底部内容(被推到底部)", Some(layout.id()))?;
71    text2b.view().set_margin(&mut activity, 5)?;
72    text2b.view().set_height_wrap_content(&mut activity)?;
73    text2b.view().set_linear_layout_params(&mut activity, 0, None)?;
74    
75    // ========== 示例3: 水平间隔 ==========
76    let divider2 = activity.create_text_view("━━━━━━━━━━━━━━━━━━━━", Some(layout.id()))?;
77    divider2.view().set_margin(&mut activity, 10)?;
78    divider2.view().set_height_wrap_content(&mut activity)?;
79    divider2.view().set_linear_layout_params(&mut activity, 0, None)?;
80    
81    let section3 = activity.create_text_view("示例3: 水平间隔", Some(layout.id()))?;
82    section3.set_text_size(&mut activity, 18)?;
83    section3.view().set_margin(&mut activity, 10)?;
84    section3.view().set_height_wrap_content(&mut activity)?;
85    section3.view().set_linear_layout_params(&mut activity, 0, None)?;
86    section3.set_text_color(&mut activity, 0xFFFF9800u32 as i32)?;
87    
88    // 创建水平布局
89    let h_layout = activity.create_linear_layout_horizontal(Some(layout.id()))?;
90    h_layout.view().set_margin(&mut activity, 5)?;
91    h_layout.view().set_height_wrap_content(&mut activity)?;
92    h_layout.view().set_linear_layout_params(&mut activity, 0, None)?;
93    
94    let btn1 = activity.create_button("按钮1", Some(h_layout.id()))?;
95    btn1.view().set_linear_layout_params(&mut activity, 0, None)?;
96    
97    // 水平 Space,宽度30dp
98    let h_space = activity.create_space(Some(h_layout.id()))?;
99    h_space.view().set_width(&mut activity, 30)?;
100    h_space.view().set_linear_layout_params(&mut activity, 0, None)?;
101    
102    let btn2 = activity.create_button("按钮2", Some(h_layout.id()))?;
103    btn2.view().set_linear_layout_params(&mut activity, 0, None)?;
104    
105    // 弹性水平 Space(weight=1),把按钮3推到右边
106    let h_space2 = activity.create_space(Some(h_layout.id()))?;
107    h_space2.view().set_linear_layout_params(&mut activity, 1, None)?;
108    
109    let btn3 = activity.create_button("按钮3", Some(h_layout.id()))?;
110    btn3.view().set_linear_layout_params(&mut activity, 0, None)?;
111    
112    // ========== 底部说明 ==========
113    let divider3 = activity.create_text_view("━━━━━━━━━━━━━━━━━━━━", Some(layout.id()))?;
114    divider3.view().set_margin(&mut activity, 10)?;
115    divider3.view().set_height_wrap_content(&mut activity)?;
116    divider3.view().set_linear_layout_params(&mut activity, 0, None)?;
117    
118    let info = activity.create_text_view(
119        "💡 Space 用途:\n\
120        • 固定间隔:设置固定宽度/高度\n\
121        • 弹性间隔:使用 weight 填充空间\n\
122        • 推送元素:将元素推到边缘",
123        Some(layout.id())
124    )?;
125    info.view().set_margin(&mut activity, 10)?;
126    info.view().set_height_wrap_content(&mut activity)?;
127    info.view().set_linear_layout_params(&mut activity, 0, None)?;
128    info.set_text_color(&mut activity, 0xFF666666u32 as i32)?;
129    
130    println!("✓ 界面创建完成\n");
131    println!("━━━━━━━━━━━━━━━━━━━━━━");
132    println!("提示:");
133    println!("  • 观察不同类型的 Space 效果");
134    println!("  • Space 本身是不可见的");
135    println!("  • 使用 Space 可以精确控制布局");
136    println!("━━━━━━━━━━━━━━━━━━━━━━\n");
137    
138    // 事件循环
139    loop {
140        let event = read_message(activity.event_stream())?;
141        let event_type = event["type"].as_str().unwrap_or("");
142        let event_value = &event["value"];
143        
144        match event_type {
145            "destroy" => {
146                // Activity 已被系统销毁,直接退出即可
147                println!("\n✓ Activity 已关闭");
148                return Ok(());
149            },
150            "click" => {
151                let clicked_id = event_value["id"].as_i64().unwrap_or(-1);
152                
153                if clicked_id == btn1.id() {
154                    println!("点击了按钮1");
155                    info.set_text(&mut activity, "✅ 按钮1 被点击")?;
156                    info.set_text_color(&mut activity, 0xFF4CAF50u32 as i32)?;
157                } else if clicked_id == btn2.id() {
158                    println!("点击了按钮2");
159                    info.set_text(&mut activity, "✅ 按钮2 被点击(左侧有30dp间隔)")?;
160                    info.set_text_color(&mut activity, 0xFF2196F3u32 as i32)?;
161                } else if clicked_id == btn3.id() {
162                    println!("点击了按钮3");
163                    info.set_text(&mut activity, "✅ 按钮3 被点击(被弹性Space推到右边)")?;
164                    info.set_text_color(&mut activity, 0xFFFF9800u32 as i32)?;
165                }
166            },
167            _ => {}
168        }
169    }
170}
Source

pub fn create_frame_layout( &mut self, parent: Option<i64>, ) -> Result<FrameLayout>

Create a FrameLayout

Examples found in repository?
examples/frame_layout_demo_v2.rs (line 40)
8fn main() -> Result<()> {
9    println!("=== FrameLayout 帧布局演示 (新库版本) ===\n");
10    
11    // 创建 Activity(对话框模式)
12    let mut activity = Activity::new(true)?;
13    println!("✓ 连接建立\n");
14    
15    // 创建主布局
16    let layout = activity.create_linear_layout(None)?;
17    
18    // 创建标题
19    let title = activity.create_text_view("🎭 FrameLayout 演示", Some(layout.id()))?;
20    title.set_text_size(&mut activity, 26)?;
21    title.view().set_margin(&mut activity, 10)?;
22    title.view().set_height_wrap_content(&mut activity)?;
23    title.view().set_linear_layout_params(&mut activity, 0, None)?;
24    
25    // 创建说明
26    let desc = activity.create_text_view("FrameLayout 按添加顺序层叠显示子视图", Some(layout.id()))?;
27    desc.view().set_margin(&mut activity, 5)?;
28    desc.view().set_height_wrap_content(&mut activity)?;
29    desc.view().set_linear_layout_params(&mut activity, 0, None)?;
30    
31    // ========== 示例1: 简单层叠 ==========
32    let section1 = activity.create_text_view("示例1: 文本层叠", Some(layout.id()))?;
33    section1.set_text_size(&mut activity, 18)?;
34    section1.view().set_margin(&mut activity, 10)?;
35    section1.view().set_height_wrap_content(&mut activity)?;
36    section1.view().set_linear_layout_params(&mut activity, 0, None)?;
37    section1.set_text_color(&mut activity, 0xFF2196F3u32 as i32)?;
38    
39    // 创建一个 FrameLayout
40    let frame1 = activity.create_frame_layout(Some(layout.id()))?;
41    frame1.view().set_margin(&mut activity, 10)?;
42    frame1.view().set_height(&mut activity, 150)?;
43    frame1.view().set_width_match_parent(&mut activity)?;
44    frame1.view().set_linear_layout_params(&mut activity, 0, None)?;
45    
46    // 在 FrameLayout 中添加三个层叠的 TextView
47    // 第一层(底层)
48    let layer1 = activity.create_text_view("━━━━━━━━━━━━━━━━━━━━\n第一层(底层)", Some(frame1.id()))?;
49    layer1.set_text_size(&mut activity, 20)?;
50    layer1.view().set_margin(&mut activity, 5)?;
51    layer1.set_text_color(&mut activity, 0xFFFF5722u32 as i32)?;
52    
53    // 第二层(中层)- 稍微偏移
54    let layer2 = activity.create_text_view("\n\n  第二层(中层)", Some(frame1.id()))?;
55    layer2.set_text_size(&mut activity, 20)?;
56    layer2.view().set_margin(&mut activity, 5)?;
57    layer2.set_text_color(&mut activity, 0xFF4CAF50u32 as i32)?;
58    
59    // 第三层(顶层)- 更多偏移
60    let layer3 = activity.create_text_view("\n\n\n\n    第三层(顶层)", Some(frame1.id()))?;
61    layer3.set_text_size(&mut activity, 20)?;
62    layer3.view().set_margin(&mut activity, 5)?;
63    layer3.set_text_color(&mut activity, 0xFF2196F3u32 as i32)?;
64    
65    // ========== 示例2: 按钮叠加 ==========
66    let divider1 = activity.create_text_view("━━━━━━━━━━━━━━━━━━━━", Some(layout.id()))?;
67    divider1.view().set_margin(&mut activity, 10)?;
68    divider1.view().set_height_wrap_content(&mut activity)?;
69    divider1.view().set_linear_layout_params(&mut activity, 0, None)?;
70    
71    let section2 = activity.create_text_view("示例2: 按钮居中叠加", Some(layout.id()))?;
72    section2.set_text_size(&mut activity, 18)?;
73    section2.view().set_margin(&mut activity, 10)?;
74    section2.view().set_height_wrap_content(&mut activity)?;
75    section2.view().set_linear_layout_params(&mut activity, 0, None)?;
76    section2.set_text_color(&mut activity, 0xFF4CAF50u32 as i32)?;
77    
78    // 创建第二个 FrameLayout
79    let frame2 = activity.create_frame_layout(Some(layout.id()))?;
80    frame2.view().set_margin(&mut activity, 10)?;
81    frame2.view().set_height(&mut activity, 200)?;
82    frame2.view().set_width_match_parent(&mut activity)?;
83    frame2.view().set_linear_layout_params(&mut activity, 0, None)?;
84    
85    // 背景文本
86    let bg_text = activity.create_text_view("这是背景文本\n\n下面有一个居中的按钮\n\n点击试试", Some(frame2.id()))?;
87    bg_text.set_text_size(&mut activity, 16)?;
88    bg_text.view().set_margin(&mut activity, 10)?;
89    bg_text.set_text_color(&mut activity, 0xFF999999u32 as i32)?;
90    
91    // 居中按钮(通过在 FrameLayout 中居中)
92    // 注意:FrameLayout 默认将子视图居中对齐
93    let center_btn = activity.create_button("点我!", Some(frame2.id()))?;
94    center_btn.view().set_margin(&mut activity, 80)?;  // 添加边距让按钮看起来居中
95    
96    // ========== 底部信息 ==========
97    let divider2 = activity.create_text_view("━━━━━━━━━━━━━━━━━━━━", Some(layout.id()))?;
98    divider2.view().set_margin(&mut activity, 10)?;
99    divider2.view().set_height_wrap_content(&mut activity)?;
100    divider2.view().set_linear_layout_params(&mut activity, 0, None)?;
101    
102    let info = activity.create_text_view(
103        "💡 FrameLayout 特点:\n\
104        • 子视图按添加顺序层叠\n\
105        • 后添加的视图在上层\n\
106        • 适合创建叠加效果\n\
107        • 可以实现简单的 Z 轴布局",
108        Some(layout.id())
109    )?;
110    info.view().set_margin(&mut activity, 10)?;
111    info.view().set_height_wrap_content(&mut activity)?;
112    info.view().set_linear_layout_params(&mut activity, 0, None)?;
113    info.set_text_color(&mut activity, 0xFF666666u32 as i32)?;
114    
115    // 状态显示
116    let status = activity.create_text_view("准备就绪", Some(layout.id()))?;
117    status.view().set_margin(&mut activity, 10)?;
118    status.view().set_height_wrap_content(&mut activity)?;
119    status.view().set_linear_layout_params(&mut activity, 0, None)?;
120    status.set_text_color(&mut activity, 0xFF2196F3u32 as i32)?;
121    
122    println!("✓ 界面创建完成\n");
123    println!("━━━━━━━━━━━━━━━━━━━━━━");
124    println!("提示:");
125    println!("  • 观察三层文本的层叠效果");
126    println!("  • 点击示例2中的居中按钮");
127    println!("  • FrameLayout 中后添加的元素在上层");
128    println!("━━━━━━━━━━━━━━━━━━━━━━\n");
129    
130    let mut click_count = 0;
131    
132    // 事件循环
133    loop {
134        let event = read_message(activity.event_stream())?;
135        let event_type = event["type"].as_str().unwrap_or("");
136        let event_value = &event["value"];
137        
138        match event_type {
139            "destroy" => {
140                // Activity 已被系统销毁,直接退出即可
141                println!("\n✓ Activity 已关闭");
142                return Ok(());
143            },
144            "click" => {
145                let clicked_id = event_value["id"].as_i64().unwrap_or(-1);
146                
147                if clicked_id == center_btn.id() {
148                    click_count += 1;
149                    println!("✅ 居中按钮被点击!(第{}次)", click_count);
150                    
151                    let messages = [
152                        "✅ 第一次点击!很好!",
153                        "👍 第二次点击!继续!",
154                        "🎉 第三次点击!太棒了!",
155                        "🌟 第四次点击!你很厉害!",
156                        "🏆 第五次点击!大师级别!",
157                    ];
158                    
159                    let msg = if click_count <= 5 {
160                        messages[click_count - 1]
161                    } else {
162                        "🎊 你已经是专家了!"
163                    };
164                    
165                    status.set_text(&mut activity, &format!("{} (点击{}次)", msg, click_count))?;
166                    
167                    // 根据点击次数改变颜色
168                    let color = match click_count % 5 {
169                        1 => 0xFF4CAF50u32 as i32,  // 绿色
170                        2 => 0xFF2196F3u32 as i32,  // 蓝色
171                        3 => 0xFFFF9800u32 as i32,  // 橙色
172                        4 => 0xFF9C27B0u32 as i32,  // 紫色
173                        _ => 0xFFF44336u32 as i32,  // 红色
174                    };
175                    status.set_text_color(&mut activity, color)?;
176                }
177            },
178            _ => {}
179        }
180    }
181}
Source

pub fn create_grid_layout( &mut self, rows: i32, cols: i32, parent: Option<i64>, ) -> Result<GridLayout>

Create a GridLayout with specified rows and columns

Examples found in repository?
examples/grid_layout_demo_v2.rs (line 44)
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}
Source

pub fn create_horizontal_scroll_view( &mut self, parent: Option<i64>, ) -> Result<HorizontalScrollView>

Create a HorizontalScrollView

Examples found in repository?
examples/horizontal_scroll_demo_v2.rs (line 41)
8fn main() -> Result<()> {
9    println!("=== HorizontalScrollView 水平滚动演示 (新库版本) ===\n");
10    
11    // 创建 Activity(全屏模式)
12    let mut activity = Activity::new(false)?;
13    println!("✓ 连接建立\n");
14    
15    // 创建主垂直布局
16    let main_layout = activity.create_linear_layout(None)?;
17    main_layout.view().set_margin(&mut activity, 15)?;
18    
19    // 创建标题
20    let title = activity.create_text_view("↔️ HorizontalScrollView 演示", Some(main_layout.id()))?;
21    title.set_text_size(&mut activity, 26)?;
22    title.view().set_margin(&mut activity, 10)?;
23    title.view().set_height_wrap_content(&mut activity)?;
24    title.view().set_linear_layout_params(&mut activity, 0, None)?;
25    
26    // 创建说明
27    let desc = activity.create_text_view("左右滑动查看更多按钮", Some(main_layout.id()))?;
28    desc.view().set_margin(&mut activity, 5)?;
29    desc.view().set_height_wrap_content(&mut activity)?;
30    desc.view().set_linear_layout_params(&mut activity, 0, None)?;
31    
32    // ========== 第一行: 水果按钮 ==========
33    let section1 = activity.create_text_view("第一行: 水果按钮(左右滑动)", Some(main_layout.id()))?;
34    section1.set_text_size(&mut activity, 18)?;
35    section1.view().set_margin(&mut activity, 10)?;
36    section1.view().set_height_wrap_content(&mut activity)?;
37    section1.view().set_linear_layout_params(&mut activity, 0, None)?;
38    section1.set_text_color(&mut activity, 0xFF2196F3u32 as i32)?;
39    
40    // 创建第一个 HorizontalScrollView
41    let h_scroll1 = activity.create_horizontal_scroll_view(Some(main_layout.id()))?;
42    h_scroll1.view().set_margin(&mut activity, 10)?;
43    h_scroll1.view().set_height_wrap_content(&mut activity)?;
44    h_scroll1.view().set_linear_layout_params(&mut activity, 0, None)?;
45    
46    // 在 HorizontalScrollView 内创建水平 LinearLayout
47    let h_layout1 = activity.create_linear_layout_horizontal(Some(h_scroll1.id()))?;
48    h_layout1.view().set_height_wrap_content(&mut activity)?;
49    
50    // 添加10个水果按钮
51    let fruits = ["🍎 苹果", "🍊 橙子", "🍌 香蕉", "🍇 葡萄", "🍓 草莓", 
52                  "🍑 桃子", "🍒 樱桃", "🍍 菠萝", "🥝 猕猴桃", "🥭 芒果"];
53    let mut fruit_buttons = Vec::new();
54    for fruit in &fruits {
55        let btn = activity.create_button(fruit, Some(h_layout1.id()))?;
56        btn.view().set_width(&mut activity, 180)?;  // 固定宽度180dp
57        btn.view().set_margin(&mut activity, 5)?;
58        fruit_buttons.push(btn);
59    }
60    
61    // ========== 第二行: 数字按钮 ==========
62    let section2 = activity.create_text_view("第二行: 数字按钮(左右滑动)", Some(main_layout.id()))?;
63    section2.set_text_size(&mut activity, 18)?;
64    section2.view().set_margin(&mut activity, 10)?;
65    section2.view().set_height_wrap_content(&mut activity)?;
66    section2.view().set_linear_layout_params(&mut activity, 0, None)?;
67    section2.set_text_color(&mut activity, 0xFF4CAF50u32 as i32)?;
68    
69    // 创建第二个 HorizontalScrollView
70    let h_scroll2 = activity.create_horizontal_scroll_view(Some(main_layout.id()))?;
71    h_scroll2.view().set_margin(&mut activity, 10)?;
72    h_scroll2.view().set_height_wrap_content(&mut activity)?;
73    h_scroll2.view().set_linear_layout_params(&mut activity, 0, None)?;
74    
75    // 在 HorizontalScrollView 内创建水平 LinearLayout
76    let h_layout2 = activity.create_linear_layout_horizontal(Some(h_scroll2.id()))?;
77    h_layout2.view().set_height_wrap_content(&mut activity)?;
78    
79    // 添加20个数字按钮
80    let mut number_buttons = Vec::new();
81    for i in 0..20 {
82        let btn = activity.create_button(&format!("数字 {}", i * 5), Some(h_layout2.id()))?;
83        btn.view().set_width(&mut activity, 150)?;  // 固定宽度150dp
84        btn.view().set_margin(&mut activity, 5)?;
85        number_buttons.push(btn);
86    }
87    
88    // ========== 底部信息 ==========
89    let divider = activity.create_text_view("━━━━━━━━━━━━━━━━━━━━", Some(main_layout.id()))?;
90    divider.view().set_margin(&mut activity, 10)?;
91    divider.view().set_height_wrap_content(&mut activity)?;
92    divider.view().set_linear_layout_params(&mut activity, 0, None)?;
93    
94    let info = activity.create_text_view(
95        "💡 提示:\n\
96        • 在每一行中左右滑动\n\
97        • 点击任意按钮查看效果\n\
98        • HorizontalScrollView 支持水平滚动",
99        Some(main_layout.id())
100    )?;
101    info.view().set_margin(&mut activity, 10)?;
102    info.view().set_height_wrap_content(&mut activity)?;
103    info.view().set_linear_layout_params(&mut activity, 0, None)?;
104    info.set_text_color(&mut activity, 0xFF666666u32 as i32)?;
105    
106    // 状态显示
107    let status = activity.create_text_view("准备就绪 - 尝试左右滑动", Some(main_layout.id()))?;
108    status.view().set_margin(&mut activity, 10)?;
109    status.view().set_height_wrap_content(&mut activity)?;
110    status.view().set_linear_layout_params(&mut activity, 0, None)?;
111    status.set_text_color(&mut activity, 0xFF2196F3u32 as i32)?;
112    
113    println!("✓ 界面创建完成\n");
114    println!("━━━━━━━━━━━━━━━━━━━━━━");
115    println!("提示:");
116    println!("  • 第一行: 10个水果按钮");
117    println!("  • 第二行: 20个数字按钮");
118    println!("  • 左右滑动查看更多内容");
119    println!("━━━━━━━━━━━━━━━━━━━━━━\n");
120    
121    // 事件循环
122    loop {
123        let event = read_message(activity.event_stream())?;
124        let event_type = event["type"].as_str().unwrap_or("");
125        let event_value = &event["value"];
126        
127        match event_type {
128            "destroy" => {
129                println!("\n✓ Activity 已关闭");
130                return Ok(());
131            },
132            "click" => {
133                let clicked_id = event_value["id"].as_i64().unwrap_or(-1);
134                
135                // 检查水果按钮
136                for (i, btn) in fruit_buttons.iter().enumerate() {
137                    if clicked_id == btn.id() {
138                        println!("✅ 选择: {}", fruits[i]);
139                        status.set_text(&mut activity, &format!("✅ 选择: {}", fruits[i]))?;
140                        status.set_text_color(&mut activity, 0xFF4CAF50u32 as i32)?;
141                        break;
142                    }
143                }
144                
145                // 检查数字按钮
146                for (i, btn) in number_buttons.iter().enumerate() {
147                    if clicked_id == btn.id() {
148                        let value = i * 5;
149                        println!("🔢 选择数字: {}", value);
150                        status.set_text(&mut activity, &format!("🔢 选择数字: {}", value))?;
151                        status.set_text_color(&mut activity, 0xFFFF9800u32 as i32)?;
152                        break;
153                    }
154                }
155            },
156            _ => {}
157        }
158    }
159}
Source

pub fn create_swipe_refresh_layout( &mut self, parent: Option<i64>, ) -> Result<SwipeRefreshLayout>

Create a SwipeRefreshLayout

Examples found in repository?
examples/swipe_refresh_demo_v2.rs (line 18)
10fn main() -> Result<()> {
11    println!("=== SwipeRefreshLayout 下拉刷新演示 (新库版本) ===\n");
12    
13    // 创建 Activity(全屏模式)
14    let mut activity = Activity::new(false)?;
15    println!("✓ 连接建立\n");
16    
17    // 创建 SwipeRefreshLayout 作为根视图
18    let swipe_refresh = activity.create_swipe_refresh_layout(None)?;
19    
20    // 在 SwipeRefreshLayout 内创建 LinearLayout(只能有一个子视图)
21    let layout = activity.create_linear_layout(Some(swipe_refresh.id()))?;
22    // ⚠️ 重要:不要在SwipeRefreshLayout的直接子View上设置margin,会导致termux-gui崩溃!
23    // 可以在LinearLayout的子View上设置margin
24    
25    // 标题
26    let title = activity.create_text_view("🔄 下拉刷新演示", Some(layout.id()))?;
27    title.set_text_size(&mut activity, 26)?;
28    title.view().set_margin(&mut activity, 10)?;
29    title.view().set_height_wrap_content(&mut activity)?;
30    title.view().set_linear_layout_params(&mut activity, 0, None)?;
31    
32    // 说明
33    let desc = activity.create_text_view("向下拉动页面触发刷新", Some(layout.id()))?;
34    desc.view().set_margin(&mut activity, 5)?;
35    desc.view().set_height_wrap_content(&mut activity)?;
36    desc.view().set_linear_layout_params(&mut activity, 0, None)?;
37    
38    // 分隔线
39    let divider1 = activity.create_text_view("━━━━━━━━━━━━━━━━━━━━", Some(layout.id()))?;
40    divider1.view().set_margin(&mut activity, 10)?;
41    divider1.view().set_height_wrap_content(&mut activity)?;
42    divider1.view().set_linear_layout_params(&mut activity, 0, None)?;
43    
44    // 刷新计数器
45    let refresh_count = activity.create_text_view("刷新次数: 0", Some(layout.id()))?;
46    refresh_count.set_text_size(&mut activity, 24)?;
47    refresh_count.view().set_margin(&mut activity, 10)?;
48    refresh_count.view().set_height_wrap_content(&mut activity)?;
49    refresh_count.view().set_linear_layout_params(&mut activity, 0, None)?;
50    refresh_count.set_text_color(&mut activity, 0xFF2196F3u32 as i32)?;
51    
52    // 最后刷新时间
53    let last_time = activity.create_text_view("最后刷新: 尚未刷新", Some(layout.id()))?;
54    last_time.view().set_margin(&mut activity, 10)?;
55    last_time.view().set_height_wrap_content(&mut activity)?;
56    last_time.view().set_linear_layout_params(&mut activity, 0, None)?;
57    last_time.set_text_color(&mut activity, 0xFF666666u32 as i32)?;
58    
59    // 分隔线
60    let divider2 = activity.create_text_view("━━━━━━━━━━━━━━━━━━━━", Some(layout.id()))?;
61    divider2.view().set_margin(&mut activity, 10)?;
62    divider2.view().set_height_wrap_content(&mut activity)?;
63    divider2.view().set_linear_layout_params(&mut activity, 0, None)?;
64    
65    // 内容区域标题
66    let content_title = activity.create_text_view("📋 内容列表", Some(layout.id()))?;
67    content_title.set_text_size(&mut activity, 18)?;
68    content_title.view().set_margin(&mut activity, 10)?;
69    content_title.view().set_height_wrap_content(&mut activity)?;
70    content_title.view().set_linear_layout_params(&mut activity, 0, None)?;
71    content_title.set_text_color(&mut activity, 0xFF4CAF50u32 as i32)?;
72    
73    // 内容项
74    let item1 = activity.create_text_view("📄 项目 1", Some(layout.id()))?;
75    item1.view().set_margin(&mut activity, 8)?;
76    item1.view().set_height_wrap_content(&mut activity)?;
77    item1.view().set_linear_layout_params(&mut activity, 0, None)?;
78    
79    let item2 = activity.create_text_view("📄 项目 2", Some(layout.id()))?;
80    item2.view().set_margin(&mut activity, 8)?;
81    item2.view().set_height_wrap_content(&mut activity)?;
82    item2.view().set_linear_layout_params(&mut activity, 0, None)?;
83    
84    let item3 = activity.create_text_view("📄 项目 3", Some(layout.id()))?;
85    item3.view().set_margin(&mut activity, 8)?;
86    item3.view().set_height_wrap_content(&mut activity)?;
87    item3.view().set_linear_layout_params(&mut activity, 0, None)?;
88    
89    // 分隔线
90    let divider3 = activity.create_text_view("━━━━━━━━━━━━━━━━━━━━", Some(layout.id()))?;
91    divider3.view().set_margin(&mut activity, 10)?;
92    divider3.view().set_height_wrap_content(&mut activity)?;
93    divider3.view().set_linear_layout_params(&mut activity, 0, None)?;
94    
95    // 提示信息
96    let info = activity.create_text_view(
97        "💡 向下拉动页面刷新\n或点击下方按钮手动刷新",
98        Some(layout.id())
99    )?;
100    info.view().set_margin(&mut activity, 10)?;
101    info.view().set_height_wrap_content(&mut activity)?;
102    info.view().set_linear_layout_params(&mut activity, 0, None)?;
103    info.set_text_color(&mut activity, 0xFF999999u32 as i32)?;
104    
105    // 手动刷新按钮
106    let manual_btn = activity.create_button("🔄 手动刷新", Some(layout.id()))?;
107    manual_btn.view().set_margin(&mut activity, 10)?;
108    manual_btn.view().set_linear_layout_params(&mut activity, 0, None)?;
109    
110    println!("✓ 界面创建完成\n");
111    println!("━━━━━━━━━━━━━━━━━━━━━━");
112    println!("提示:");
113    println!("  • 向下拉动页面触发刷新");
114    println!("  • 或点击按钮手动刷新");
115    println!("━━━━━━━━━━━━━━━━━━━━━━\n");
116    
117    let mut refresh_counter = 0;
118    
119    // 事件循环
120    loop {
121        let event = read_message(activity.event_stream())?;
122        let event_type = event["type"].as_str().unwrap_or("");
123        let event_value = &event["value"];
124        
125        match event_type {
126            "destroy" => {
127                println!("\n✓ Activity 已关闭");
128                return Ok(());
129            },
130            "refresh" => {
131                println!("🔄 下拉刷新触发!");
132                
133                refresh_counter += 1;
134                refresh_count.set_text(&mut activity, &format!("刷新次数: {}", refresh_counter))?;
135                
136                // 更新时间
137                let now = std::time::SystemTime::now()
138                    .duration_since(std::time::UNIX_EPOCH)
139                    .unwrap()
140                    .as_secs();
141                last_time.set_text(&mut activity, &format!("最后刷新: {} 秒", now % 10000))?;
142                
143                // 更新内容项
144                item1.set_text(&mut activity, &format!("📄 项目 1 (刷新 #{})", refresh_counter))?;
145                item2.set_text(&mut activity, &format!("📄 项目 2 (刷新 #{})", refresh_counter))?;
146                item3.set_text(&mut activity, &format!("📄 项目 3 (刷新 #{})", refresh_counter))?;
147                
148                println!("⏳ 模拟加载中...");
149                thread::sleep(Duration::from_secs(2));
150                
151                swipe_refresh.set_refreshing(&mut activity, false)?;
152                println!("✅ 刷新完成!\n");
153            },
154            "click" => {
155                let clicked_id = event_value["id"].as_i64().unwrap_or(-1);
156                
157                if clicked_id == manual_btn.id() {
158                    println!("🔄 手动刷新触发!");
159                    
160                    swipe_refresh.set_refreshing(&mut activity, true)?;
161                    
162                    refresh_counter += 1;
163                    refresh_count.set_text(&mut activity, &format!("刷新次数: {}", refresh_counter))?;
164                    
165                    item1.set_text(&mut activity, &format!("📄 项目 1 (刷新 #{})", refresh_counter))?;
166                    item2.set_text(&mut activity, &format!("📄 项目 2 (刷新 #{})", refresh_counter))?;
167                    item3.set_text(&mut activity, &format!("📄 项目 3 (刷新 #{})", refresh_counter))?;
168                    
169                    println!("⏳ 模拟加载中...");
170                    thread::sleep(Duration::from_secs(2));
171                    
172                    swipe_refresh.set_refreshing(&mut activity, false)?;
173                    println!("✅ 刷新完成!\n");
174                }
175            },
176            _ => {}
177        }
178    }
179}
Source

pub fn create_tab_layout(&mut self, parent: Option<i64>) -> Result<TabLayout>

Create a TabLayout

Examples found in repository?
examples/tab_layout_demo_v2.rs (line 20)
9fn main() -> Result<()> {
10    println!("=== TabLayout 标签页演示 (新库版本) ===\n");
11
12    // 创建连接和 Activity
13    let mut activity = Activity::new(false)?;
14    println!("✓ 连接建立");
15
16    // 创建根布局(垂直)
17    let root = activity.create_linear_layout(None)?;
18    
19    // 创建 TabLayout(在顶部)
20    let tabs = activity.create_tab_layout(Some(root.id()))?;
21    tabs.view().set_linear_layout_params(&mut activity, 0, None)?;
22    tabs.view().set_height(&mut activity, -2)?; // WRAP_CONTENT
23    
24    // 设置标签列表
25    tabs.set_list(&mut activity, &["首页", "消息", "我的"])?;
26    
27    // 创建内容区域
28    let content_area = activity.create_linear_layout(Some(root.id()))?;
29    content_area.view().set_linear_layout_params(&mut activity, 1, None)?; // weight=1 占据剩余空间
30    
31    // 创建三个页面的内容(初始全部隐藏)
32    // 页面1 - 首页
33    let page1 = activity.create_linear_layout(Some(content_area.id()))?;
34    
35    let title1 = activity.create_text_view("📱 首页", Some(page1.id()))?;
36    title1.set_text_size(&mut activity, 28)?;
37    
38    let content1 = activity.create_text_view("\n欢迎使用 TabLayout!\n\n这是首页内容。\n\n☝️ 点击顶部标签切换页面", Some(page1.id()))?;
39    content1.set_text_size(&mut activity, 18)?;
40    
41    // 页面2 - 消息
42    let page2 = activity.create_linear_layout(Some(content_area.id()))?;
43    activity.send(&serde_json::json!({
44        "method": "setVisibility",
45        "params": {
46            "aid": activity.id(),
47            "id": page2.id(),
48            "vis": 8  // GONE initially
49        }
50    }))?;
51    
52    let title2 = activity.create_text_view("💬 消息中心", Some(page2.id()))?;
53    title2.set_text_size(&mut activity, 28)?;
54    
55    let content2 = activity.create_text_view("\n这是第二页\n\n你有 3 条新消息\n\n• 系统通知\n• 好友消息\n• 更新提醒", Some(page2.id()))?;
56    content2.set_text_size(&mut activity, 18)?;
57    
58    // 页面3 - 我的
59    let page3 = activity.create_linear_layout(Some(content_area.id()))?;
60    activity.send(&serde_json::json!({
61        "method": "setVisibility",
62        "params": {
63            "aid": activity.id(),
64            "id": page3.id(),
65            "vis": 8  // GONE initially
66        }
67    }))?;
68    
69    let title3 = activity.create_text_view("👤 个人中心", Some(page3.id()))?;
70    title3.set_text_size(&mut activity, 28)?;
71    
72    let content3 = activity.create_text_view("\n这是第三页\n\n个人信息\n\n• 账号设置\n• 隐私设置\n• 关于我们", Some(page3.id()))?;
73    content3.set_text_size(&mut activity, 18)?;
74    
75    println!("\n✓ 界面创建完成");
76    println!("\n━━━━━━━━━━━━━━━━━━━━━━");
77    println!("提示:");
78    println!("  • 点击顶部标签切换页面");
79    println!("  • 观察页面内容变化");
80    println!("━━━━━━━━━━━━━━━━━━━━━━\n");
81    
82    // 当前选中的标签页
83    let mut current_tab = 0;
84    let pages = [page1.id(), page2.id(), page3.id()];
85    
86    // 事件循环
87    loop {
88        let event = read_message(activity.event_stream())?;
89        let event_type = event["type"].as_str().unwrap_or("");
90        
91        match event_type {
92            "destroy" => {
93                println!("\n✓ Activity 已关闭");
94                return Ok(());
95            }
96            "itemselected" => {
97                // TabLayout 被点击
98                if let Some(selected) = event["value"]["selected"].as_i64() {
99                    if event["value"]["id"].as_i64() == Some(tabs.id()) {
100                        let new_tab = selected as usize;
101                        if new_tab != current_tab && new_tab < 3 {
102                            println!("切换到标签 {}: {}", new_tab, ["首页", "消息", "我的"][new_tab]);
103                            
104                            // 隐藏当前页面
105                            activity.send(&serde_json::json!({
106                                "method": "setVisibility",
107                                "params": {
108                                    "aid": activity.id(),
109                                    "id": pages[current_tab],
110                                    "vis": 8  // GONE
111                                }
112                            }))?;
113                            
114                            // 显示新页面
115                            activity.send(&serde_json::json!({
116                                "method": "setVisibility",
117                                "params": {
118                                    "aid": activity.id(),
119                                    "id": pages[new_tab],
120                                    "vis": 0  // VISIBLE
121                                }
122                            }))?;
123                            
124                            current_tab = new_tab;
125                        }
126                    }
127                }
128            }
129            _ => {}
130        }
131    }
132}
Source

pub fn create_web_view(&mut self, parent: Option<i64>) -> Result<WebView>

Create a WebView

Examples found in repository?
examples/webview_demo_v2.rs (line 45)
12fn main() -> Result<()> {
13    println!("=== WebView 网页视图演示 (新库版本) ===\n");
14    
15    // 创建 Activity
16    let mut activity = Activity::new(false)?;
17    println!("✓ 连接建立\n");
18    
19    // 创建根布局 (垂直)
20    let root = activity.create_linear_layout(None)?;
21    
22    // 标题文本
23    let title = activity.create_text_view("🌐 WebView 演示", Some(root.id()))?;
24    title.set_text_size(&mut activity, 20)?;
25    title.view().set_height_wrap_content(&mut activity)?;
26    title.view().set_margin(&mut activity, 16)?;
27    title.view().set_linear_layout_params(&mut activity, 0, None)?;
28    
29    // 提示文本
30    let hint = activity.create_text_view(
31        "━━━━━━━━━━━━━━━━━━━━━━\n\
32        演示步骤:\n\
33        1️⃣ 显示HTML内容 (3秒)\n\
34        2️⃣ 加载Google网页 (3秒)\n\
35        3️⃣ 请求JavaScript权限\n\
36        4️⃣ 执行JavaScript代码\n\
37        ━━━━━━━━━━━━━━━━━━━━━━", 
38        Some(root.id()))?;
39    hint.set_text_size(&mut activity, 14)?;
40    hint.view().set_height_wrap_content(&mut activity)?;
41    hint.view().set_margin(&mut activity, 16)?;
42    hint.view().set_linear_layout_params(&mut activity, 0, None)?;
43    
44    // 创建 WebView
45    let webview = activity.create_web_view(Some(root.id()))?;
46    webview.view().set_linear_layout_params(&mut activity, 1, None)?;  // 占据剩余空间
47    
48    println!("✓ 界面创建完成\n");
49    
50    // 演示流程
51    demo_workflow(&mut activity, &webview)?;
52    
53    println!("\n📌 等待用户关闭窗口...");
54    
55    // 事件循环
56    loop {
57        let event = read_message(activity.event_stream())?;
58        let event_type = event["type"].as_str().unwrap_or("");
59        
60        match event_type {
61            "destroy" => {
62                println!("\n✓ Activity 已关闭");
63                return Ok(());
64            },
65            _ => {}
66        }
67    }
68}
Source

pub fn set_title(&mut self, title: &str) -> Result<()>

Set the Activity title

Source

pub fn finish(&mut self) -> Result<()>

Finish (close) the Activity

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