当前位置: 首页 > news >正文

【Android】组件及布局介绍

梦开始的地方,安卓开发,希望能坚持梳理整理好安卓各个知识块,能拥有自己的理解,并表达出来,一开始肯定做的不会尽善尽美,一起加油吧加油吧。

一:代码分析

1:Android界面开发方式

(1)Java+View(传统视图系统)

这是 Android 早期的开发方式,用 Java 或 Kotlin 代码配合 XML 布局文件 来构建界面。(简单了解即可)

分离式开发:

  • 界面布局写在 XML 文件里(如 activity_main.xml),用各种控件(TextViewButton 等)拼出界面。
  • 逻辑代码写在 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的形式来引用它们。

  1. View通常用来绘制一个看得见并且可以交互的元素,比如文本、图片、按钮、进度条;
  2. View还有一个叫做ViewGroup的子类,ViewGroup更多的时候是一个看不见的容器可以用来存放其他控件或者布局==。==但我们一般不会直接使用ViewGroup管理布局,而是使用它的子类,比如常见的LinearLayout(线性布局)、ConstraintLayout(约束布局)、RelativeLayout(相对布局);
  3. 在一个Activity页面中的布局,一般都是如下图的结构,一个页面的根布局ViewGroup下面(如 ConstraintLayout 作为根 ),还有其他的View,或者其他的下级ViewGroup:

在这里插入图片描述

http://www.xdnf.cn/news/1088101.html

相关文章:

  • 微算法科技(NASDAQ MLGO)研究非标准量子预言机,拓展量子计算边界
  • 【WEB】Polar靶场 16-20题 详细笔记
  • navicat导出数据库的表结构
  • 数据库版本自动管理
  • 订单初版—分布式订单系统的简要设计文档
  • Centos和麒麟系统如何每天晚上2点10分定时备份达梦数据库
  • JAVAEE 代理
  • 3D 演示动画在汽车培训与教育领域中的应用
  • Modbus TCP转Profinet网关实现视觉相机与西门子PLC配置实例研究
  • Anolis OS 23 架构支持家族新成员:Anolis OS 23.3 版本及 RISC-V 预览版发布
  • 面试题--系统如何处理异常
  • SpringAI学习笔记-MCP服务器简单示例
  • 【UE5】虚幻引擎小百科
  • 后台设计指南:系统架构、交互规范与工具实战全流程解析
  • (C++)list列表相关基础用法(C++教程)(STL库基础教程)
  • Android T startingwindow使用总结
  • 深度剖析:向70岁老系统植入通信芯片——MCP注入构建未来级分布式通信
  • 容器技术技术入门与 Docker 环境部署
  • Flutter基础(前端教程④-组件拼接)
  • Python Web应用开发之Flask框架高级应用(三)——蓝图(Blueprints)
  • uniapp b树
  • 【LeetCode 热题 100】142. 环形链表 II——快慢指针
  • FairyGUI 实现 Boss 双层血条动画
  • Crazyflie无人机集群控制笔记(二)通过SDK实时对接Crazyswarm2及NOKOV度量动捕数据
  • jmeter 性能测试步骤是什么?
  • 代码详细注释:C语言实现控制台用户注册登录系统
  • C++进阶—二叉树进阶
  • [2025CVPR]SGC-Net:开放词汇人机交互检测的分层粒度比较网络解析
  • 【网络协议安全】任务14:路由器DHCP_AAA_TELNET配置
  • Redis基础数据结构