ToggleButton

Struct ToggleButton 

Source
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

Source

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

Create a new ToggleButton (unchecked by default)

Source

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

Source

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

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

pub fn set_text(&self, activity: &mut Activity, text: &str) -> Result<()>

Set the toggle button text

Source

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§

Blanket Implementations§

Source§

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

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

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

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

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

Source§

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

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

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

Source§

fn into(self) -> U

Calls U::from(self).

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

Source§

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

Source§

type Error = Infallible

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

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

Performs the conversion.
Source§

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

Source§

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

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

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

Performs the conversion.
Source§

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

Source§

fn vzip(self) -> V