android中常見布局及其約束

0 布局的定義

布局可以理解為一種??容器??,用于??組織與排列界面上的控件??。

  • 布局是一個相框,控件就是你要展示的照片。?

  • 你(布局規則)決定這些照片怎么排列:是從上到下整齊放(LinearLayout),還是自由定位(ConstraintLayout),還是全部疊在一起(FrameLayout)。

🔹 ??布局的本質是樹狀結構??:一個布局可以包含多個子布局或控件,子布局又可以繼續嵌套,從而形成復雜的 UI 結構。

🧠 ??常見問題:為什么別人寫的布局能實現效果,我的卻不行???

很多時候是因為對??布局類型及其屬性規則??不了解,尤其是某些屬性是由??父布局決定的??,而不是通用的。


一、布局中的屬性來源分類

我們在 XML 布局文件中寫的各種屬性,大致可以分為以下兩類:


? 1. 來自 ??View 本身?? 的屬性(通用屬性,大多數控件都支持)

這些屬性是 ??Android 控件共有的基本屬性??,比如:

android:id:為控件設置唯一標識符

android:layout_width:控件的寬度(如?match_parent,?wrap_content

android:layout_height:控件的高度

android:text:文本內容(TextView、Button 等)

android:textSize:字體大小

android:background:背景顏色或圖片

android:padding/?android:margin:內邊距和外邊距

android:textColor:文字顏色

📌 這些屬性在任何控件中基本都有效,因為它們定義在?android.view.View或其子類中。


? 2. 來自 ??父布局的 LayoutParams??(布局參數,取決于當前控件所在的父布局類型

這些屬性 ??不是控件本身的屬性,而是由父布局決定的布局行為??,比如:

layout_gravity(在某些布局中控制控件在其父容器中的對齊方式)

layout_centerInParent(居中,但只有特定父布局支持)

layout_weight(權重,LinearLayout 特有)

layout_below,?layout_toRightOf(RelativeLayout 特有)

app:layout_constraintXXX(ConstraintLayout 特有)

?? ??重要提醒:??

如果你在一個布局中使用了 ??只屬于某種父布局的屬性,但該控件的實際父布局并不支持它,那么這個屬性雖然不會報錯,但也不會生效!??

例如:在?ConstraintLayout中使用?layout_centerInParent是無效的,因為它是?RelativeLayout的屬性

如下面兩張圖,layout_centerInParent在父布局RelativeLayout中是生效的,但是在ConstraintLayout中不會報錯,但是不會生效。

實際中我們在判斷這個布局是否有這個屬性可以通過這個方式,只要在android studio中能顯示,說明就有這個屬性。

二? 常見布局體系總欄(詳細參數去andorid官網學習)

2.1 LinearLayout?(線性疊加布局):

  • 垂直方向:下一個子控件從上一個控件的底部開始排列

  • 水平方向:下一個子控件從上一個控件的右邊開始排列

方法1:在xml中并且布局,然后直接在代碼中加載

1.1.1 直接在Java中實現布局,不使用xml

public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 1. 創建 RelativeLayout 作為根布局RelativeLayout relativeLayout = new RelativeLayout(this);relativeLayout.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT,RelativeLayout.LayoutParams.MATCH_PARENT));relativeLayout.setBackgroundColor(Color.WHITE);// 2. 創建 LinearLayout 并設置屬性LinearLayout linearLayout = new LinearLayout(this);linearLayout.setOrientation(LinearLayout.VERTICAL);linearLayout.setPadding(16, 16, 16, 16);linearLayout.setBackgroundColor(0xFF03A9F4); // holo_blue_light// 3. 添加子控件TextView textView = new TextView(this);textView.setText("我是居中的");textView.setTextSize(18);textView.setTextColor(Color.WHITE);linearLayout.addView(textView);Button button = new Button(this);button.setText("點我");linearLayout.addView(button);// 4. 設置 LinearLayout 在 RelativeLayout 中居中RelativeLayout.LayoutParams llParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,RelativeLayout.LayoutParams.WRAP_CONTENT);llParams.addRule(RelativeLayout.CENTER_IN_PARENT, RelativeLayout.TRUE);linearLayout.setLayoutParams(llParams);// 5. 把 LinearLayout 添加到 RelativeLayoutrelativeLayout.addView(linearLayout);// 6. 設置 Activity 內容為 RelativeLayoutsetContentView(relativeLayout);}
}

方法3:可以在 XML 定義布局基礎結構,然后在 Java 中動態修改或添加控件

1.2 RelativeLayout(相對布局)

? 核心特點:

子控件通過??相對位置??來排列(比如相對于父布局,或相對于其他控件)

支持諸如?layout_alignParentTop,?layout_below,?layout_toRightOf等屬性

??靈活性強,但復雜布局容易難以維護?

1.3 FrameLayout(幀布局)

? 核心特點:

??所有子控件默認都堆疊在左上角(0,0)位置??

后添加的控件會覆蓋在先添加的控件之上(常用于疊加顯示),

  • 可以通過 android:layout_gravityFrameLayout.LayoutParams.gravity 控制子控件在父容器中的位置

  • 常見值:centertop|leftbottom|right

通常用來顯示??單個全屏控件??

🎯 適用場景:

顯示單一內容,比如全屏的圖片、視頻播放器

實現??層疊效果??(比如浮動按鈕蓋在內容上方)

用作 ??Fragment 的容器?

舉個例子,下面這個就是framelayout從zuos左上角開始疊加的布局

1.4 ConstraintLaout(約束布局)

ConstraintLayout 功能搶到,可以替代 LinearLayout、RelativeLayout、FrameLayout 等組合布局,主要特點如下:

? 核心特點:

通過??控件之間的約束關系(Constraints)??來定位,而不是嵌套

支持百分比定位、居中、偏移、鏈條(Chains)、屏障(Barrier)、Guideline 等高級功能

??官方推薦用于替代多層嵌套的 LinearLayout / RelativeLayout??

支持在 Android Studio 的 ??布局編輯器中可視化拖拽約束??

🎯 適用場景:

構建??復雜且響應式的 UI??

需要精確控制控件位置與對齊

希望減少布局嵌套層級,提升渲染性能

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"xmlns:app="http://schemas.android.com/apk/res-auto"android:background="@android:color/white"><!-- 居中顯示的 LinearLayout --><LinearLayoutandroid:id="@+id/center_linear"android:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="vertical"android:padding="16dp"app:layout_constraintStart_toStartOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintTop_toTopOf="parent"app:layout_constraintBottom_toBottomOf="parent"android:background="@android:color/holo_blue_light"tools:ignore="MissingConstraints"><!-- LinearLayout 內的子控件 --><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="我是居中的"android:textSize="18sp"android:textColor="@android:color/white" /><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="點我" /></LinearLayout><LinearLayoutandroid:id="@+id/center_linear1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="vertical"android:padding="16dp"app:layout_constraintStart_toStartOf="@id/center_linear"app:layout_constraintTop_toBottomOf="@id/center_linear"android:background="@android:color/holo_green_light"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="居中的下面"android:textSize="18sp"android:textColor="@android:color/white" /><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="點我" /></LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

? 提示:

使用?app:layout_constraintXXX來定義控件間的約束關系

ConstraintLayout強大之處在于不用嵌套也能實現復雜布局

tip:

如果在 XML 和 Java 代碼中都對同一個控件設置了相同屬性,??后設置的會覆蓋前者?

所有的布局與屬性設置,都是在?setContentView()之后才會真正生效嵌套太深會影響性能與渲染速度,

盡量使用?ConstraintLayout減少布局層級

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/97535.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/97535.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/97535.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Rust語言能干什么

Rust 語言的應用范圍非常廣&#xff0c;幾乎覆蓋了現代軟件開發的全部領域。它最初以“系統級語言”身份出道&#xff0c;但現在已經遠遠超出了這個范疇。下面我從幾個關鍵方向給你梳理一下&#xff0c;Rust 到底能干什么&#xff0c;以及為什么在這些領域它特別有優勢。 1. 系…

只需一個設置就可以解決Microsoft Edge瀏覽器打不開網頁的問題

Microsoft Edge是一款功能強大的網絡瀏覽器&#xff0c;預裝在Windows 10、11系統中。通過這個簡單易懂的教程&#xff0c;學習如何修復Microsoft Edge瀏覽器打不開的問題。1、打開計算機找到C盤&#xff0c;雙擊打開&#xff1a;2、打開【用戶】?【Admin】?【AppData】?【L…

AI 應用 圖文 解說 (二) -- 百度智能云 ASR LIM TTS 語音AI助手源碼

文章的目的為了記錄AI應用學習的經歷&#xff0c;降低AI的入門難度。同時記錄開發流程和要點有些記憶模糊&#xff0c;防止忘記。也希望可以給看到文章的朋友帶來一些收獲。 相關鏈接&#xff1a; AI 應用 圖文 解說 (一) -- 百度智能云 實現 語音 聊天-CSDN博客 AI 應用 圖文 …

計算機Python畢業設計推薦:基于Django的博客網站設計與實現【python/大數據/深度學習/機器學習定制】

精彩專欄推薦訂閱&#xff1a;在下方主頁&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f496;&#x1f525;作者主頁&#xff1a;計算機畢設木哥&#x1f525; &#x1f496; 文章目錄 一、項目介紹二、…

當 AI 開始 “篩選” 信息:算法偏見會加劇認知鴻溝嗎?如何構建公平的 AI 生態?

AI 篩選信息的現狀與原理?在信息爆炸的時代&#xff0c;AI 篩選信息已成為各領域不可或缺的關鍵技術。在社交媒體平臺上&#xff0c;如抖音、小紅書等&#xff0c;AI 根據用戶的點贊、評論、瀏覽歷史等數據&#xff0c;精準推送用戶可能感興趣的內容&#xff0c;極大提升了用戶…

2023年IEEE IOTJ SCI1區TOP,動態環境下無人機目標覆蓋任務路徑規劃,深度解析+性能實測

目錄1.摘要2.問題模型3.算法設計4.結果展示5.參考文獻6.代碼獲取7.算法輔導應用定制讀者交流1.摘要 無人機&#xff08;UAV&#xff09;作為物聯網應用的重要工具&#xff0c;正廣泛應用于智能農業監測、智能交通監測等領域&#xff0c;并逐漸成為國內外研究熱點。然而&#x…

計算機視覺(四):二值化

二值化&#xff0c;就是將圖像從彩色或灰度模式轉換為只有兩種顏色&#xff08;通常是黑色和白色&#xff09;的模式。這個過程的本質是設定一個閾值 (Threshold)&#xff0c;將圖像中所有像素的灰度值與這個閾值進行比較。 基本原理 二值化的核心原理非常簡單&#xff1a; 灰度…

(二)設計模式(Command)

文章目錄項目地址一、設計模式1.1 Command Design1. 創建命令接口2. 創建支付的Command類3. CommandScheduler4. 使用1.2 Chain of Responsibility1. 接口創建2. 審批人3. 發起審批1.3 State Pattern1. 創建簡單的狀態機定義動作和狀態狀態機使用狀態機1.x Iterator1.x Observe…

現代C++性能陷阱:std::function的成本、異常處理的真實開銷

1. std::function 的成本 std::function 是一個通用的、類型擦除的函數包裝器&#xff0c;它非常方便&#xff0c;可以存儲和調用任何可調用對象&#xff08;函數、lambda、函數對象、bind表達式等&#xff09;。然而&#xff0c;這種靈活性是有代價的。 主要成本來源&#xff…

基于Spark的白酒行業數據分析與可視化系統的設計與實現

文章目錄有需要本項目的代碼或文檔以及全部資源&#xff0c;或者部署調試可以私信博主項目介紹一、項目背景與研究意義二、系統整體架構三、系統功能設計四、應用場景與價值五、項目特色與創新點六、總結與展望每文一語有需要本項目的代碼或文檔以及全部資源&#xff0c;或者部…

織夢會員中心模板調用某個欄目名和欄目下文檔的辦法

大家在用到織夢dedecms時候&#xff0c;需要在會員中心模板調用欄目的名稱和鏈接&#xff0c;還有某個欄目下的文檔要怎么操作呢&#xff1f; 我們都知道&#xff0c;在會員中心模板&#xff0c;直接用dede:type或者dede:arclist標簽是不行的&#xff0c;在會員中心調用只能用p…

區塊鏈的法律定位:技術、工具還是資產?

高鵬律師首席數據官&#xff0c;數字經濟團隊創作AI輔助當我們談論區塊鏈時&#xff0c;我們在談論什么&#xff1f;是那串不可篡改的哈希值&#xff0c;是去中心化的信仰圖騰&#xff0c;還是藏在代碼背后的權利密碼&#xff1f;今天&#xff0c;我們不聊技術迭代的炫酷&#…

LeetCode每日一題,2025-8-31

dfs搜索解數獨&#xff0c;重點是如何判斷當前這位置的board[x][y]是否可以填數字num public class T37 {public static void main(String[] args) {char[][] board new char[][]{{5, 3, ., ., 7, ., ., ., .},{6, ., ., 1, 9, 5, ., ., .},{., 9, 8, ., ., ., ., 6, .},{8, …

Linux 進程信號學習筆記:從概念到實操

一、Linux 信號基本概念1.1 生活角度理解信號我們可以把進程比作等待快遞的人&#xff0c;信號就像快遞&#xff1a;識別信號&#xff1a;就像我們知道快遞來了該 怎么處理&#xff0c;進程對信號的識別是內核程序員預先編寫的內置特性&#xff0c;即使信號沒產生&#xff0c;進…

解決多種類潮濕敏感元器件的多溫度、多時長的排潮烘干

鎧德科技ESD烘箱針對復雜電路產品的排潮烘干需求&#xff0c;可通過以下技術路徑實現多品類元器件的高效兼容處理&#xff1a;多溫區獨立控制系統采用蜂窩式加熱模塊陣列&#xff0c;每個0.6m獨立溫區可設置1℃精度支持同時運行3種不同溫度曲線&#xff08;典型值&#xff1a;8…

obdumper和obloader遷移OceanBase業務庫(一):實施手冊

obdumper和obloader遷移OceanBase業務庫&#xff08;一&#xff09;&#xff1a;實施手冊導出前準備全庫&#xff08;模式&#xff09;數據導出全庫&#xff08;模式&#xff09;數據導入導入后檢查環境信息&#xff1a;OceanBase v4.3.5單機部署&#xff0c;MySQL租戶OBDUMPER…

SQLSugar 快速入門:從基礎到實戰查詢與使用指南

目錄 ?編輯 一、SQLSugar 簡介 二、SQLSugar 環境搭建 2.1 安裝 SQLSugar 2.1.1 通過 Visual Studio NuGet 圖形化界面安裝 2.1.2 通過 NuGet 命令行安裝 2.2 引用 SQLSugar 命名空間 三、SQLSugar 核心初始化配置 3.1 基礎初始化&#xff08;非 IOC 模式&#xff09…

Python與Rust語法對比詳解:從入門到精通

Python與Rust語法對比詳解&#xff1a;從入門到精通 前言 Python和Rust作為當今最受關注的編程語言&#xff0c;分別代表了動態類型和靜態類型語言的典型特征。本文將從語法層面深入對比這兩種語言&#xff0c;幫助開發者理解它們的設計理念和使用場景。1. 基礎語法結構 1.1 He…

視頻加水印_帶gif 加動態水印 gif水印 視頻浮動水印

如果你有一個視頻&#xff0c;你想給它加一個水印&#xff0c;讓水印浮動&#xff0c;而且加的還是 GIF 動態圖片水印&#xff0c;那么你可以使用這個工具。首先把你的兩個文件拖進來&#xff0c;然后點擊第三個按鈕。加好了&#xff0c;打開看一下&#xff0c;我們看到這個水印…

C# 字符和字符串

原文&#xff1a;C# 字符和字符串_w3cschool 請勿將文章標記為付費&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; C&#xff03;字符和字符串 C&#xff03;的 char 類型別名 System.Char 類型表示 Unicode 字符。 在單引號中指定char字面值&#xff1a; …