水平 LinearLayout 中:
TextView:水平居中顯示ImageButton:右側對齊<LinearLayout
android:layout_width="match_parent"
android:layout_height="50dp"
android:orientation="horizontal"
android:background="@color/usualBike"
android:gravity="center_vertical"> <!-- 容器垂直居中 -->
<!-- 左側佔位,推擠 TextView 到中間 -->
<View
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_weight="1" />
<TextView
android:id="@+id/usesLabel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/tituloUsos"
android:textSize="30sp"
android:textColor="@color/white"
android:textStyle="bold"
android:gravity="center" />
<!-- 中間佔位,推擠 Button 到右側 -->
<View
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_weight="1" />
<ImageButton
android:id="@+id/disconnect"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/icon_logout"
android:background="@null" />
</LinearLayout>
| 組件 | layout_weight | 作用 |
|---|---|---|
| 左側空 View | 1 | 佔據左側 1/3 空間 |
| TextView | 未設置 (默認 0) | 僅佔用內容寬度,被壓縮到中間 |
| 中間空 View | 1 | 佔據中間 1/3 空間 |
| ImageButton | 未設置 | 靠右顯示 |
三等分空間:[空白] [TextView] [空白] [Button] → 視覺上 TextView 居中,Button 右對齊
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="50dp">
<TextView
android:id="@+id/usesLabel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="@string/tituloUsos" />
<ImageButton
android:id="@+id/disconnect"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:src="@drawable/icon_logout" />
</RelativeLayout>
✅ 直觀、無嵌套權重計算 | ❌ 相對佈局性能略低、不支持 layout_weight 分配
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="50dp">
<TextView
android:id="@+id/usesLabel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/tituloUsos"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@id/disconnect"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent" />
<ImageButton
android:id="@+id/disconnect"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/icon_logout"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
✅ 扁平佈局、性能最優、可視化編輯 | ❌ 需添加依賴、學習成本稍高
<FrameLayout
android:layout_width="match_parent"
android:layout_height="50dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="@string/tituloUsos" />
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right|center_vertical"
android:src="@drawable/icon_logout" />
</FrameLayout>
⚠️ 當 TextView 過長會遮擋 Button,無自動換行/擠壓機制
android:gravity="center_vertical" 而非每個子 View 設置layout_gravity 在 LinearLayout 中僅對垂直方向生效 (水平由 weight 決定)gravity 控制子元素內部對齊,layout_gravity 控制自身在父容器位置layout_width="0dp" (水平) 或 layout_height="0dp" (垂直)