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