android布局文件详解

android布局文件详解本文是我从DeclaringLayout翻译而来的文章,如果有不当之处请指出DeclaringLayout布局决定了Activity所展现的样子,他决定了布局的结构和控制着你展现给用户所有的元素,你可以通过两种方式来声明你的布局.①在xml文件中定义UI元素:android提供了与View类及其子类相关的简单易懂的标签。   ②在运行时期定义你的布局,即

大家好,又见面了,我是你们的朋友全栈君。

本文是我从Declaring Layout翻译而来的文章,如果有不当之处请指出

Declaring Layout

布局决定了Activity所展现的样子,他决定了布局的结构和控制着你展现给用户所有的元素,你可以通过两种方式来声明你的布局.

①在xml文件中定义UI 元素:android提供了与View 类及其子类相关的简单易懂的标签。

     ②在运行时期定义你的布局,即采用代码的方式完成布局。你可以在程序中创建View和ViewGroup对象,并且可以操作他们。

      android的框架可以让你灵活的使用一种或者两中方式来控制你的布局。例如,你可以在布局文件中声明应用默认的布局方式,包括屏幕中会出现的元素以及这些元素的属性,但是你可以在程序运行的时候,修改这些元素的属性。

      采用xml文件布局的好处就是你可以将需要显示元素从你控制层的代码中分离出来,你描述UI的部分和应用的代码是分离的,这让你想修改这些布局文件时不需要考虑去修改应用的代码并且重新编译。例如你为不同方向的屏幕,不同大小、语言的设备,创建了不同的xml布局文件,你都不需要修改源码。此外通过布局文件的方式,你可以更加方便的想象你布局文件的结构,这样也方便了你来解决其中的问题,如果你坚持使用代码的方式来控制UI,请看View和ViewGroup的说明。

      一般来说,布局xml的标签与UI元素的含义十分接近,标签的属性和相应类的属性也是一致的,实际上你可以根据xml标签猜出这个标签对应了那个类,并且根据属性来猜出与之对应的类的相应方法了。但是需要注意的是并不是所有的标签都是等同的。在一些情况下,有一些轻微的命名区别。例如EditText标签有text属性,与这个属性对应的方法是Edit.setText()。

ps:通过 Common Layout Objects可以学习到更多的不同布局类型,同时通过开发手册的Hello Views!也可以学习到布局文件的使用。


写布局文件

通过android布局文件的标签,你可以快速的设计出用户界面的布局,和布局文件中包含的元素,正如你使用html设计你的布局一样。

   每一个布局文件都只能有一个根元素,并且与这个根元素对应的类是View或者是ViewGroup。在你定义了根元素之后,你可以通过添加其他的布局对象或者视图组件作为子元素来完成你的布局。例如下面的布局文件中就包含了一个TextVivew或者一个Button.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="fill_parent" 
              android:layout_height="fill_parent" 
              android:orientation="vertical" >
    <TextView android:id="@+id/text"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:text="Hello, I am a TextView" />
    <Button android:id="@+id/button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Hello, I am a Button" />
</LinearLayout>


在你完成了布局文件的声明之后,把他作为一个xml文件保存在项目的res/layout文件夹下面,系统会自动完成编译。我们在稍后会讨论每一个出现的属性和标签。


加载布局文件

当你完成了布局文件的声明之后,每一个xml布局文件都会被编译到一个View对象里面,你应该在你代码的onCreate方法中中来加载得到这个View对象。做法是通过调用setContentView()方法将R.layout.your_layout_name作为一个int类型的参数传递进去。例如你保存的xml文件名是main_layout.xml.你需要按照下面的方式来加载你的Activity

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView.(R.layout.main_layout);
}

onCreate方法会在Activity启动的时候被系统的调用。


属性

每一个View和ViewGroup对象都会与之相匹配的属性,一些属性是专属于View对象的,例如TextView支持textSize属性,但是其他继承了TextView的类也会支持这个属性,一些属性是通用于所有的View对象的,因为这些对象都是继承于View类,例如id属性。同时,例如有些对象支持layout parameters属性,它描述了View对象的布局属性,这些对象都是继承于ViewGroup。


ID

    每一个View对象都有一个与之关联的int类型的id,作为区别其他对象的根据,当应用被编译完成的时候,id会作为一个int类型的数值,但是在xml布局文件中它是android:id的值,作为一个字符串类型存在。这是所有的View 对象都会有的属性,这个属性是被View所定义的,所有继承于这个类的子类都会有id属性,你会经常需要使用它。声明id属性的语法如下

android:id="@+id/my_button"


@符号表示xml应该将这个id字符串后面的作为一个id来解析,+android布局文件详解号表示这是一个新定义的资源,应该被创建并且添加我们项目的R.java文件中,同时android系统也会提供一些其他的id资源,当需要引用android系统的id时,不要使用 + 号,但是需要使用android,如下

android:id="@android:id/empty"


当使用了@android来引用一个资源的时候,我们应用的就是一个系统提供的资源而不是本地的资源。为了能够创建一个view对象,并且能够在代码中引用到这些定义的资源,一个通常的模式如下图。

1.首先定义一个布局文件并且给他们一个唯一的id

<Button android:id="@+id/my_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/my_button_text"/>

2.然后创建一个相应类的实例。

Button myButton = (Button) findViewById(R.id.my_button);

注意:在相对布局中使用id来区别对象是十分重要的,元素之间确定相对的位置都是用id来引用的。

Layout Parameters

名称为layout_*的布局文件属性,让视图在包含其的容器内有一个相对合理位置。每一个ViewGroup 类都包含了一个继承于ViewGroup.LayoutParams的嵌套类,这个子类包含了定义子视图位置和大小的属性,正如你看到的图,每个父类视图都为子视图定义了布局参数。


android布局文件详解


需要注意的是:每一个LayoutParams的子类都有它自己的设定值的语法,每一个子类使用这些布局参数都应该语气父类相匹配(例如,线性布局中就没有每个元素之间的相对位置)。每一个view都要求去定义layout_width和layout_height属性,许多布局文件都有可以选择定义边框和内框距离,你可以通过设定具体的数字来指定view的大小,但是你可能更多的会使用下面的常量来定义这些值。

wrap_content 让view包裹其中的子视图,其中子视图的大小决定了view的大小

fill_parent 填充父类的大小,父类有多大,view就有多大。

一般来说,使用绝对的像素值类确定view的大小是不被推荐的。你应该使用一些相对的数字来替代,例如dp或者wrap_content ,fill_parent。这将帮助你的应用能够适用于不同大小的设备。


Layout Position

一个视图的几何形状是矩形的,每个视图都有位置,表示为坐标,同时还有两个尺寸,表示为宽和高,坐标和尺寸的单位都是像素。

如果需要得到视图的位置,可以通过getLeft和getTop两个方法得到,返回的值可以分别作为视图左上角的坐标。这些方法返回的值都是相对于其父类的,例如,当getLeft返回的值是20,这说明view距离它的直接父容器的左边20

此外,还有一些简单的方法能够让你免于计算,例如getRight和getBottom;这些方法分别返回其右边的x坐标,和底边的Y坐标,例如 getRight相当于 getLeft + getWidth



Size ,Padding,和 Margins


视图的大小实际上表示为宽和高,一个视图实际上拥有了两个宽度值和高度值。

第一对值作为测量宽和测量高。这些数值表示了这个视图想在其父类中占有多大的位置。这个数据可以通过getMeasuredWidth和getMeasuredHeight

第二对 数据值作为width和 height ,这个数据定义了视图在屏幕上的实际大小,这些数据不需要和measured width与measured height完全不一样,这些数据可以通过getWidth 和 getHeight得到。

为了测量其尺寸,视图将它的填充数据(padding)计算在内了。尽管view提供了对padding的支持,但是并没有提供对margins的支持,但是ViewGroup却提供了。




































视图实际上拥有两对宽度和高度值。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/137255.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • USB 驱动彻底删除「建议收藏」

    USB 驱动彻底删除「建议收藏」最近做USB自定义设备开发,遇到以下问题,应该算是解决了,特地写出来和大家分享。在进行USB设备开发的时候,经常需要更改USB设备的名称或者pid、vid等,特别是进行自定义USB设备,自己写驱动程序的时候,会出现一个问题就是:设计了一个USB设备,插到电脑上通过安装驱动可以正常试用。后来修改了USB设备的设备名称pid、vid,再插上电脑,还是显示原来的设备名称

    2022年10月20日
  • matlab2016a安装教程win10(matlab2015安装教程)

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012313335/article/details/73733651 </div> <linkrel=”stylesheet…

  • 可执行源码:基于javaweb实现学生成绩管理系统,三种角色学生和教师 管理员,实现了学生信息管理,课程管理,教师信息管理,学生成绩汇总,学生登录注册,教师和管理员的登录,个人信息修改等[通俗易懂]

    可执行源码:基于javaweb实现学生成绩管理系统,三种角色学生和教师 管理员,实现了学生信息管理,课程管理,教师信息管理,学生成绩汇总,学生登录注册,教师和管理员的登录,个人信息修改等[通俗易懂]基于javaweb实现学生成绩管理系统,实现了学生信息管理,课程管理,教师信息管理,学生成绩汇总,学生登录注册,教师和管理员的登录,个人信息修改等。系统功能大致描述:基于javaweb实现学生成绩管理系统,实现了学生信息管理,课程管理,教师信息管理,学生成绩汇总,学生登录注册,教师和管理员的登录,个人信息修改等。使用的技术有jsp,servlet,jdbc,mysql,html,css,js…

  • Matlab基本函数 length函数

    Matlab基本函数 length函数分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1、length函数:

  • 搭建云计算平台(云计算管理平台搭建)

    搭建云计算平台Openstack是一个开源项目。任何公司或个人都可以构建自己的云计算环境,这已经打破了亚马逊等少数公司的垄断,意义重大。简介:如果你是开源社区的CTO或代码贡献者,你一定听说过openstack。Openstack是由网络主机服务提供商Rackspace和NASA联合发起的一个开源项目。其目的是开发一套开源软件标准。任何公司或个人都可以建立自己的云计算环境(IAAs),这打破了亚…

  • 图卷积网络 GCN Graph Convolutional Network(谱域GCN)的理解和详细推导[通俗易懂]

    图卷积网络 GCN Graph Convolutional Network(谱域GCN)的理解和详细推导[通俗易懂]文章目录1.为什么会出现图卷积神经网络?2.图卷积网络的两种类型2.1vertexdomain(spatialdomain):顶点域(空间域)2.2spectraldomain:频域方法(谱方法)3.什么是拉普拉斯矩阵?3.1常用的几种拉普拉斯矩阵普通形式的拉普拉斯矩阵对称归一化的拉普拉斯矩阵(SymmetricnormalizedLaplacian)随机游走归一化拉普拉斯矩…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号