Android中LinearLayout線性布局使用詳解
LinearLayout(線性布局)是Android中最基礎、最常用的布局之一,它按照水平或垂直方向依次排列子視圖。
基本特性
- 方向性:可以設置為水平(
horizontal
)或垂直(vertical
)排列 - 權重:支持通過
weight
屬性分配剩余空間 - 簡單高效:布局計算簡單,性能較好
- 嵌套組合:常與其他布局嵌套使用實現復雜界面
基本屬性
核心屬性
-
android:orientation
:布局方向vertical
:垂直排列(默認)horizontal
:水平排列
-
android:gravity
:子視圖在布局內的對齊方式(定義在容器視圖上)top
子視圖頂部對齊/bottom
子視圖底部對齊/left
子視圖左對齊/right
子視圖右對齊center_vertical
垂直居中/center_horizontal
水平居中/center
水平居中- 可以組合使用,如
left|center_vertical
-
android:layout_gravity
:單個子視圖在布局內的對齊方式(取值同上,定義在子視圖上)
權重屬性
android:layout_weight
:子視圖的權重,用于分配剩余空間- 值越大,分配的空間越多(
android:layout_weight:1
類似于css中的flex:1
) - 常與
layout_width
或layout_height
設為0dp
配合使用
- 值越大,分配的空間越多(
基本用法示例
垂直布局示例
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:gravity="center_horizontal"android:padding="16dp"><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="按鈕1"/><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="按鈕2"/><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="按鈕3"/>
</LinearLayout>
水平布局示例
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"android:gravity="center_vertical"><ImageViewandroid:layout_width="48dp"android:layout_height="48dp"android:src="@mipmap/ic_launcher"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="這是一個水平排列的文本"android:layout_marginStart="8dp"/>
</LinearLayout>
權重(weight)的高級用法
權重是LinearLayout最強大的特性之一,可以實現比例分配空間。
等分空間
<LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><Buttonandroid:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:text="按鈕1"/><Buttonandroid:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:text="按鈕2"/><Buttonandroid:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:text="按鈕3"/>
</LinearLayout>
不等比例分配
<LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"><TextViewandroid:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="2"android:text="占2/5空間"android:background="#FF5722"/><TextViewandroid:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="3"android:text="占3/5空間"android:background="#4CAF50"/>
</LinearLayout>
常用技巧
1. 分割線使用
<LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"android:showDividers="middle|beginning|end"android:divider="@drawable/divider_line"android:dividerPadding="8dp"><!-- 子視圖 -->
</LinearLayout>
需要定義divider_line的drawable:
<!-- res/drawable/divider_line.xml -->
<shape xmlns:android="http://schemas.android.com/apk/res/android"><size android:width="1dp" android:height="1dp"/><solid android:color="#CCCCCC"/>
</shape>
2. 基線對齊(針對文本)
<LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"android:baselineAligned="true"><!-- 不同大小的文本會按照基線對齊 -->
</LinearLayout>
3. 嵌套使用實現復雜布局
<LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><!-- 頂部標題欄 --><LinearLayoutandroid:layout_width="match_parent"android:layout_height="48dp"android:orientation="horizontal"android:background="#3F51B5"><!-- 標題欄內容 --></LinearLayout><!-- 中間內容區 --><LinearLayoutandroid:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"android:orientation="horizontal"><!-- 左側導航 --><LinearLayoutandroid:layout_width="120dp"android:layout_height="match_parent"android:orientation="vertical"><!-- 導航內容 --></LinearLayout><!-- 右側內容 --><ScrollViewandroid:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"><!-- 可滾動內容 --></ScrollView></LinearLayout><!-- 底部按鈕欄 --><LinearLayoutandroid:layout_width="match_parent"android:layout_height="48dp"android:orientation="horizontal"><!-- 底部按鈕 --></LinearLayout>
</LinearLayout>
代碼中動態修改LinearLayout
LinearLayout linearLayout = findViewById(R.id.my_linear_layout);// 修改方向
linearLayout.setOrientation(LinearLayout.HORIZONTAL);// 添加子視圖
Button newButton = new Button(this);
newButton.setText("動態添加的按鈕");LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT);
params.weight = 1; // 設置權重linearLayout.addView(newButton, params);
性能優化建議
- 減少嵌套:避免多層LinearLayout嵌套,會增加布局計算復雜度
- 合理使用weight:weight會觸發兩次測量,影響性能
- 考慮使用ConstraintLayout:對于復雜布局,ConstraintLayout通常性能更好
- 使用merge標簽:當LinearLayout是根布局時,可以使用減少視圖層級
常見問題解決
Q1:為什么設置了weight但視圖不顯示?
A:確保對應的width/height設置為0dp
Q2:如何讓最后一個按鈕靠右對齊?
A:可以在按鈕前添加一個空白View:
<Viewandroid:layout_width="0dp"android:layout_height="1dp"android:layout_weight="1"/>
<Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="靠右按鈕"/>
Q3:如何實現wrap_content但又限制最大寬度?
A:使用android:maxWidth
屬性或結合ConstraintLayout