Android Studio开发学习(五)———LinearLayout(线性布局)

一、布局

        认识了解一下Android中的布局,分别是: LinearLayout(线性布局),RelativeLayout(相对布局),TableLayout(表格布局), FrameLayout(帧布局),AbsoluteLayout(绝对布局),GridLayout(网格布局) 等。

二、LinearLayout详解

1.常见属性

(1)id值: android:id="@+id/"

        id相当于一个标识,方便后期写代码时找到

android:id="@+id/linearlayuot"
(2)布局宽度:android:layout_width;布局高度:android:layout_height

        这两个属性一般放在一起写,且必须设定,里面的值可以任意进行调整,可以是与父组件相同的match_parent,也可以是适应自身大小的wrap_content,还可以是各种数值,如50dp,100dp;其中dp是一种屏幕密度的抽象单位。

// match_parent:与父组件相同
// wrap_content:适应自身大小

android:layout_width="match_parent" 
android:layout_height="wrap_content"
(3)外边距:android:layout_margin;内边距:android:padding

外边距
android:layout_margin整体距离
android:layout_marginTop顶部距离
android:layout_marginLeft  / android:layout_marginStart左部距离
android:layout_marginRight  /  android:layout_marginEnd右部距离
android:layout_marginBottom底部距离 
内边距
android:padding

整体距离

android:paddingTop顶部距离
android:paddingLeft  /  android:paddingStart左部距离
android:paddingRight  /  android:paddingEnd右部距离
android:paddingBottom底部距离

标注:左右的距离有两种表现形式,以左为例,一种是Left一种是Start,这里主要是跟版本有关,4.2以上用Start代替Left,同理右部。

(4)定位:andorid:orientation

简单明了就是控件怎么布局,它有两个属性,水平的horizontal,垂直的vertical。

<!-- android:orientation="vertical" 垂直-->
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="400dp"
        android:orientation="vertical"
        >
        <androidx.appcompat.widget.AppCompatButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@color/blue"
            />
        <androidx.appcompat.widget.AppCompatButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@color/pink"
            />
        <androidx.appcompat.widget.AppCompatButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="#00FF99"
            />
        <androidx.appcompat.widget.AppCompatButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="#AA6699"
            />
    </LinearLayout>

<!-- android:orientation="horizontal" 水平-->
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="400dp"
        android:orientation="horizontal"
        >
        <androidx.appcompat.widget.AppCompatButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@color/blue"
            />
        <androidx.appcompat.widget.AppCompatButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@color/pink"
            />
        <androidx.appcompat.widget.AppCompatButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="#00FF99"
            />
        <androidx.appcompat.widget.AppCompatButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="#AA6699"
            />
    </LinearLayout>

在一个布局中只能有一种排列方式,要么垂直要么水平,如果想多实现,可以多用几个布局,分模块的进行布局管理 。

(5)对齐方式:andorid:gravity  

对齐方式就是布局中的控件所在的位置,我们现在主要的阅读方式为从左向右,从上向下,所以,再添加控件时,会自动的放于左上角,切记第一条属性是写在大布局中的,而不是单个的控件中,以此段代码为例,第二个可以放置在控件中调整位置,在此处我们以第一种方式为例,因为内容大同小异,只是编写的位置不同罢了 

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="400dp"
        android:orientation="vertical"
        android:gravity="center"
        >
        <androidx.appcompat.widget.AppCompatButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@color/blue"
            />
        <androidx.appcompat.widget.AppCompatButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@color/pink"
            />
        <androidx.appcompat.widget.AppCompatButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="#00FF99"
            />
        <androidx.appcompat.widget.AppCompatButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="#AA6699"
            />
    </LinearLayout>
对齐方式
andorid:gravity="center"整体居中
andorid:gravity="left"  /  andorid:gravity="start"  /  andorid:gravity="top"左部
andorid:gravity="right"  /  andorid:gravity="end"右部
andorid:gravity="bottom"底部
andorid:gravity="center_horizontal"水平居中
andorid:gravity="center_vertical"垂直居中

2.权重:andorid:layout_weight

权重就是控件所占剩余布局的比例问题,怎样分配问题

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal"
        android:background="#e50c0c"
        >
        <LinearLayout
            android:layout_width="0dp"
            android:layout_height="fill_parent"
            android:background="#ffc0cb"
            android:layout_weight="1"  />
        <LinearLayout
            android:layout_width="0dp"
            android:layout_height="fill_parent"
            android:background="#0000ff"
            android:layout_weight="1"  />
    </LinearLayout>

权重andorid:layout_weight=”“的值是可以随便定义的,里面的数字相当于权重,设置的数字相加为整个布局的大小,比如以上代码为例,第一个控件权重为1,第二个也为1,也就是说整个布局大小为2,两个控件各占1,数字可以任意更改,控件也可以任意添加,重要的是美观如下图

将一个控件的权重设置为2,则它 占整个布局的三分之二

0dp的设置一般情况都是因为权重问题,这样便可以按照自己所设置的比例进行显示,水平布局设置width,垂直布局设置height=0dp。

前面提到了权重是占剩余部分的占据比例,是因为我们在设计时不一定都是0dp,有可能提前某个控件设置了长度或是高度,这时,如果我们再用权重属性,分开的就是整个布局剩下没有占用的部分,例如:同样的代码,我将第一个LinearLayout的宽度提前设置了200dp。现在来看看效果

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal"
        android:background="#e50c0c"
        >
        <LinearLayout
            android:layout_width="200dp"
            android:layout_height="fill_parent"
            android:background="#ffc0cb"
            android:layout_weight="1"  />
        <LinearLayout
            android:layout_width="0dp"
            android:layout_height="fill_parent"
            android:background="#0000ff"
            android:layout_weight="2"  />
    </LinearLayout>

 第一个控件先占了整个布局的一部分,剩余的部再进行分割。

附加:Java代码中设置weight属性

1.在activity_main.xml文件中新建一个<LinearLayout>

    <LinearLayout
        android:id="@+id/abc"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal"
        android:background="#e50c0c"
        >
    </LinearLayout>

2.在 MainActivity.java 文件中设置weight

package com.example.example;

import android.os.Bundle; 
import android.widget.Button;
import android.widget.LinearLayout; 
import androidx.appcompat.app.AppCompatActivity; 
public class MainActivity extends AppCompatActivity { 

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        // 创建一个 LinearLayout 对象
        LinearLayout linearLayout = new LinearLayout(MainActivity.this);
        // 设置 LinearLayout 的布局方向为垂直
        linearLayout.setOrientation(LinearLayout.VERTICAL);
        // 创建一个按钮对象
        Button button = new Button(MainActivity.this);
        button.setText("点击");
        // 创建 LinearLayout.LayoutParams 对象并设置相应参数
        LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.MATCH_PARENT,
                LinearLayout.LayoutParams.WRAP_CONTENT
        );
        layoutParams.weight = 1.0f;
        // 将布局参数应用到按钮上
        button.setLayoutParams(layoutParams);
        // 将按钮添加到 LinearLayout 中
        linearLayout.addView(button);
        LinearLayout rootLayout = findViewById(R.id.abc);
        // 将 LinearLayout 添加到活动的根布局中
        rootLayout.addView(linearLayout);
    } 
}

 3.运行应用 即可

3. 为LinearLayout设置分割线 

(1)直接在布局中添加一个view
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:layout_marginTop="16dp"
    android:layout_marginBottom="16dp">

    <!-- 添加一条细线作为背景 -->
    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="#000000" />

    <!-- 在这里添加其他布局元素 -->

</LinearLayout>

(2)第二种是使用LinearLayout的一个divider属性

直接为LinearLayout设置分割线 这里就需要自己准备一张线的图片了

a. android:divider 设置作为分割线的图片

 src/main/res/drawable 下面创建 ktv_line_div.xml 内容为:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <solid android:color="#808080" /> <!-- 灰色背景 -->
    <size android:height="1dp" /> <!-- 定义细线高度为1dp -->
</shape>

b. android:showDividers 设置分割线的位置,none(无),beginning(开始),end(结束),middle(每两个组件间)

c. android:dividerPadding 设置分割线的可以控制分隔线与子视图之间的间距,使布局在显示分隔线时具有更灵活的外观效果,主要用于 AdapterView(如ListViewGridView)中的分隔线样式

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/LinearLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:divider="@drawable/ktv_line_div"
    android:orientation="vertical"
    android:showDividers="middle"
    android:dividerPadding="10dp"  >
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="按钮1" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="按钮2" />

</LinearLayout>

应用之后就可以看到细线

4. 注意事项

使用Layout_gravity的一个很重要的问题

问题内容: 在一个LinearLayout的水平方向中布置两个TextView,想让一个左,一个右,怎么搞? 

<LinearLayout 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"
    android:orientation="horizontal"  >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="200dp"
        android:layout_gravity="left"
        android:background="#ffc0cb"
        android:gravity="center"
        android:text="~~~~~~~pink......" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="200dp"
        android:layout_gravity="right"
        android:background="#0000ff"
        android:gravity="center"
        android:text="~~~~~~~blue......" />
</LinearLayout>

运行结果:

 看到这里,可能会想在外层LinearLayout加个 android:gravity="left" 的属性,然后设置第二个 TextView android:layout_gravity  android:layout_gravity=“right" 

<LinearLayout 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"
    android:orientation="horizontal"  
    android:gravity="left"   >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="200dp"
        android:layout_gravity="left"
        android:background="#ffc0cb"
        android:gravity="center"
        android:text="~~~~~~~pink......" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="200dp"
        android:layout_gravity="right"
        android:background="#0000ff"
        android:gravity="center"
        android:text="~~~~~~~blue......" />
</LinearLayout>

运行结果没变化:

小编想说当  android:orientation="vertical" 时, 只有水平方向的设置才起作用,垂直方向的设置不起作用。 即: left  right center_horizontal  是生效的。 当  android:orientation="horizontal" 时, 只有垂直方向的设置才起作用,水平方向的设置不起作用。 即: top bottom center_vertical  是生效的。

当改成  android:orientation="vertical" 时,看一下效果:

综上可看出,仍然没有实现想要对结果,像这种情况是建议使用 RelativeLayout(相对布局)

非要用LinearLayout的解决的话也可以:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/LinearLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >

    <TextView
        android:layout_width="0dp"
        android:layout_height="200dp"
        android:layout_weight="1"
        android:background="#0000ff"
        android:gravity="center"
        android:text="O(∩_∩)O哈哈~" />

    <View
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_weight="1" />

    <TextView
        android:layout_width="130dp"
        android:layout_height="200dp"
        android:background="#ffc0cb"
        android:gravity="center"
        android:text="(*^__^*) 嘻嘻……" />

</LinearLayout>

在两个 TextView 之间添加了一个空的 View,并将它的 layout_weight 设置为 1。这样第二个 TextView 就会被挤到右边,并且两个 TextView 以及中间的 View 将占据同样的空间,实现了水平方向上的靠右对齐。

三、总结

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机视觉在自动驾驶汽车中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 计算机视觉在自动驾驶汽车中的应用 计算机视觉在自动驾驶汽车中的应用 计算机视觉在自动驾驶汽车中的应用 引言 计算机视觉在自动…

表格的选择弹窗,选中后返显到表格中

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 表格的下拉框可以直接显示选项&#xff0c;那如果选择框不是下拉的&#xff0c;而是弹窗&#xff0c;那么在表格中如何返显呢&#xff1f; 问题描述 如上图所示&#xff0c;点击表格中的选择&#xf…

金融领域先锋!海云安成功入选2024年人工智能先锋案例集

近日&#xff0c;中国人工智能产业发展联盟《2024年人工智能先锋案例集》&#xff08;以下简称“AIIA先锋案例集”&#xff09;在中国人工智能产业发展联盟第十三次全体会议上正式发布。该案例集由人工智能产业发展联盟&#xff08;AIIA&#xff09;、工业和信息化部新闻宣传中…

HarmonyOs鸿蒙开发实战(16)=>沉浸式效果第一种方案一窗口全屏布局方案

1.沉浸式效果的目的 开发应用沉浸式效果主要指通过调整状态栏、应用界面和导航条的显示效果来减少状态栏导航条等系统界面的突兀感&#xff0c;从而使用户获得最佳的UI体验。 2.窗口全屏布局方案介绍 调整布局系统为全屏布局&#xff0c;界面元素延伸到状态栏和导航条区域实现沉…

OpenAI震撼发布:桌面版ChatGPT,Windows macOS双平台AI编程体验!

【雪球导读】 「OpenAI推出ChatGPT桌面端」 OpenAI重磅推出ChatGPT桌面端&#xff0c;全面支持Windows和macOS系统&#xff01;这款新工具为用户在日常生活和工作中提供了前所未有的无缝交互体验。对于那些依赖桌面端进行开发工作的专业人士来说&#xff0c;这一更新带来了令人…

Android OpenGLES2.0开发(八):Camera预览

严以律己&#xff0c;宽以待人 引言 终于到该章节了&#xff0c;还记得Android OpenGLES2.0开发&#xff08;一&#xff09;&#xff1a;艰难的开始章节说的吗&#xff1f;写这个系列的初衷就是因为每次用到GLSurfaceViewCamera预览时&#xff0c;总是CtrlC、CtrlV从来没有研究…

独立站干货:WordPress主机推荐

WordPress作为全球最受欢迎的独立站建设平台&#xff0c;提供了灵活性和强大的功能&#xff0c;使得建站变得简单而高效。本文将为您详细介绍WordPress建站的流程&#xff0c;并推荐几款实测后觉得好用的主机商。 WordPress建站流程 域名注册 首先需要注册一个域名&#xff0c…

细说STM32单片机DMA中断收发RTC实时时间并改善其鲁棒性的方法

目录 一、DMA基础知识 1、DMA简介 (1)DMA控制器 (2)DMA流 (3)DMA请求 (4)仲裁器 (5)DMA传输属性 2、源地址和目标地址 3、DMA传输模式 4、传输数据量的大小 5、数据宽度 6、地址指针递增 7、DMA工作模式 8、DMA流的优先级别 9、FIFO或直接模式 10、单次传输或突…

基于Spring Boot+Vue的多媒体素材管理系统的设计与实现

一.系统开发工具与环境搭建 1.系统设计开发工具 后端使用Java编程语言的Spring boot框架 项目架构&#xff1a;B/S架构 运行环境&#xff1a;win10/win11、jdk17 前端&#xff1a; 技术&#xff1a;框架Vue.js&#xff1b;UI库&#xff1a;ElementUI&#xff1b; 开发工具&…

如何禁用关闭奇安信天擎开机自启动教程

前言 公司要求我们员工每个电脑上都要安装奇安信防护软件&#xff0c;但是身为开发&#xff0c;这个软件占内存不说&#xff0c;还禁用我们电脑上todesk等远程软件&#xff0c;因为我们给客户部署的项目&#xff0c;部署的有软件服务&#xff0c;经常需要用到todesk等远程软件…

[Docker#8] 容器配置 | Mysql | Redis | C++ | 资源控制 | 命令对比

目录 一&#xff1a;Mysql 容器化安装 二&#xff1a;Redis 容器化安装 Redis 简介 Redis 容器创建 三&#xff1a;C容器制作 四&#xff1a;容器资源更新 常见问题 一&#xff1a;Mysql 容器化安装 进入 mysql 的镜像网站&#xff0c;查找 mysql 的镜像 mysql docker…

CentOS 修改服务器登录密码的完整指南

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

深入理解Redis(七)----Redis实现分布式锁

基于Redis的实现方式 1、选用Redis实现分布式锁原因&#xff1a; &#xff08;1&#xff09;Redis有很高的性能&#xff1b; &#xff08;2&#xff09;Redis命令对此支持较好&#xff0c;实现起来比较方便 2、使用命令介绍&#xff1a; &#xff08;1&#xff09;SETNX SETNX …

Uniapp运行环境判断和解决跨端兼容性详解

Uniapp运行环境判断和解决跨端兼容性 开发环境和生产环境 uniapp可通过process.env.NODE_ENV判断当前环境是开发环境还是生产环境&#xff0c;一般用于链接测试服务器或者生产服务器的动态切换。在HX中&#xff0c;点击运行编译出来的代码是开发环境&#xff0c;点击发行编译…

WPF MVVM框架

一、MVVM简介 MVC Model View Control MVP MVVM即Model-View-ViewModel&#xff0c;MVVM模式与MVP&#xff08;Model-View-Presenter&#xff09;模式相似&#xff0c;主要目的是分离视图&#xff08;View&#xff09;和模型&#xff08;Model&#xff09;&#xff0c;具有低…

【nginx】client timed out和send_timeout的大小设置

websocket连接会断开&#xff0c;抓包检查后发现是中间的代理服务器nginx断开的&#xff0c;同时将后端和浏览器都断开了。将nginx日志调到debug级别后&#xff0c;有下面的断开信息。 [info] 125923#125923: *34 client timed out (110: Connection timed out) while proxyin…

python视频编辑中的蒙版技术:创意与技术相结合

在数字视频编辑的世界里&#xff0c;蒙版技术是一种强大的工具&#xff0c;它允许我们在视频帧上进行精确的编辑和效果叠加。通过蒙版&#xff0c;我们可以控制哪些部分的视频内容被显示或隐藏&#xff0c;从而创造出各种视觉效果和过渡。在本文中&#xff0c;我们将探讨如何使…

前端算法:树(力扣144、94、145、100、104题)

目录 一、树&#xff08;Tree&#xff09; 1.介绍 2.特点 3.基本术语 4.种类 二、树之操作 1.遍历 前序遍历&#xff08;Pre-order Traversal&#xff09;&#xff1a;访问根节点 -> 遍历左子树 -> 遍历右子树。 中序遍历&#xff08;In-order Traversal&#xf…

【代码审计】常见漏洞专项审计-业务逻辑漏洞审计

❤️博客主页&#xff1a; iknow181 &#x1f525;系列专栏&#xff1a; 网络安全、 Python、JavaSE、JavaWeb、CCNP &#x1f389;欢迎大家点赞&#x1f44d;收藏⭐评论✍ 0x01 漏洞介绍 1、 原理 业务逻辑漏洞是一类特殊的安全漏洞&#xff0c;业务逻辑漏洞属于设计漏洞而非实…

Spring Boot汽车资讯:数字化时代的驾驶

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式&#xff0c;是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示&#xff1a; 图4-1系统工作原理…