android的布局管理器
理论上通过setContentView(view)能够把一个view设置到activity中,但当你有很多个view控件的时候,就需要用android的布局管理器来管理view控件了。
android布局管理器有以下几种:
1.线性布局 LinearLayout
2.框架布局 FrameLayout
3.表格布局 TableLayout
4.相对布局 RelativeLayout
5.绝对布局 AbsoluteLayout
一、LinearLayout 线性布局管理器
线性布局分为水平布局和垂直布局两种。水平布局就是把view水平排列,通过layout.setOrientation(LinearLayout.HORIZONTAL);垂直是吧View垂直排列,通过layout.setOrientation(LinearLayout.VERTICAL)来实现。
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LinearLayout lly = new LinearLayout(this);
LinearLayout.LayoutParams llp = new LinearLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT);
lly.setOrientation(LinearLayout.VERTICAL);
setContentView(lly, llp);
LinearLayout.LayoutParams viewparams = new LinearLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
TextView tv1 = new TextView(this);
tv1.setText("This is Text1");
tv1.setBackgroundColor(Color.rgb(0, 255, 30));
TextView tv2 = new TextView(this);
tv2.setText("This is Text2");
tv2.setBackgroundColor(Color.rgb(255, 30, 60));
lly.addView(tv1,viewparams);
lly.addView(tv2,viewparams);
}
}
上边代码中Layoutparams llp是为了保证setContentView时候 lly布局能够填满整个屏幕;而第二个Layoutparams viewparams则是为了让lly里边的控件都能够保持长度填满lly,高度取控件自身高度,最后通过addView(view, params),通过实验发现其实这里不设置params,直接addView(view)的效果是一样的,都是长填满,高取控件高度。

二、FrameLayout 框架布局管理器
这个感觉没有什么太大的作用,FrameLayout就是把布局里边的所有控件都放到左上角,并逐个覆盖。
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FrameLayout ll = new FrameLayout(this);
FrameLayout.LayoutParams llp = new FrameLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT);
setContentView(ll, llp);
FrameLayout.LayoutParams viewparams = new FrameLayout.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
TextView tv1 = new TextView(this);
tv1.setText("This is Text1Text1Text1.");
tv1.setBackgroundColor(Color.rgb(0, 255, 30));
TextView tv2 = new TextView(this);
tv2.setText("This is Text2");
tv2.setBackgroundColor(Color.rgb(255, 30, 60));
ll.addView(tv1,viewparams);
ll.addView(tv2,viewparams);
}
}

三、TableLayout 表格布局管理器
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TableLayout tl = new TableLayout(this);
TableLayout.LayoutParams tlp = new TableLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
tl.setBackgroundColor(Color.GREEN);
setContentView(tl, tlp);
String[][] data = new String[][]{
{"姓名", "学号", "年级", "职务", "住址"},
{"小明", "1000", "3", "班长", "北京市西山区第一街365号"},
{"小兰", "2001", "6", "班长,学习委员", "北京市海淀区春熙路63号"}
};
for(int i=0; i<data.length; i++)
{
TableRow row = new TableRow(this);
for(int j=0; j<data[i].length; j++)
{
TextView tv = new TextView(this);
tv.setText(data[i][j]);
row.addView(tv);
}
tl.addView(row);
}
//tl.setShrinkAllColumns(true); //所有列都可折叠
//tl.setColumnShrinkable(3, true); //第4列可折叠
//tl.setColumnCollapsed(2, true); //第3列不显示
}
}
正常:
折叠:
不显示:
四、RelativeLayout 相对布局管理器
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
RelativeLayout rl = new RelativeLayout(this);
RelativeLayout.LayoutParams rlp0 = new RelativeLayout.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
rl.setBackgroundColor(Color.rgb(102, 255, 179));
setContentView(rl, rlp0);
RelativeLayout.LayoutParams rlp = new RelativeLayout.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
rlp.addRule(RelativeLayout.BELOW, 1);
rlp.leftMargin = 10;
rlp.topMargin = 10;
TextView tv1 = new TextView(this);
tv1.setText("This is Text1");
tv1.setBackgroundColor(Color.GREEN);
tv1.setId(1);
rl.addView(tv1);
TextView tv2 = new TextView(this);
tv2.setText("This is Text2");
tv2.setBackgroundColor(Color.BLUE);
rl.addView(tv2, rlp);
RelativeLayout.LayoutParams rlp2 = new RelativeLayout.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
rlp2.addRule(RelativeLayout.RIGHT_OF, 1);
rlp2.leftMargin = 10;
TextView tv3 = new TextView(this);
tv3.setText("This is Text3");
tv3.setBackgroundColor(Color.YELLOW);
rl.addView(tv3, rlp2);
}
}

本来想用一个layoutParams通过addRule和removeRule的方式来控制所有的RelativeLayout中的view控件,但实验中却发现要使用removeRule必须把androidSDK改到17(本来是8),还有就是,layoutParams会把所有对它进行的设置都更改之后再去设置控件,有点不懂哈,上例子:
RelativeLayout.LayoutParams rlp = new RelativeLayout.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
rlp.addRule(RelativeLayout.BELOW, 1); TextView tv1 = new TextView(this);
tv1.setText("This is Text1");
tv1.setBackgroundColor(Color.GREEN);
tv1.setId(1);
rl.addView(tv1);
TextView tv2 = new TextView(this);
tv2.setText("This is Text2");
tv2.setBackgroundColor(Color.GRAY);
rl.addView(tv2, rlp);
rlp.addRule(RelativeLayout.RIGHT_OF, 1);
和
RelativeLayout.LayoutParams rlp = new RelativeLayout.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
rlp.addRule(RelativeLayout.BELOW, 1); rlp.addRule(RelativeLayout.RIGHT_OF, 1); TextView tv1 = new TextView(this);
tv1.setText("This is Text1");
tv1.setBackgroundColor(Color.GREEN);
tv1.setId(1);
rl.addView(tv1); TextView tv2 = new TextView(this);
tv2.setText("This is Text2");
tv2.setBackgroundColor(Color.GRAY);
rl.addView(tv2, rlp);
结果是一样的,也就是说不管 rlp2.addRule(RelativeLayout.RIGHT_OF, 1);位置在rl.addView(tv2, rlp)的前边或者后边,结果都一样,这点和传统上的顺序执行有点不一样。
android的布局管理器的更多相关文章
- 一步一步学android之布局管理器——LinearLayout
线性布局是最基本的一种布局,在基本控件篇幅中用到的都是LinearLayout,线性布局有两种方式,前面也有用到,一种是垂直的(vertical),一种是水平的(horizontal).我们同样来看下 ...
- Android课程---布局管理器中的线性布局
线性布局实例: <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:andro ...
- 一步一步学android之布局管理器——RelativeLayout
今天开始学习RelativeLayout(相对布局),相对布局在平时布局的时候用的较多,因为Android适配方面的原因.相对布局可以控制组件摆放的位置(放在任一组件的上下左右等位置),下面来看看类的 ...
- Android课程---布局管理器
- Android UI组件:布局管理器
为了更好的管理Android应用的用户界面中的组件,Android提供了布局管理器.通过使用布局管理器,Android应用的图形用户界面具有良好的平台无关性.通常,推荐使用布局管理器来管理组件的分布. ...
- [置顶] Android布局管理器 - 详细解析布局实现
布局管理器都是以ViewGroup为基类派生出来的; 使用布局管理器可以适配不同手机屏幕的分辨率,尺寸大小; 布局管理器之间的继承关系 : 在上面的UML图中可以看出, 绝对布局 帧布局 网格布局 相 ...
- Android布局管理器(线性布局)
线性布局有LinearLayout类来代表,Android的线性布局和Swing的Box有点相似(他们都会将容器里面的组件一个接一个的排列起来),LinearLayout中,使用android:ori ...
- Android布局管理器(表格布局)
表格布局有TableLayout所代表,TableLayout继承了LinearLayout,因此他的本质依然是LinearLayout. 表格布局采用行.列的形式来进行管理,在使用的时候不需要声明多 ...
- android开发4:Android布局管理器1(线性布局,相对布局RelativeLayout-案例)
控件类概述 View 可视化控件的基类 属性名称 对应方法 描述 android:background setBackgroundResource(int) 设置背景 android:clickabl ...
随机推荐
- mariadb DML语句及用户授权
DML(Data Manipulation Language):INSERT, DELETE, UPDATE, SELECT INSERT [INTO] tbl_name [(col1,...) ...
- memcache 简单入门应用
1.memcache 简介和安装: 下载:下载文件,解压到某个地方. 2.数据存储格式 键值对,一个key对应一个值,一个值在内存中占用一个或多个4k大小的块. 3.php使用memcache的方式 ...
- apache2下部署node.js应用程序
版本:apache2.2+node.js(v.10.25) 系统环境:ubuntu 12.04(LTS) 32位 因为有些模块并没有开启 所以需要使用以下命令开启该模块 windows下则直接在htt ...
- 11)Java abstract class 和 interface
abstract class 和 interface 的区别 含有abstract修饰符的class即为抽象类,abstract 类不能创建实例对象.含有abstract方法的类必须定义 ...
- GoogleMapApi 发布后提示安全问题
今天日本那边发过来一个Bug说是Google Map打不开,提示安全问题. 最后发现,日本那边的发布路径如下: https:xxxxx.gspserver.co.jp 而Source中Google M ...
- WPF自定义控件(一)——Button
接触WPF也有两个多月了,有了一定的理论基础和项目经验,现在打算写一个系列,做出来一个WPF的控件库.一方面可以加强自己的水平,另一方面可以给正在学习WPF的同行一个参考.本人水平有限,难免有一些错误 ...
- 一段高质量的SQL从问问题开始(笔记)
首先SQL书写的目的是为了解决问题,因此只有明白了要解决的问题,才能写出更加高效的SQL语句,才能优雅的解决问题,获得更多的快乐! 在写一个SQL语句的时候不妨像优化器一样思考,问自己以下的这些问题, ...
- hud 2586 How far away ?
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=2586 How far away ? Description There are n houses in ...
- hdu 2091 空心三角形
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=2091 空心三角形 Description 把一个字符三角形掏空,就能节省材料成本,减轻重量,但关键是为 ...
- microsoft azure Media Services 媒体服务解决方案
用安全的方式为您随时随地跨设备传送媒体内容.提供可伸缩的端到端媒体解决方案 可用于高级视频工作流的云 实现奥运会规模的直播与点播媒体传送 高可用的编码和流式处理 支持 Flash.iOS.Androi ...