第一章:不从Hello World开始的编程笔记

Android布局简介


View与ViewGroup的简介

在Android APP中,所有的用户界面元素都是由View和ViewGroup的对象构成的。View是绘制在屏幕上的用户能与之交互的一个对象。而ViewGroup则是一个用于存放其他View(和ViewGroup)对象的布局容器! Android为我们提供了一个View和ViewGroup子类的集合,集合中提供了一些常用的输入控件(比如按钮和文本域)和各种各样的布局模式(比如线性或相对布局)。

你的APP的用户界面上的每一个组件都是使用View和ViewGroup对象的层次结构来构成的。每个ViewGroup都是要给看不见的用于组织子View的容器,而它的子View可能是输入控件 或者在UI上绘制了某块区域的小部件。有了层次树,你就可以根据自己的需要,设计简单或者复 杂的布局了(布局越简单性能越好)。

定义你的布局,你可以在代码中实例化View对象并且开始构建你的树,但最容易和最高效的方式来定义你的布局则是使用一个XML文件,用XML来构成布局更加符合人的阅读习惯,而XML类似与HTML 使用XML元素的名称代表一个View。所以< TextView >元素会在你的界面中创建一个TextView控件,而一个< LinearLayout >则会创建一个LinearLayout的容器! 举个例子,一个简单简单的垂直布局上面有一个文本视图和一个按钮,就像下面这样:

当你的App加载上述的布局资源的时候,Android会将布局中的每个节点进行实例化成一个个对象,然后你可以为这些定义一些额外的行为,查询对象的状态,或者修改布局。 

相对布局(RelativeLayout)

1.核心属性


2.父容器定位属性示意图


3.根据兄弟组件定位

图中的组件1,2就是兄弟组件了,而组件3与组件1或组件2并不是兄弟组件,所以组件3不能通过 组件1或2来进行定位。

4.margin与padding的区别

初学者对于这两个属性可能会有一点混淆,这里区分下: 首先margin代表的是偏移,比如marginleft = "5dp"表示组件离容器左边缘偏移5dp; 而padding代表的则是填充,而填充的对象针对的是组件中的元素,比如TextView中的文字 比如为TextView设置paddingleft = "5dp",则是在组件里的元素的左边填充5dp的空间! margin针对的是容器中的组件,而padding针对的是组件中的元素,要区分开来!

线性布局(LinearLayout)

1.核心属性

2.注意事项:

使用Layout_gravity的一个很重要的问题!!! 问题内容: 在一个LinearLayout的水平方向中布置两个TextView,想让一个左,一个右,怎么搞? 或许你会脱口而出:"gravity设置一个left,一个right就可以啦!" 真的这么简单?你试过吗?写个简单的Layout你就会发现,事与愿违了: 代码如下:

    xmlns:tools="http://schemas.android.com/tools" 

    android:layout_width="match_parent" 

    android:layout_height="match_parent" 

    android:orientation="horizontal" 

    tools:context="com.jay.example.getscreendemo.MainActivity" > 


   

        android:layout_width="wrap_content" 

        android:layout_height="200dp" 

        android:layout_gravity="left" 

        android:background="#FF7878" 

        android:gravity="center" 

        android:text="O(∩_∩)O哈哈~" /> 


   

        android:layout_width="wrap_content" 

        android:layout_height="200dp" 

        android:layout_gravity="right" 

        android:background="#FF7428" 

        android:gravity="center" 

        android:text="(*^__^*) 嘻嘻……" /> 

 


看到这里你会说:哎呀,真的不行耶,要不在外层LinearLayout加个gravity=left的属性,然后设置第二个 TextView的layout_gravity为right,恩,好我们试一下:

    xmlns:tools="http://schemas.android.com/tools" 

    android:layout_width="match_parent" 

    android:layout_height="match_parent" 

    android:orientation="horizontal" 

    android:gravity="left" 

    tools:context="com.jay.example.getscreendemo.MainActivity" > 


   

        android:layout_width="wrap_content" 

        android:layout_height="200dp" 

        android:background="#FF7878" 

        android:gravity="center" 

        android:text="O(∩_∩)O哈哈~" /> 


   

        android:layout_width="wrap_content" 

        android:layout_height="200dp" 

        android:layout_gravity="right" 

        android:background="#FF7428" 

        android:gravity="center" 

        android:text="(*^__^*) 嘻嘻……" /> 

 

结果还是一样:

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

帧布局(FrameLayout)


1.常用属性

FrameLayout的属性很少就两个,但是在说之前我们先介绍一个东西:

前景图像:永远处于帧布局最上面,直接面对用户的图像,就是不会被覆盖的图片。

两个属性:

        android:foreground:设置改帧布局容器的前景图像

        android:foregroundGravity:设置前景图像显示的位置

2.实例演示

代码:

    xmlns:tools="http://schemas.android.com/tools"   

    android:id="@+id/FrameLayout1"   

    android:layout_width="match_parent"   

    android:layout_height="match_parent"   

    tools:context=".MainActivity"   

    android:foreground="@drawable/logo"   

    android:foregroundGravity="right|bottom">   


   

        android:layout_width="200dp"   

        android:layout_height="200dp"   

        android:background="#FF6143" />   

   

        android:layout_width="150dp"   

        android:layout_height="150dp"   

        android:background="#7BFE00" />   

   

        android:layout_width="100dp"   

        android:layout_height="100dp"   

        android:background="#FFFF00" />   

           

代码解析: 很简单,三个TextView设置不同大小与背景色,依次覆盖,接着右下角的是前景图像,通过 android:foreground="@drawable/logo"设置前景图像的图片, android:foregroundGravity="right|bottom"设置前景图像的位置在右下角。

运行结果:


表格布局(TableLayout)


1.常用属性

android:collapseColumns:设置需要被隐藏的列的序号

android:shrinkColumns:设置允许被收缩的列的列序号

android:stretchColumns:设置运行被拉伸的列的列序号

以上这三个属性的列号都是从0开始算的,比如shrinkColunmns = "2",对应的是第三列!

可以设置多个,用逗号隔开比如"0,2",如果是所有列都生效,则用"*"号即可

除了这三个常用属性,还有两个属性,分别就是跳格子以及合并单元格,这和HTML中的Table类似:

android:layout_column="2":表示的就是跳过第二个,直接显示到第三个格子处,从1开始算的!

android:layout_span="4":表示合并4个单元格,也就说这个组件占4个单元格

2.如何确定行数与列数

①如果我们直接往TableLayout中添加组件的话,那么这个组件将占满一行!!!

②如果我们想一行上有多个组件的话,就要添加一个TableRow的容器,把组件都丢到里面!

③tablerow中的组件个数就决定了该行有多少列,而列的宽度由该列中最宽的单元格决定

④tablerow的layout_width属性,默认是fill_parent的,我们自己设置成其他的值也不会生效!!! 但是layout_height默认是wrapten——content的,我们却可以自己设置大小!

⑤整个表格布局的宽度取决于父容器的宽度(占满父容器本身)

⑥有多少行就要自己数啦,一个tablerow一行,一个单独的组件也一行!多少列则是看tableRow中 的组件个数,组件最多的就是TableLayout的列数

网格布局(GridLayout)

1.核心属性


2.使用GridLayout要注意的地方:

因为GirdLayout是4.0后才推出的,所以minSDK版本要改为14或者以上的版本, 不然写布局代码的时候,这玩意就会莫名其妙地出错,说找不到这个GridLayout, 当然,如果你要低版本兼容的话,就要看下面的内容了!

绝对布局(AbsoluteLayout)


1.四大控制属性(单位都是dp):

①控制大小: android:layout_width:组件宽度 

                    android:layout_height:组件高度 

②控制位置: android:layout_x:设置组件的X坐标 

                    android:layout_y:设置组件的Y坐标

你可能感兴趣的:(第一章:不从Hello World开始的编程笔记)