Android入门开发之Linearlayout布局(七)

前言

上一节我们主要讲解了linux下的权限说明,今天我们来了解一下Android中的UI设计,聊聊android中常用的布局。

android中的布局主要有六种,分别是线性布局(LinearLayout),相对布局(Relativelayout),帧布局(FrameLayout),网格布局(GridLayout)以及绝对布局(AbsoluteLayout)和表格布局(TableLayout),在这六种布局中,我们比较常用的就是线性布局和相对布局以及帧布局,所以在布局方面,我打算主要围绕这三个布局去展开,其他的布局我就不一一概述了,因为用的实在是太少了。以后去面试android基础工程师,你只需要知道andriod中的布局有六种,以及是哪六种就够了。面试官不会去深入问你是否知道AbsoluteLayout布局如何使用等等问题。

对每一个android开发者来说,屏幕适配都是一个很令人头疼的问题,由于市面上的android机型太多,各式各样屏幕分辨率的android手机数不胜数,尤其是还有很多比较奇葩的设备,所以我们也只能做到对大多数屏幕适配,还有少数的设备市场占有量不大,就直接忽略了。既然是做屏幕适配,自然是需要在布局上下功夫,而我们在做适配的时候用到的最多的就是线性布局中的权重属性(weight)了。在这一节中,我将会详细的解析LinearLayout,包括一些基本的属性。

布局中的属性很多,如果要我们全都掌握的话,可能有点不太现实,基本上很少有人去记布局的全部属性,常用的属性就那几个,我们也只讲那些比较常用的属性。基本上这个布局的一部分属性你掌握了,其他的属性,你自己都可以猜出来的。

布局的属性分类

线性布局常用的属性如下:

1. layout_width  (控件和布局必不可少的属性)
    1. 布局的宽度:两种可选值
        1. match_parent  填充父窗体(fill_parent: 这个属性也是填充父窗体的,只是早已经被废弃掉了,不推荐使用)
        2. wrap_content  包裹内容
        3. 自定义宽度。比如我定义高度为20dp(宽度高度的度量单位是dp, 字体的度量单位是sp)
2. layout_height (控件和布局必不可少的属性)
    1. 布局的高度:两种可选值
        1. match_parent 填充父窗体
        2. wrap_content 包裹内容
        3. 自定义高度。比如我定义高度为20dp(宽度高度的度量单位是dp, 字体的度量单位是sp)
3. orientation(线性布局的方向)
    1. vertical 垂直
    2. horizontal 水平方向
4. id(布局的标识,方便我们在代码中通过findViewById来找到这个控件)
5. background: 布局的背景(一般用资源文件夹下的图片来引用,也可以直接使用十六进制的颜色来表示)
6. weight:权重(按比例分配布局中的元素所占的空间)
7. margin 家族
    1. margin_left:  距左边的距离
    2. margin_right: 距右边的距离
    3. margin_top: 距上边的距离
    4. margin_bottom: 距下边的距离
8. padding 家族: 和margin一样,只不过margin是外边距,而padding是内边距
9. gravity: 文字在控件中的位置
10. layout_gravity: 控件在布局中的位置

属性详解

单纯的讲解属性是没什意思,我们结合一个例子来看看linearLayout的具体用法。

  1. 首先我们来看一张QQ登录的图片
  2. 这很明显就是一个垂直的线性布局,接下来我们来实现这样的布局。
  3. 源代码如下
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:orientation="vertical"
          android:layout_width="match_parent"
          android:layout_height="match_parent">
    
        <LinearLayout
            android:layout_marginRight="20dp"
            android:layout_marginLeft="20dp"
            android:layout_marginTop="20dp"
            android:orientation="horizontal"
            android:layout_width="match_parent"
            android:layout_height="40dp">
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="用户名:"/>
            <EditText
                android:layout_weight="1"
                android:layout_width="0dp"
                android:hint="请输入用户名"
                android:layout_height="wrap_content"/>
        </LinearLayout>
        <LinearLayout
            android:layout_marginTop="20dp"
            android:layout_marginRight="20dp"
            android:layout_marginLeft="20dp"
            android:orientation="horizontal"
            android:layout_width="match_parent"
            android:layout_height="40dp">
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="密 码:"/>
            <EditText
                android:layout_weight="1"
                android:layout_width="0dp"
                android:hint="请输入密码"
                android:layout_height="wrap_content"/>
        </LinearLayout>
        <Button
            android:layout_marginRight="20dp"
            android:layout_marginLeft="20dp"
            android:layout_marginTop="20dp"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="登录"/>
    </LinearLayout>
    
  4. 运行截图如下

    那边还有忘记密码和记住密码两个控件我没有写进来,我是故意的,我想聪明的你一定也知道如果将这两个控件如何加入到我们的登录界面中。

weight 权重属性

  1. 这个属性是我们在使用线性布局的时候比较常用的一个属性,它讲究的是按比例分配屏幕尺寸。如果我们使用了权重属性,那么我们必须要指定控件的宽度或者高度为0。那么如何划分呢?一句话,如果是在水平方向上平分控件,那么宽度就指定为0, 如果是在垂直方向上平分控件,那么高度就指定为0
  2. 权重的基本用法

    效果图如下:(截图效果不好,原谅我还没在mac上找好比较好用的截图软件)

    实现代码如下:

    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/activity_main"
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context="com.selfassu.layoutdemo.MainActivity">
    
        <TextView
            android:background="#f00"
            android:layout_weight="1"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:text="Hello World!"/>
        <TextView
            android:background="#0f0"
            android:layout_weight="1"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:text="Hello World!"/>
    
    </LinearLayout>
    

    其实实现非常简单,细心的小伙伴肯定已经看出来了,我在下面的两个TextView中给它们分别都设置了权重等于1, 这是如何理解的呢?两个权重的和为2,那么第一个TextView占一份,另外一个TextView占一份。总共是两份,它们没人占一分,所以它们平分了,如果我想要第一个红色的TextView占两份,绿色的TextView占一份,那又该如何做呢?我们只需要将第一个TextView的weight值改成2,另外一个改成1就可以了。那么红色就占了总数(3)的2/3,绿色就占了总数的1/3,这样它们就是2:1的比例了,是不是特别简单?剩下的就要靠你们自己去摸索了,学会熟练运用权重,对我们以后做屏幕适配可是有很大的帮助哟!

总结

在这一节我们就已经了解了线性布局的大部分用法了,剩下的就靠你们自己去学习了。是不是觉得线性布局很简单?其实每一种布局都是很简单的。好啦,在下一节我们继续讲一下相对布局的用法!

时间: 2024-08-24 16:56:22

Android入门开发之Linearlayout布局(七)的相关文章

Android入门开发之SD卡读写操作(转)

SD卡的读写是我们在开发android 应用程序过程中最常见的操作.下面介绍SD卡的读写操作方式: 1. 获取SD卡的根目录 [java] view plaincopy String  sdCardRoot = Environment.getExternalStorageDirectory().getAbsolutePath(); 2. 在SD卡上创建文件夹目录 [java] view plaincopy /** * 在SD卡上创建目录 */ public File createDirOnSDC

【Android】Android软件开发之ListView 详解

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://xys289187120.blog.51cto.com/3361352/657171 ListView的使用方法 ListView是Android软件开发中非常重要组件之一,基本上是个软件基本都会使用ListView ,今天我通过一个demo来教大家怎么样使用ListView组件 绘制出漂亮的列表,说道ListView就不得不说Adapter适配器,因为只有通过Adapter才可

Android混合开发之WebViewJavascriptBridge实现JS与java安全交互

前言: 为了加快开发效率,目前公司一些功能使用H5开发,这里难免会用到Js与Java函数互相调用的问题,这个Android是提供了原生支持的,不过存在安全隐患,今天我们来学习一种安全方式来满足Js与java互相调用的需求.它就是WebViewJavascriptBridge. 学习动机: 先看下之前的解决办法:Android混合开发之WebView与Javascript交互 最近棒棒安全的一个市场推广来我们公司推广他们的产品,当时也没太引起我的注意,后来这个市场推广人员把我们的app的进行了他们

android软件开发之webView.addJavascriptInterface循环渐进【一】

本篇文章由:http://www.sollyu.com/android-software-development-webview-addjavascriptinterface-cycle-of-gradual-one/ 说明 文章列表 android软件开发之webView.addJavascriptInterface循环渐进[一]: http://www.sollyu.com/?p=302 android软件开发之webView.addJavascriptInterface循环渐进[二]: h

Android 安全开发之 ZIP 文件目录遍历

1.ZIP文件目录遍历简介 因为ZIP压缩包文件中允许存在"../"的字符串,攻击者可以利用多个"../"在解压时改变ZIP包中某个文件的存放位置,覆盖掉应用原有的文件.如果被覆盖掉的文件是动态链接so.dex或者odex文件,轻则产生本地拒绝服务漏洞,影响应用的可用性,重则可能造成任意代码执行漏洞,危害用户的设备安全和信息安全.比如近段时间发现的"寄生兽"漏洞.海豚浏览器远程命令执行漏洞.三星默认输入法远程代码执行漏洞等都与ZIP文件目录遍历有

Android快速开发之appBase——(6).HttpReq和APICloudSDK

Android快速开发之appBase--(6).HttpReq和APICloudSDK HttpReq和APICloudSDK都是网络请求组件,都是基于xUtils的HttpUtils重新封装的.接下来讲一下使用方法. 1.HttpReq 看以看到有这么几个方法 GET:GET方式请求 POST:普通的POST表单提交 POST:将数据以流的形式传递 /** * POST请求,用InputStream的方式传递请求参数 * * @param api * 接口地址 * @param reques

Android底层开发之Audio HAL

http://blog.csdn.net/kangear/article/details/44939429 Android底层开发之Audio HAL 在Android音频底层调试-基于tinyalsa中以「抛开Android的天生复杂,回归嵌入式Linux的本质」的方式介绍如何调试Linux内核中的音频驱动. 这里向上再伸展一下进入HAL层,看是如何将tinyalsa封装给Frameworks使用的. 基于4.2.2版本源码进行讨论.Android官方教程是Audio Implementing

Android底层开发之Linux输入子系统要不要推断系统休眠状态上报键值

Android底层开发之Linux输入子系统要不要推断系统休眠状态上报键值 题外话:一个问题研究到最后,那边记录文档的前半部分基本上都是没用的,甚至是错误的. 重点在最后,前边不过一些假想猜測. http://blog.csdn.net/kangear/article/details/40072707 在调试一下红外遥控器input驱动时,直接採用的是一个半成品的驱动在上边实现的自己的设备的匹配,但同一时候遇到了一些关于input输入子系统的疑惑. 按键一般有「按下和抬起」两个状态一般使用0和1

Android驱动开发之Hello实例

Android驱动开发之Hello实例: 驱动部分 modified:   kernel/arch/arm/configs/msm8909-1gb_w100_hd720p-perf_defconfig modified:   kernel/arch/arm/configs/msm8909-1gb_w100_hd720p_defconfig modified:   kernel/drivers/input/misc/Kconfig modified:   kernel/drivers/input/