一:代碼分析
1:Android界面開發方式
(1)Java+View(傳統視圖系統)
這是 Android 早期的開發方式,用 Java 或 Kotlin 代碼配合 XML 布局文件 來構建界面。(簡單了解即可)
分離式開發:
- 界面布局寫在 XML 文件里(如
activity_main.xml
),用各種控件(TextView
、Button
等)拼出界面。 - 邏輯代碼寫在 Java/Kotlin 文件里(如
MainActivity.java
),通過findViewById()
連接界面和代碼。
(2)Jetpack Compose(新方式)
這是 Google 推出的 聲明式 UI 框架,用 Kotlin 代碼直接構建界面,無需 XML。(前面的路以后再來探索吧)
2:組件
activity中有很多控件
比如說我們的按鈕Button,它繼承于TextView
TextView又繼承于我們的View
注:View是安卓當中所有的UI(User Interface)控件的父類
3:MainActivity類分析
(1)使用java的形式聲明控件
布局和Java代碼做關聯,頁面啟動的時候就會運行onCreate方法(暫時這么理解)
package com.xlong.myapplication;import android.os.Bundle;import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);EdgeToEdge.enable(this);setContentView(R.layout.activity_main);ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);return insets;});TextView textView = new TextView(this);//創建一個控件對象,this指當前的activity上下文(理解不是很深刻)textView.setTextSize(100);textView.setText("luo po gu zhong han feng chui");textView.setBackgroundColor(Color.GRAY);int w = ViewGroup.LayoutParams.MATCH_PARENT;//MATCH_PARENT代表控件寬度會填滿父容器//換個說法:當前控件的寬度與父布局大小一樣,就是左右兩邊頂著屏幕int h = ViewGroup.LayoutParams.WRAP_CONTENT;//設置控件的高度,根據內容自動調整;//換個說法:當前控件大小正好能包含里面的內容,上下頂著文字ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(w,h);//創建布局參數的對象//添加到當前的activity中addContentView(textView,layoutParams);//屬于activity的方法,把配置好的TextView添加到根布局中去//可以理解成把當前控件和當前頁面做關聯}
}
"ViewGroup.LayoutParams"這是靜態內部類
MainActivity對應一個頁面()這里我們創建一個TextView對象,設置文本的尺寸,內容,背景色。
這里的this指的是當前的activity,可以近似看作是應用中的 “頁面”,四大組件之一的Activity主要負責管理應用的用戶界面(UI),能夠承載布局文件(比如 XML 布局)。
4:手動聲明控件(不推薦)
(1)控件頁面
我們可以在activity_main.xml中聲明控件,比如說button,switch(前面的路以后再來探索吧QWQ)
聲明很多控件,來控制頁面
這些控件本質上都是xml代碼,右上角可以切換code代碼。
Android會為view以及它的子類,提供xml的引用形式
這是分割視圖
(2)xml方式定義控件
我們用xml方式自己添加一個圖片控件,把文本控件給擋住了
<ImageViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@mipmap/ic_launcher_round"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"/>
這里ImageView
最后四行代碼會讓圖片在父容器中居中,父容器指的就是androidx.constraintlayout.widget.ConstraintLayout
- 視圖的寬度會被拉伸至父容器的寬度(左右邊緣對齊)。
- 視圖的高度會被拉伸至父容器的高度(上下邊緣對齊)。
(3)屬性定布局
ConstraintLayout(約束布局)就是當前布局的一種情況
它借助為視圖(View)設置約束條件(像與其他視圖的**相對位置**、距離等)來實現布局。
類比——設置LinearLayout(線性布局)屬性,定義布局
它會按照水平或者垂直的單一方向來排列子視圖。
通常我們不會直接使用group,而是通過它的子類來使用。這也再一次印證了view是所有控件的父類,
5:setContentView(R.layout.activity_main)
下面那個方法是父類提供的,這個方法讓java頁面與xml布局進行關聯
R指的是當前工程下res下的工程資源在java代碼下的映射
訪問布局R.layout.activity_main
類比 訪問圖片R.mipmap-xhdpi.ic_launcher
6:沉浸式布局
(暫時先這么理解,前方的路,以后再來探索吧QWQ)
第一個紅框控制沉浸式
第二個是為了有更好的沉浸式體驗
有無這兩行代碼的區別
注意手機頂部很明顯有大不同。
二:View和ViewGroup比較
在安卓中,所有的UI控件或者布局,都是View的子類。我們可以使用Java或者xml的形式來引用它們。
- View通常用來繪制一個看得見并且可以交互的元素,比如文本、圖片、按鈕、進度條;
- View還有一個叫做ViewGroup的子類,ViewGroup更多的時候是一個看不見的容器,可以用來存放其他控件或者布局==。==但我們一般不會直接使用ViewGroup管理布局,而是使用它的子類,比如常見的LinearLayout(線性布局)、ConstraintLayout(約束布局)、RelativeLayout(相對布局);
- 在一個Activity頁面中的布局,一般都是如下圖的結構,一個頁面的根布局ViewGroup下面(如 ConstraintLayout 作為根 ),還有其他的View,或者其他的下級ViewGroup: