pub struct ToggleButton { /* private fields */ }Expand description
A ToggleButton is a button that can be toggled on or off
Similar to Switch, but with a different visual style (button appearance).
Implementations§
Source§impl ToggleButton
impl ToggleButton
Sourcepub fn new(
activity: &mut Activity,
text: &str,
parent: Option<i64>,
) -> Result<Self>
pub fn new( activity: &mut Activity, text: &str, parent: Option<i64>, ) -> Result<Self>
Create a new ToggleButton (unchecked by default)
Sourcepub fn new_with_checked(
activity: &mut Activity,
text: &str,
parent: Option<i64>,
checked: bool,
) -> Result<Self>
pub fn new_with_checked( activity: &mut Activity, text: &str, parent: Option<i64>, checked: bool, ) -> Result<Self>
Create a new ToggleButton with specified checked state
Sourcepub fn id(&self) -> i64
pub fn id(&self) -> i64
Get the view ID
Examples found in repository?
examples/toggle_demo_v2.rs (line 144)
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}More examples
examples/grid_layout_demo_v2.rs (line 175)
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 view(&self) -> &View
pub fn view(&self) -> &View
Get the underlying View
Examples found in repository?
examples/toggle_demo_v2.rs (line 33)
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 set_text(&self, activity: &mut Activity, text: &str) -> Result<()>
pub fn set_text(&self, activity: &mut Activity, text: &str) -> Result<()>
Set the toggle button text
Sourcepub fn set_checked(&self, activity: &mut Activity, checked: bool) -> Result<()>
pub fn set_checked(&self, activity: &mut Activity, checked: bool) -> Result<()>
Set checked state
Examples found in repository?
examples/toggle_demo_v2.rs (line 163)
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}Auto Trait Implementations§
impl Freeze for ToggleButton
impl RefUnwindSafe for ToggleButton
impl Send for ToggleButton
impl Sync for ToggleButton
impl Unpin for ToggleButton
impl UnwindSafe for ToggleButton
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more