Space

Struct Space 

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

A Space creates empty space in layouts

Space is useful for creating gaps between UI elements or pushing elements apart. You can control its size using width, height, and layout params.

Implementations§

Source§

impl Space

Source

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

Create a new Space

Source

pub fn id(&self) -> i64

Get the view ID

Source

pub fn view(&self) -> &View

Get the underlying View

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

Auto Trait Implementations§

§

impl Freeze for Space

§

impl RefUnwindSafe for Space

§

impl Send for Space

§

impl Sync for Space

§

impl Unpin for Space

§

impl UnwindSafe for Space

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