Android入门(八) | 常用的界面布局 及 自定义控件

文章目录

  • LinearLayout :线性布局
    • android:layout_gravity :控件的对齐方式
    • android:layout_weight:权重
  • RelativeLayout :相对布局
    • 相对于父布局进行定位
    • 相对于控件进行定位
    • 边缘对齐
  • FrameLayout :帧布局
  • Percent :百分比布局
  • ConstraintLayout :约束布局
    • 自定义控件
    • 封装复用的页面
    • 引入封装好的布局
  • 自定义控件


LinearLayout :线性布局

线性布局有水平、垂直两种排列方式:

  • android:orientation="vertical" :垂直方向排列,此时高度不可被指定为 match_parent
  • android:orientation="horizontal":水平方向排列,此时不能将宽度指定为 match_parent

android:layout_gravity :控件的对齐方式

如果布局方式选择 horizontal,之后设置 button1topbutton2center_verticalbutton3bottom 。那么呈现效果如下:
在这里插入图片描述


android:layout_weight:权重

vertical 垂直布局时,layout_weight 可以覆盖 layout_height 属性,根据权重来分配控件高度
在这里插入图片描述
PS:通过上图应该对 android:orientation="vertical" :垂直方向排列,此时高度不可被指定为 match_parent。” 这句话有了深刻了解, match_parent 属性会导致控件占满整个屏幕……

horizontal 水平布局时,layout_weight 可以覆盖 layout_height 属性,根据权重来分配控件高度

在这里插入图片描述


RelativeLayout :相对布局

通过相对定位的方式可以使控件出现在布局的任何位置。

相对于父布局进行定位

在这里插入图片描述
关于位置的属性:

  • layout_alignParentLeft :处于父布局的左。
  • layout_alignParentTop :处于父布局的上。
  • layout_alignParentRight : 处于父布局的右。
  • layout_alignParentBottom :处于父布局的下。
  • layout_centerInParent :处于父布局的居中。

相对于控件进行定位

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"tools:context=".SecondActivity"><Buttonandroid:id="@+id/button_1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_above="@id/button_3"android:layout_toLeftOf="@id/button_3"android:text="Button 1"/><Buttonandroid:id="@+id/button_2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_above="@id/button_3"android:layout_toRightOf="@id/button_3"android:text="Button 2"/><Buttonandroid:id="@+id/button_3"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"android:text="Button 3"/><Buttonandroid:id="@+id/button_4"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@id/button_3"android:layout_toLeftOf="@id/button_3"android:text="Button 4"/><Buttonandroid:id="@+id/button_5"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@id/button_3"android:layout_toRightOf="@id/button_3"android:text="Button 5"/></RelativeLayout>

运行结果:

在这里插入图片描述

  • layout_above :处于被引用控件之上。
  • layout_below :处于被引用控件之下。
  • layout_toLeftOf :处于被引用控件之左。
  • layout_toRightOf :处于被引用控件之右。

通过 android:layout_centerInParent 定位 button 3 之后,以其为基准,定位其他四个 button 的位置。

边缘对齐

  • layout_alignLeft :该控件左边缘与被引用控件左边缘对齐。
  • layout_alignRight:该控件右边缘与被引用控件右边缘对齐。
  • layout_alignTop :该控件顶部边缘与被引用控件顶部边缘对齐。
  • layout_alignBottom :该控件底部边缘与被引用控件底部边缘对齐。

在这里插入图片描述


FrameLayout :帧布局

这种布局没有方便的定位方式,所有的控件都默认的摆放在布局的左上角。但可以类似于 LinearLayout 中通过 layout_gravity 来指定控件在布局中的对齐方式:

在这里插入图片描述


Percent :百分比布局

layout_weight 属性让设计布局变得更方便,但可惜的是只有 LinearLayout 支持该功能,因此提供了 PercentFrameLayoutPercentRelativeLayout 分别解帧布局和相对布局的功能局限性。

具体来说,即可以不再使用 wrap_contentmatch_parent 等方式来指定控件大小,而是直接指定控件在布局中所占的百分比。

使用时,由于 Android 将百分比布局定义在了 support 库中,因此只需在 app/build.gradle 文件中添加下面依赖,需要注意的是 support 库在 Androidx 1.0.0 及更高版本中被 AndroidX 库完全取代了……因此添加依赖时需如此实现:

在这里插入图片描述
在这里插入图片描述

  • 只用完整路径 androidx.percentlayout.widget.PercentFrameLayout 作为标签名,因为百分比布局不像其他三个内置在系统中。
  • 必须定义一个命名空间 app 才能使用百分比布局的自定义属性。
  • 使用 layout_widthPercentlayout_heightPercent 两个属性来定义控件长款,值以百分比形式表示。
  • 继承自 FrameLayout ,因此所有控件默认摆放在左上角,可以借助 layout_gravity 来避免控件重叠。

ConstraintLayout :约束布局

常被视作增强型的相对布局,ConstraintLayout 不仅可以解决 LinearLayout 常有的嵌套布局缺陷,还具备 RelativeLayout 的相对布局功能。

自定义控件

在这里插入图片描述

  • 所有控件都是直接或者间接地继承自 View 的,所有布局都是直接或间接继承自 ViewGroup 的。
  • View 是 Android 中最基本的一种 UI 组件,它可以在屏幕上绘制一块矩形区域,响应这块区域的各种事件,封装好的各种控件其实就是在 View 的基础之上添加了各自特有的功能。
  • ViewGroup 是一种特殊的 View,可以包含很多的 子View子ViewGroup,是一个放置控件和布局的容器。

封装复用的页面

在前端页面中有许多重复使用频率高的页面,如导航栏、底部栏等,对于这些页面,可以一次编撰代码并封装,之后多次调用以实现复用。

这里通过约束布局实现标题栏布局文件 title.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@drawable/cmy4"><Buttonandroid:id="@+id/title_back"android:layout_width="0dp"android:layout_height="50dp"android:layout_margin="5dp"app:layout_constraintHorizontal_weight="1"android:background="@drawable/cmy1"android:text="Back"android:textColor="#fff"app:layout_constraintTop_toTopOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toLeftOf="@id/title_text" /><TextViewandroid:id="@+id/title_text"android:layout_width="0dp"android:layout_height="wrap_content"android:gravity="center"android:text="Title Text"app:layout_constraintHorizontal_weight="2.5"android:textColor="@color/teal_200"android:textSize="24sp"app:layout_constraintTop_toTopOf="@id/title_back"app:layout_constraintBottom_toBottomOf="@id/title_back"app:layout_constraintLeft_toRightOf="@id/title_back"app:layout_constraintRight_toLeftOf="@id/title_edit" /><Buttonandroid:id="@+id/title_edit"android:layout_width="0dp"android:layout_height="50dp"android:layout_margin="5dp"app:layout_constraintHorizontal_weight="1"android:background="@drawable/cmy1"android:text="Edit"android:textColor="@color/white"app:layout_constraintTop_toTopOf="parent"app:layout_constraintLeft_toRightOf="@id/title_text"app:layout_constraintRight_toRightOf="parent" /></androidx.constraintlayout.widget.ConstraintLayout>

android:background 不生效

res/values/themes.xml 中:
在这里插入图片描述
修改为:
在这里插入图片描述

相对定位

通过形如 layout_constraintTop_toTopOf 的属性来定位控件,该类属性值可为 parent 从而与父布局相适配。举两个例子,上述代码中:

  • title_backapp:layout_constraintLeft_toLeftOf="parent" :意为将 title_back左边缘 约束到 父布局左边缘
  • title_editapp:layout_constraintStart_toEndOf="@id/title_back" :意为 title_edit起始位置title_back结束位置

相对定位中的 layout_constraintBaseline_toBaselineOf 意为 文本基线 对齐。

对齐前:在这里插入图片描述 对齐后:在这里插入图片描述

通过相对布局实现居中:
在这里插入图片描述

用一张图总结相对定位:
在这里插入图片描述

如果两个或以上控件通过下图的方式约束在一起,就可以认为是他们是一条链(图为横向的链,纵向同理):

在这里插入图片描述
一条链的第一个控件是这条链的链头,当所有控件的 高/宽度 都为 固定值/wrap_content 时,可以在 链头 中通过设置 layout_constraintHorizontal_chainStyle 来改变 链的样式

  • spread :展开元素 (默认);
  • spread_inside :展开元素,但链的两端贴近 parent;
  • packed :链的元素将被打包在一起。
    在这里插入图片描述
    当所有控件的 高/宽度 都为 0dp 时,可以在 每个控件 中通过设置 layout_constraintHorizontal_weight(constraintVertical为纵向) 来改变 链的权重

界面显示:

在这里插入图片描述


引入封装好的布局

  • 在布局文件中加上一句 <include layout="@layout/title"/>
  • 隐藏系统自带的标题栏:
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) actionBar.hide();

自定义控件

不光布局会被重复使用,某些控件其功能是固定的,比如返回按钮,都是销毁当前活动。因此也可以对其进行封装复用,创建一个自定义类 TitleLayout.java 继承 LinearLayout,并且重写里面的构造方法

public class TitleLayout extends LinearLayout {public TitleLayout(Context context, Attributes attrs){super(context, (AttributeSet) attrs);LayoutInflater.from(context).inflate(R.layout.title, this);}
}

此时,在布局中引入 TitleLayout 控件就会调用这个构造函数,因此使用 LayoutInflater 来实现动态加载,from() 方法可以构建出一个 LinearLayout 对象,然后调用 inflate 可以动态加载一个布局文件,里面传入两个参数:

  • 加载布局文件的 id
  • 参数一的父布局。

现在可以在其他 xml 文件中(比如 second_layout.xml)添加这个自定义控件:

<com.example.activitytest.TitleLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"></com.example.activitytest.TitleLayout>

com.example.activitytestTitleLayout 文件所在的完整路径名。如此一来即可把 title 布局界面直接搬到 second_layout 布局中,那么 SecondActivity 其显示的布局自然就是 title.xml 的样子。

此时我们可以为布局中的控件注册点击事件:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/443708.shtml

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

相关文章

Android入门(九)| 滚动控件 ListView 与 RecyclerView

文章目录ListView内置类型的简单运用定制数据类型提升效率点击事件RecyclerView布局管理器点击事件ListView 内置类型的简单运用 由于手机屏幕空间有限&#xff0c;能够一次性在屏幕上显示的内容不多&#xff0c;当我们的程序有大量数据需要显示的时候就可以借助 ListView 来…

Android入门(10)| Fragment碎片详解

文章目录为什么要使用碎片&#xff08;Fragment&#xff09;实例布局文件FragmentActivity动态添加碎片布局文件FragmentActivity碎片通信Fragment布局文件Activity生命周期为什么要使用碎片&#xff08;Fragment&#xff09; 我们在手机上看新闻可能是这样的&#xff1a; Re…

Android开发(1) | Fragment 的应用——新闻应用

文章目录Item&#xff1a;标题子项布局文件Java代码标题碎片布局文件Java代码新闻内容碎片布局文件Java代码新闻内容活动布局文件Java代码首界面布局文件Java代码Item&#xff1a;标题子项 布局文件 news_item.xml&#xff1a; <TextViewxmlns:android"http://schema…

Android入门(11)| 全局广播与本地广播

文章目录广播概念接收广播动态注册实例静态注册实例发送广播发送标准广播广播的跨进程特性发送有序广播本地广播广播概念 Android 中的每个应用程序都可以对自己感兴趣的广播进行注册&#xff0c;这样该程序就只会接收到自己所关心的广播内容&#xff0c;这些广播可能是来自系…

Android开发(2) | 广播 Broadcast 的应用——强制下线功能

文章目录功能简介关闭所有活动登陆界面发送强制下线的广播广播接收器AndroidManifest.xml运行结果功能简介 强制下线功能只需要弹出一个对话框&#xff0c;让用户只能点击确定按钮&#xff0c;回到登录界面。 如果在每一个活动中添加一个对话框的话太过繁琐&#xff0c;用广播…

Android入门(12)| 数据持久化

文章目录数据持久化文件存储将数据存储进文件实例从文件中读取数据实例SharedPreferences存储将数据存储进文件实例从文件中读取数据实例实现记住密码的功能SQLite数据库存储创建自己的帮助类调用自己的帮助类补全 onUpgrade() 方法增删查改增&#xff1a;SQLiteDatabase.inser…

Android入门(13)| Android权限 与 内容提供器

文章目录普通权限与危险权限运行时申请权限内容提供器运用安卓封装好的内容提供器自实现的内容提供器概念实现普通权限与危险权限 主要用于不同应用程序之间在保证被访数据的安全性的基础上&#xff0c;实现数据共享的功能。 在 Android 6.0 开始引入了运行时权限的功能&…

Android入门(14)| 通知

文章目录创建通知点击效果其它小功能实例创建通知 创建通知的步骤&#xff1a; 管理通知的 NotificationManager&#xff0c;通常通过当前 Context 的 getSystemService() 获取实例。它接受一个字符串参数用于确定获取系统的什么服务。Android 8.0(O) 版本后需要通知通道&…

Android开发(3) | 权限和内容提供器的应用——调用相机和相册

文章目录拍照并保存到 ImageView 控件布局文件 notice_layout.xml按钮 button_takePhoto 的点击操作隐式 Intent 启动后的回调AndroidManifest.xml从相册选取照片并在 ImageView 控件中显示布局文件 notice_layout.xml按钮 button_takePhoto 的点击操作自定义打开相册的方法 op…

Android开发(4) | 系统权限、MediaPlayer类 和 VideoView类 的应用——播放多媒体文件

文章目录MediaPlayer类播放音频的实例VideoView类播放视频的实例MediaPlayer类 对多种格式的音频文件提供了全面的控制方法&#xff1a; 如何获得MediaPlayer实例&#xff1f; 通过构造函数&#xff1a; MediaPlayer mp new MediaPlayer();调用 MediaPlayer.create() 方法&…

Android入门(15)| 网络

文章目录WebViewHTTP使用HttpURLConnection使用OkHttp封装网络操作封装HttpURLConnection封装OkHttpWebView WebView 可以在 应用程序中&#xff08;而不是浏览器&#xff09; 展示一些网页。 布局文件 web_layout.xml&#xff1a; <LinearLayoutxmlns:android"http…

Android入门(16)| 服务

文章目录概念Android 多线程继承 Thread继承 Runable 接口匿名类异步消息处理AsyncTask使用服务框架启动/停止服务绑定/解绑服务服务的生命周期前台服务IntentService完整版下载示例下载过程的回调接口&#xff1a;DownloadListener继承 AsyncTask 实现下载功能&#xff1a;Dow…

2020德勤面试开始了吗_2020国考面试开始,近期面试公告汇总,附结构化小组面试流程...

2020年国家公务员考试面试环节逐步恢复考试&#xff0c;各个招录部门已经发布面试考察公告&#xff0c;对于进入面试环节的国考考生来说&#xff0c;有必要了解近期国考面试的招录动态&#xff0c;提前做好面试准备。2020国考国家统计局机关面试面试确认&#xff1a;请进入面试…

项目积压需求项目计划_需求变更频繁,项目经理如何做好需求管理?

项目实施过程中&#xff0c;项目经理常常面临一个重大挑战——需求变更。需求变更无处不在&#xff0c;市场条件变化、新业务出现、战略目标调整、客户需求修改、资源限制等&#xff0c;都会造成需求变更。需求变更会影响项目的时间、成本和质量&#xff0c;对整个项目和团队成…

Android | Sensor.TYPE_ORIENTATION被废弃后的解决办法

文章目录概述getOrientation 方法根据 旋转矩阵R 获取 设备旋转弧度getRotationMatrix 方法根据 地磁场、加速度传感器对象 获取 旋转矩阵R代码参考资料概述 Sensor.TYPE_ORIENTATION 常数在 API 8 中已弃用&#xff0c;官方推荐使用 SensorManager.getOrientation() 替代。关…

【JAVA 开发小问题】 | String操作合集

文章目录截取特定两个字符之间的字符串截取特定两个字符之间的字符串 利用正则表达式&#xff0c;图片来源

uniapp 刷新后数据都没有了_环境温度传感器都没有连接,竟然还会有数据?

福田欧曼GTL(福康发动机、康明斯2880系统)匹配ECoffit尿素泵●故障现象&#xff1a;OBD故障灯点亮&#xff0c;不烧尿素&#xff0c;油耗高&#xff0c;动力不足●故障码&#xff1a;●维修分析&#xff1a;①故障指出加热器问题&#xff0c;摸下尿素箱温度&#xff0c;发现烫手…

保姆级教学!Xcode 配置 OpenGL 环境

文章目录GLFW获取 GLFWGLAD获取 GLAD在 Xcode 中配置下载好的 GLFW 和 GLAD配置流程检测是否配置成功无关配置的题外话——Xcode 下安全的删除移动操作GLFW Graphics Library Framework&#xff08;图形库框架&#xff09;&#xff0c;可以让我们通过其封装好的 通用API 来正确…

Android入门(17)| 百度提供的 Android定位SDK

文章目录配置百度提供的 Android定位SDK用于发布的 SHA1用于测试的 SHA1使用百度定位实例配置百度提供的 Android定位SDK 详情参见官方文档&#xff0c;这里仅对获取 SHA1 做详细介绍&#xff1a; 用于发布的 SHA1 用于测试的 SHA1 使用百度定位实例 public class LocationAc…

ios 不被遮挡 阴影_为何你没见到日环食?你不知道的天象常识原来还有这么多 | 返朴...

关注风云之声提升思维层次导读说好的日环食呢&#xff0c;为什么上周很多人只等到了日偏食?日食月食的时间和种类是怎么预测的?你真的弄懂了各种日食和月食的成因吗&#xff1f;你了解它们有什么区别和联系&#xff0c;又遵循什么样的时间规律吗? 日食和月食发生的频率一样吗…