Android核心技术与实例详解—Android布局管理器
- 格式:pdf
- 大小:579.00 KB
- 文档页数:20
Android组件---四⼤布局的属性详解【声明】欢迎转载,但请保留⽂章原始出处→_→Android常见布局有下⾯⼏种:LinearLayout:线性布局。
所有的控件都是串在⼀条线上的。
RelativeLayout:相对布局。
所有的控件的位置,都是相对于⽗控件的。
FrameLayout:帧布局。
FrameLayout布局中的控件都是⼀层⼀层的。
帧布局每次添加的控件都显⽰在最上⾯,最后显⽰在界⾯上的是最后添加的⼀个控件。
TableLayout:表格布局。
表格布局可以实现的.⼀般可以使⽤线性布局实现。
AbsoluteLayout:绝对布局。
已经是废弃的状态,很少⽤了。
orientation:属性是指定线性布局的排列⽅向。
horizontal ⽔平。
线性布局默认的朝向是⽔平的。
vertical 垂直例如:android:orientation="vertical"gravity:指定当前控件⾥⾯的内容容显⽰位置。
(四⼤layout中均可使⽤)left 左边right 右边top 上边bottom 底边例如:android:gravity="center"gravity中的属性可以组合使⽤。
例如:android:gravity="bottom|right"layout_gravity:指定当前控件在⽗元素的位置。
(只在 LinearLayout 和 FrameLayout 中有效)left 左边right 右边top 上边bottom 底边centercenter_horizontalcenter_vertical例如:android:layout_gravity="center"另外,需要提⽰的是,对于 LinearLayout :当 android:orientation="vertical" 时,只有⽔平⽅向的设置才起作⽤,垂直⽅向的设置不起作⽤。
安卓之布局总结Adroid布局有⼈形象地⽐喻,Android开发中的布局就相当于⼀栋建筑的外观架构。
布局⽤得好,这栋建筑的外观才美观⾼⼤上。
Android布局管理器Android布局管理器本⾝是⼀个界⾯控件,所有的布局管理器都是ViewGroup类的⼦类,都是可以当做容器类来使⽤的。
因此⼀个布局管理器中可以嵌套其他的布局管理器。
这是⾕歌上找的⼀张布局管理器层级图每⼀个ViewGroup都可以嵌套其他的ViewGroup和View(视图)。
⼀个ViewGroup的⼤⼩是相对的,它即可以是其他ViewGroup的⽗容器,也可以是其他ViewGroup的⼦容器。
在Android中,ViewGroup指代的是布局管理器,也就是下⾯要讲的布局样式,View指代的是布局管理器中的⼀个个控件。
在Android中,控件可以在XML⽂件中定义,也可以程序员根据⾃⼰的需要去定义⼀个类。
本⽂重点先不讨论视图中的控件,还是回归到布局。
Android六⼤基本布局管理器分别是:线性布局(LinearLayout)、表格布局(TableLayout)、⽹格布局(GridLayout)、相对布局(RelativeLayout)、绝对布局(AbsoluteLayout)、层布局(FrameLayout)其中,表格布局是线性布局的⼦类。
⽹格布局是android 4.0后新增的布局。
(1)线性布局线性布局会将容器内的所有控件⼀个挨着⼀个地排列。
属性:1. 排列⽅向android:orienation = “ horizontal/vertical”⽔平排列和垂直排列,Android中默认为垂直排列vertical注意:默认情况下⽔平和垂直⽅向的排列只占⼀⾏,如果⽤android:layout_width来设定控件的宽度,如果控件宽度太⼤,超出屏幕的显⽰范围,屏幕是不会显⽰超出的范围的。
2. 对齐⽅式⽤于控制元素(例如⽂字)在该控件⾥的显⽰位置。
Android布局及布局属性1、帧布局FrameLayout:是最简单的一个布局对象。
在他里面的的所有显示对象爱你过都将固定在屏幕的左上角,不能指定位置,但允许有多个显示对象,只是后一个会直接覆盖在前一个之上显示,会把前面的组件部分或全部挡住。
下图的例子里,FrameLayout中放了3个ImageView组件,第一个是蓝色的,第二个是绿色的,第三个是树状图(透明的png格式)。
ImageView就相当于Html中的img标签,接下来会讲到这个组件。
下面看一个FrameLayout的例子:<?xml version="1.0" encoding="utf-8"?><FrameLayout android:id="@+id/FrameLayout01"android:layout_width="fill_parent" android:layout_height="fill_parent"xmlns:android="/apk/res/android"><ImageView android:id="@+id/ImageView01" android:src="@drawable/p1"android:layout_width="wrap_content" android:layout_height="wrap_content"></ImageView><ImageView android:id="@+id/ImageView02" android:src="@drawable/p2"android:layout_width="wrap_content" android:layout_height="wrap_content"></ImageView><ImageView android:id="@+id/ImageView03" android:src="@drawable/p3"android:layout_width="wrap_content" android:layout_height="wrap_content"></ImageView></FrameLayout>2、线性布局LinearLayout:线性布局是所有布局中最常用的类之一,也是RadioGroup, TabWidget, TableLayout, TableRow, ZoomControls类的父类。
Android应用程序中的布局设计Android应用中的布局设计是开发中最重要并且最需要注意的事情之一。
一个良好的布局设计可以使应用程序更加直观和易用,而一个糟糕的布局则会让用户感到不舒服并降低程序的易用性,因此在进行Android应用程序开发之前,设计者应该认真思考和规划布局设计。
Android的布局设计可分为两大类:线性布局和相对布局,每种布局都有其独有的优点和缺点。
同时,需要考虑用户界面设计的规范性和一致性。
线性布局线性布局是一种简单而灵活的设计方式,其根据水平或垂直方向进行布局。
线性布局很容易控制,使开发者可以更加容易地管理和维护布局。
优点线性布局简单易用,可以轻松地控制元素的位置和大小,因此对于初学者来说是一种非常有利的布局方式。
其还可以按比例控制元素,从而适应多种不同大小的设备。
其次,线性布局可以让开发者快速地检查视图的位置和大小,从而进一步简化布局调整的难度。
缺点线性布局也有些缺陷。
当布局变得非常复杂时,线性布局会变得非常繁琐。
此外,当元素数量增加后,屏幕空间开始变得紧张,这会使得描述布局的XML变得明显更长。
同时,由于所有元素都需要进行细微的控制,因此更加可能会出现错误。
相对布局相对布局是一种更加灵活的布局方式,可以根据元素之间的相对位置来确定布局。
此方式较线性布局更加复杂,但是其在一些情况下可以提供更好的灵活性。
优点相对布局可以根据需要动态地调整布局,使得其能够适应多种不同的设备。
同时,相对布局可支持同时存在多个元素,并且可以在这些元素之间形成各种关系。
这些关系可以是垂直或水平的,甚至可以是根据其他元素的位置而定的。
缺点相对布局也有一定的缺点。
由于关系比较复杂,因此需要更加仔细地进行布局控制,否则就会导致元素相互干扰和布局错误的问题。
此外,相对布局的调整也比较困难,因为调整一个元素的位置通常会影响整个布局,因此一定要更加谨慎地操作。
用户界面设计的规范性和一致性良好的用户界面设计应该具有一定的规范性和一致性。
Android中关于CoordinatorLayout的⼀些实⽤布局技巧介绍CoordinatorLayout是⼀个“加强版”的 FrameLayout,它主要有两个⽤途:(1)⽤作应⽤的顶层布局管理器(2)通过为⼦View指定 behavior 实现⾃定义的交互⾏为。
在我们做 Material Design 风格的app时通常都使⽤ CoordinatorLayout 作为布局的根节点,以便实现特定的UI交互⾏为。
那么现在我们来看看如何⽤已有的⼀些控件实现⼀些常见的布局。
Toolbar + TabLayout 实现 TabLayout 置顶效果很常见的⼀种模式是 TabLayout 放在 ToolBar 布局中与其⼀起置顶在界⾯上⽅,⽽现在的效果是将ToolBar 隐藏⽽TabLayout⼀直置顶在界⾯上⽅。
tablayout如何实现呢?⾸先所在的 Activity 要使⽤ AppTheme.NoActionBar 风格主题,之后再编写布局⽂件。
<android.support.design.widget.CoordinatorLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"><android.support.design.widget.AppBarLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:theme="@style/AppTheme.AppBarOverlay"><android.support.v7.widget.Toolbarandroid:id="@+id/toolbar"android:layout_width="match_parent"android:layout_height="?attr/actionBarSize"android:background="?attr/colorPrimary"app:layout_scrollFlags="scroll|enterAlways|snap"app:popupTheme="@style/AppTheme.PopupOverlay"><!-- toolbar内部布局⽂件 --></android.support.v7.widget.Toolbar><android.support.design.widget.TabLayoutandroid:id="@+id/tab_layout"android:layout_width="match_parent"android:layout_height="@dimen/tab_height"app:tabIndicatorColor="@color/white"app:tabTextColor="@color/white_normal"></android.support.design.widget.TabLayout></android.support.design.widget.AppBarLayout><!-- 主界⾯布局⽂件 --></android.support.design.widget.CoordinatorLayout>很重要的两点:设置 Toolbar 的layout_scrollFlags="scroll|enterAlways|snap"保证 Toolbar 能随界⾯滑动向上隐藏。
实战Android编程——手把手教你做出商用软件34第3章Android布局管理器本章要介绍的内容为Android平台下的布局管理器。
Android中的布局包括线性布局、表格布局、相对布局、帧布局和绝对布局。
下面将分别对每个布局管理器进行详细的介绍。
3.1 控件类概述3.1.1 View类简介在介绍Android的布局管理器之前,有必要让读者了解Android平台下的控件类。
首先要了解的是View类,该类为所有可视化控件的基类,主要提供了控件绘制和事件处理的方法。
创建用户界面所使用的控件都继承自View,如TextView、Button、CheckBox等。
关于View及其子类的相关属性,既可以在布局XML文件中进行设置,也可以通过成员方法在代码中动态设置。
View类常用的属性及其对应方法如表3-1所示。
表3-1 View类常用属性及对应方法说明属性名称对应方法描述android:background setBackgroundResource(int) 设置背景android:clickable setClickable(boolean) 设置View是否响应点击事件android:visibility setVisibility(int) 控制View的可见性android:focusable setFocusable(boolean) 控制View是否可以获取焦点android:id setId(int) 为View设置标识符,可通过findViewById方法获取android:longClickable setLongClickable(boolean) 设置View是否响应长点击事件android:soundEffectsEnabled setSoundEffectsEnabled(boolean) 设置当View触发点击等事件时是否播放音效android:saveEnabled setSaveEnabled(boolean) 如果未作设置,当View被冻结时将不会保存其状态android:nextFocusDown setNextFocusDownId(int)定义当向下搜索时应该获取焦点的View,如果该View 不存在或不可见,则会抛出RuntimeException异常android:nextFocusLeft setNextFocusLeftId(int) 定义当向左搜索时应该获取焦点的Viewandroid:nextFocusRight setNextFocusRightId(int) 定义当向右搜索时应该获取焦点的View续表属性名称对应方法描述android:nextFocusUp setNextFocusUpId(int) 定义当向上搜索时应该获取焦点的View,如果该View第3章 Android 布局管理器35不存在或不可见,则会抛出RuntimeException 异常说明:任何继承自View 的子类都将拥有View 类的以上属性及对应方法。
3.1.2 ViewGroup 类简介另外一个需要了解的是ViewGroup 类,它也是View 类的子类,但是可以充当其他控件的容器。
ViewGroup 的子控件既可以是普通的View ,也可以是ViewGroup ,实际上,这是使用了Composite 的设计模式。
Android 中的一些高级控件如Galley 、GridView 等都继承自ViewGroup 。
与Java SE 不同,Android 中并没有设计布局管理器,而是为每种不同的布局提供了一个ViewGroup 的子类,常用的布局及其类结构如图3-1所示。
3.2 线性布局 本节将会对线性布局进行简单的介绍。
首先向读者介绍LinearLayout 类的相关知识,然后通过一个实例说明LinearLayout 的用法。
3.2.1 LinearLayout 类简介线性布局是最简单的布局之一,它提供了控件水平或者垂直排列的模型。
同时,使用此布局时可以通过设置控件的weight 参数控制各个控件在容器中的相对大小。
LinearLayout 布局的属性既可以在布局文件(XML )中设置,也可以通过成员方法进行设置。
表3-2给出了LinearLayout 常用的属性及这些属性的对应设置方法。
表3-2 LinearLayout 常用属性及对应方法 属性名称 对应方法 描 述android:orientation setOrientation(int) 设置线性布局的朝向,可取horizontal 和vertical 两种排列方式android:gravity setGravity(int) 设置线性布局的内部元素的布局方式在线性布局中可使用gravity 属性来设置控件的对齐方式,gravity 可取的值及说明如表3-3所示。
提示:当需要为gravity 设置多个值时,用“|”分隔即可。
表3-3 gravity 可取的属性及说明属 性 值说 明top 不改变控件大小,对齐到容器顶部 续表属 性 值说 明bottom 不改变控件大小,对齐到容器底部 图3-1 布局管理器的类结构实战Android 编程——手把手教你做出商用软件36 left不改变控件大小,对齐到容器左侧right不改变控件大小,对齐到容器右侧 center_vertical不改变控件大小,对齐到容器纵向中央位置 center-horizontal不改变控件大小,对齐到容器横向中央位置 center不改变控件大小,对齐到容器中央位置 fill_vertical若有可能,纵向拉伸以填满容器 fill_horizontal若有可能,横向拉伸以填满容器 fill 若有可能,纵向横向同时拉伸以填满容器3.2.2 线性布局案例在前面的章节中介绍了LinearLayout 类的相关知识,本节将通过一个案例来说明LinearLayout 的用法。
本案例的开发步骤如下。
在Eclipse 中新建一个项目Sample_3_1,首先打开项目文件夹下res/values 目录下的strings.xml ,在其中输入如下代码。
1 <?xml version="1.0" encoding="utf-8"?>2 <resources>3 <string name="app_name">LinearExample</string>4 <string name="button">按钮</string>5 <string name="add">添加</string>6 </resources> 代码位置:见随书光盘中源代码/第3章/Sample_3_1/res/values 目录下的strings.xml 。
说明:在strings.xml 中主要声明了程序中要用到的字符串资源,这样将所有字符串资源统一管理有助于提高程序的可读性及可维护性。
打开项目文件夹下的res/layout 目录下的main.xml ,将其中已有的代码替换为如下代码。
1 <?xml version="1.0" encoding="utf-8"?>2 <LinearLayout xmlns:android="/apk/res/android"3 android:orientation="vertical"4 android:layout_width="fill_parent"5 android:layout_height="fill_parent"6 android:id="@+id/lla"7 android:gravity="right"8 > <!-- 声明一个LinearLayout 布局,并设置其属性 -->9 <Button10 android:text="@string/add"11 android:id="@+id/Button01"12 android:layout_width="wrap_content"13 android:layout_height="wrap_content">14 </Button> <!-- 声明一个Button 布局,并设置其id 为Button01 --> 15 </LinearLayout>代码位置:见随书光盘中源代码/第3章/Sample_3_1/res/layout 目录下的main.xml 。
¾ 第2~8行声明了一个线性布局,第3行设置线性布局的朝向为垂直排列。
¾ 第4~5行设置该线性布局在其所属的父容器中的布局方式为横向和纵向填充父容器。
¾ 第6行为该线性布局声明了ID 。
第7行设置该线性布局内部元素的布置方式为向右对齐。
第3章 Android 布局管理器37¾ 第9~14行声明了一个Button 控件,其ID 为Button01,第10行设置Button 控件显示的文本内容为资源文件strings.xml 中的属性值。
¾ 第12~13行设置Button 控件在父容器中的布局方式为只占据自身大小的空间。
打开项目的Activity 文件LinearActivity.java ,将其中已有的代码替换为如下的代码。
1 package wyf.jc; //声明包语句2 import android.app.Activity; //引入相关类3 import android.os.Bundle; //引入相关类4 import android.view.View; //引入相关类5 import android.widget.Button; //引入相关类6 import android.widget.LinearLayout; //引入相关类7 public class LinearActivity extends Activity {8 int count=0; //计数器,记录按钮个数 9 @Override10 public void onCreate(Bundle savedInstanceState) { //重写onCreate 方法11 super.onCreate(savedInstanceState);12 setContentView(yout.main);13 Button button = (Button) findViewById(R.id.Button01);//获取屏幕中的按钮控件对象14 button.setOnClickListener( //为按钮添加OnClickListener 接口实现 15 new View.OnClickListener(){16 public void onClick(View v){17 LinearLayout ll=(LinearLayout)findViewById(R.id.lla); //获取线性布局对象18 String msg=LinearActivity.this.getResources().getString(R. string.button);19 Button tempbutton=new Button(LinearActivity.this); //创建一个Button 对象20 tempbutton.setText(msg+(++count)); //设置Button 控件显示的内容 21 tempbutton.setWidth(80); //设置Button 的宽度22 ll.addView(tempbutton); //向线性布局中添加View 23 }24 });25 }26 }代码位置:见随书光盘中源代码/第3章/Sample_3_1/src/wyf/jc 目录下的main.xml 。