【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.pswp.cn/diannao/90328.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/90328.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android 音视频 IPC序列化工具-Flattenable

Android Binder与AIDL与Service使用案例及分析-CSDN博客 讲讲这个类,被用在Android音视频中,跨进程序列化反序列化用。与Binder驱动有很强的联系。位于: feameworks/native/utils/Flattenable.h Flattenable, 译为令人满意的。可能是作者十分满意自己的这些作品吧,起了这…

文献学习|全面绘制和建模水稻调控组景观揭示了复杂性状背后的调控架构。

摘要&#xff1a; 解析调控复杂性状的机制对于推进作物改良至关重要。在此&#xff0c;我们提出了一个全面的水稻&#xff08;Oryza sativa&#xff09;调控组图谱&#xff0c;涵盖了来自三个代表性品种的23种不同组织的染色质可及性。我们的研究揭示了117,176个独特的开放染色…

Linux的压缩与解压缩

一、使用tar命令进行打包与解包 1.0、tar命令简介和常用选项 tar命令是Linux中经常使用的归档工具&#xff0c;它的主要功能是【对文件或者目录进行打包归档】&#xff0c;归档为一个文件&#xff0c;但是并不进行压缩&#xff1b;tar命令的归档操作效果如下&#xff1a; tar命…

OpenCV+OCR实现弧形文字识别

以下是基于OpenCV与OCR实现弧形文字识别的完整技术方案&#xff0c;结合了图像预处理、几何变换与OCR引擎调用等关键步骤&#xff0c;并提供优化技巧&#xff1a;&#x1f50d; 一、技术原理弧形文字识别的核心在于​​将弯曲文本转换为水平直线​​&#xff0c;便于OCR引擎处理…

【保姆级目标检测教程】Ubuntu 20.04 部署 YOLOv13 全流程(附训练/推理代码)

前言 YOLOv13 是 YOLO 系列的全新一代实时目标检测框架&#xff0c;在保持极高推理速度的同时显著提升了检测精度&#xff0c;广泛适用于嵌入式部署、工业质检、智能安防等多种场景。该版本提供了 Nano、Small、Large、X-Large 四种模型规格&#xff0c;用户可以根据计算资源和…

【大模型】到底什么是Function Calling和MCP,以及和ReAct推理的关系是什么?

文章目录背景&#xff1a;什么是Agent&#xff1f;背景&#xff1a;为什么需要Function Calling或者MCP&#xff1f;Function Calling和MCP在用户请求中的整体流程Function Calling&#xff08;函数/工具调用&#xff09;MCP (Model Context Protocol)ReAct (Reasoning and Act…

CANDENCE 17.4 进行元器件缓存更新

在我从立创商城导入CANDENCE元器件后&#xff0c;在ORCAD放置元器件时出现了下面的错误解决办法&#xff1a;1、在左边找到 Design Cache文件夹&#xff0c;在文件夹上鼠标右击选择 Cleanup Cache2、再放置该元器件&#xff0c;不管这个&#xff0c;点击确定3、这时候成功放上…

深入理解Kafka幂等性:原理、边界与最佳实践

一、什么是真正的消息幂等性&#xff1f; 消息系统的幂等性经常被误解&#xff0c;我们需要明确其精确含义和能力边界&#xff1a; 1. 正确定义 Kafka幂等性保证的是&#xff1a;在消息传输过程中&#xff0c;无论因网络重试、生产者重启等故障导致的消息重复发送&#xff0c;B…

【RTSP从零实践】8、多播传输H264码流的RTSP服务器——最简单的实现例子(附带源码)

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

【Linux】基础开发工具(3)

1. 版本控制器Git1.1 Git的简史Git 的历史可以追溯到 2005 年1。当时 Linux 内核项目的开发团队一直使用 BitKeeper 进行版本管理&#xff0c;但由于一位 Linux 开发成员写了一个连接 BitKeeper 仓库的外挂&#xff0c;BitMover 公司决定中止 Linux 免费使用 BitKeeper 的授权1…

synchronized 的使用和特性

synchronized 锁对象 普通方法 synchronized 锁普通方法时&#xff0c;其锁的对象是调用该方法的实例 public synchronized void method() { // 方法体 } 静态方法 静态方法的锁对象是所属的 class&#xff0c;全局只有一个。 public static synchronized void staticMetho…

Gin Web 层集成 Viper 配置文件和 Zap 日志文件指南(下)

在微服务架构中&#xff0c;Gin 常被用作 Web 层框架&#xff0c;而 Viper 用于管理配置文件&#xff0c;Zap 则提供高性能的日志记录功能。下面将详细介绍如何在 Gin Web 层集成 Viper 配置文件和 Zap 日志文件。 1. 项目概述 假设我们有一个基于 Go 语言的微服务项目&#…

IoTDB:专为物联网场景设计的高性能时序数据库

什么是IoTDB&#xff1f;IoTDB&#xff08;Internet of Things Database&#xff09;是一款开源的时序数据库管理系统&#xff0c;专为物联网&#xff08;IoT&#xff09;场景设计&#xff0c;由清华大学软件学院团队自研&#xff0c;天谋科技团队负责维护。它针对物联网数据的…

[netty5: MessageAggregator HttpObjectAggregator]-源码解析

在阅读这篇文章前&#xff0c;推荐先阅读 [netty5: ByteToMessageCodec & MessageToByteEncoder & ByteToMessageDecoder]-源码分析[netty5: HttpObject]-源码解析 100-continue 100-continue 是 HTTP/1.1 协议中的一种机制&#xff0c;用于客户端在发送大体积请求体…

前端学习1--行内元素 vs 块级元素(基础概念+案例实操)

一、内外边距学习&#xff1a;&#xff08;1&#xff09;简单理解&#xff1a;padding为内边距。padding不会影响元素的位置&#xff0c;只会调整元素的内容&#xff08;文字&#xff09;与边框之间的间距。margin为外边距。margin会影响元素在流式布局中的位置&#xff0c;改变…

Express + mysql2 + jwt 实现简单的登录鉴权

目前项目中使用Express 实现简单API功能&#xff0c;需要提供一套登录鉴权方案。这边是API侧实现 相关路由的登录鉴权。大体思路&#xff1a;就是&#xff0c;登录接口中通过jwt加密 token返回前端&#xff0c;前端其他接口把加密好的放入请求头Authorization中。中间件通过请求…

ReAct (Reason and Act) OR 强化学习(Reinforcement Learning, RL)

这个问题触及了现代AI智能体&#xff08;Agent&#xff09;构建的两种核心思想。 简单来说&#xff0c;ReAct 是一种“调用专家”的模式&#xff0c;而强化学习 (RL) 是一种“从零试错”的模式。 为了让你更清晰地理解&#xff0c;我们从一个生动的比喻开始&#xff0c;然后进行…

iTwinjs 4.10-4.11 更新

撤销更改 目前&#xff0c;撤销一个有缺陷的变更集的唯一方法是从 iModel Hub 中移除它&#xff0c;这可能会导致许多副作用&#xff08;无法撤销&#xff09;。一个更好的方法是在时间线中撤销变更集&#xff0c;并将其作为新的变更集引入。尽管这种方法仍然具有侵入性&#…

【CSS-15】深入理解CSS transition-duration:掌握过渡动画的时长控制

在现代网页设计中&#xff0c;平滑的过渡效果是提升用户体验的关键因素之一。CSS transitions 为我们提供了一种简单而强大的方式来实现元素在不同状态之间的平滑过渡&#xff0c;而 transition-duration 属性则是控制这些过渡效果时长的核心工具。本文将全面探讨 transition-d…

mysql-笔记

1. 安装mysql # 使用brew安装 brew install mysql# 查看是否安装成功 mysql -V 相关文档&#xff1a; mac&#xff1a;macOS下MySQL 8.0 安装与配置教程 - KenTalk - 博客园 Linux安装&#xff1a;linux安装mysql客户端_linux mysql 客户端-CSDN博客 2. 启动mysql 每次使…