toggle_demo_v2/
toggle_demo_v2.rs

1// ToggleButton 切换按钮演示 - 使用新库 API
2// 展示如何使用 ToggleButton(类似Switch但样式不同)
3// 运行: cargo run --example toggle_demo_v2 --release
4
5use termux_gui::{Activity, TextView, Result};
6use termux_gui::connection::read_message;
7
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}