Android有五大布局对象,它们分别是FrameLayout(框架布局:不知道是不是这么翻译的),LinearLayout (线性布局),AbsoluteLayout(绝对布局),RelativeLayout(相对布局),TableLayout(表格布局).
FrameLayout:
FrameLayout是最简单的一个布局对象。它被定制为你屏幕上的一个空白备用区域,之后你可以在其中填充一个单一对象 — 比如,一张你要发布的图片。所有的子元素将会固定在屏幕的左上角;你不能为FrameLayout中的一个子元素指定一个位置。后一个子元素将会直接在前 一个子元素之上进行覆盖填充,把它们部份或全部挡住(除非后一个子元素是透明的)。
我们看一下效果图:
其中Main.xml 代码如下:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<!-- 我们在这里加了一个Button按钮 -->
<Button
android:text="button"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<TextView
android:text="textview"
android:textColor="#0000ff"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</FrameLayout>
LinearLayout:
LinearLayout以你为它设置的垂直或水平的属性值,来排列所有的子元素。所有的子元素都被堆放在其它元素之后,因此一个垂直列表的每一行只会有 一个元素,而不管他们有多宽,而一个水平列表将会只有一个行高(高度为最高子元素的高度加上边框高度)。LinearLayout保持子元素之间的间隔以 及互相对齐(相对一个元素的右对齐、中间对齐或者左对齐)。
LinearLayout还支持为单独的子元素指定weight 。好处就是允许子元素可以填充屏幕上的剩余空间。这也避免了在一个大屏幕中,一串小对象挤 成一堆的情况,而是允许他们放大填充空白。子元素指定一个weight 值,剩余的空间就会按这些子元素指定的weight 比例分配给这些子元素。默认的 weight 值为0。例如,如果有三个文本框,其中两个指定了weight 值为1,那么,这两个文本框将等比例地放大,并填满剩余的空间,而第三个文本框 不会放大。
我们看一下效果图:
其中Main.xm l代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="2">
<TextView
android:text="Welcome to Mr Wei's blog"
android:textSize="15pt"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1">
<TextView
android:text="red"
android:gravity="center_horizontal" //这里字水平居中
android:background="#aa0000"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_weight="1"/>
<TextView
android:text="green"
android:gravity="center_horizontal "
android:background="#00aa00"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_weight="1"/>
</LinearLayout>
</LinearLayout>
AbsoluteLayout:
AbsoluteLayout 可以让子元素指定准确的x/y坐标值,并显示在屏幕上。(0, 0)为左上角,当向下或向右移动时,坐标值将变大。AbsoluteLayout 没有页边框,允许元素之间互相重叠(尽管不推荐)。我们通常不推荐使用 AbsoluteLayout ,除非你有正当理由要使用它,因为它使界面代码太过刚性,以至于在不同的设备上可能不能很好地工作。
我们看一下效果图:
其中Main.xm l代码如下:
<?xml version="1.0" encoding="utf-8"?>
<AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<EditText
android:text="Welcome to Mr Wei's blog"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<Button
android:layout_x="250px" //设置按钮的X坐标
android:layout_y="40px" //设置按钮的Y坐标
android:layout_width="70px" //设置按钮的宽度
android:layout_height="wrap_content"
android:text="Button"
/>
</AbsoluteLayout>
RelativeLayout:
RelativeLayout 允许子元素指定他们相对于其它元素或父元素的位置(通过ID 指定)。因此,你可以以右对齐,或上下,或置于屏幕中央的形式来 排列两个元素。元素按顺序排列,因此如果第一个元素在屏幕的中央,那么相对于这个元素的其它元素将以屏幕中央的相对位置来排列。如果使用XML 来指定这个 layout ,在你定义它之前,被关联的元素必须定义。
让我们看一下效果图:
其中Main.xml 代码如下:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
android:id="@+id/label"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Welcome to Mr Wei's blog:"/>
<EditText
android:id="@+id/entry"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@id/label"/>
<Button
android:id="@+id/ok"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/entry"
android:layout_alignParentRight="true"
android:layout_marginLeft="10dip"
android:text="OK" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toLeftOf="@id/ok"
android:layout_alignTop="@id/ok"
android:text="Cancel" />
</RelativeLayout>
TableLayout:
TableLayout 将子元素的位置分配到行或列中。一个TableLayout 由许多的TableRow 组成,每个TableRow 都会定义一个 row (事实上,你可以定义其它的子对象,这在下面会解释到)。TableLayout 容器不会显示row 、cloumns 或cell 的边框线。每个 row 拥有0个或多个的cell ;每个cell 拥有一个View 对象。表格由列和行组成许多的单元格。表格允许单元格为空。单元格不能跨列,这与HTML 中的不一样。
下面让我们看一下效果图:
其中Main.xml 代码如下:
<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:stretchColumns="1">
<TableRow>
<TextView android:layout_column="1" android:text="Open..." />
<TextView android:text="Ctrl-O" android:gravity="right" />
</TableRow>
<TableRow>
<TextView android:layout_column="1" android:text="Save..." />
<TextView android:text="Ctrl-S" android:gravity="right" />
</TableRow>
<View android:layout_height="2dip" android:background="#FF909090" /> //这里是上图中的分隔线
<TableRow>
<TextView android:text="X" />
<TextView android:text="Export..." />
<TextView android:text="Ctrl-E" android:gravity="right " />
</TableRow>
<View android:layout_height="2dip" android:background="#FF909090" />
<TableRow>
<TextView android:layout_column="1" android:text="Quit"
android:padding="3dip" />
</TableRow>
</TableLayout>
p.s:还没全部试过,有时间再试试
Cupcake 编译指导
准备文件:
\ cupcake\
从服务器下载该目录下所有文件
解压 cupcake.tgz 至 ~/cupcake
tar zxf path/cupcake.tgz –C ~/
拷贝 clean_git.sh 至 ~/cupcake/ 并执行之,以清除各个子目录下的 .git 目录
cd ~/cupcake
chomd a+x clean_git.sh
./clean_git.sh
做原始版本记录
git init
git add .
git commit –m “cupcake base code”
~/cupcake 目录下新建 .gitignore 文件,输入如下内容,让 git 忽略之
out
*.patch
*~
解压 Android_PlatformRel_Linux_MHLV_2009WW21.tgz
tar zxf Android_PlatformRel_Linux_MHLV_2009WW21.tgz –C ~/
拷贝 cupcake_patch 到 cupcake 目录
cp –r ~/pxa_cupcake/src/cupcake/cupcake_patches/* ~/cupcake/
解压 vendor.tgz 到 cupcake 目录下
tar zxvf ~/pxa_cupcake/src/cupcake/vendor.tgz -C ~/cupcake
( 此步骤不执行将不会出现 littleton 选项 )
修改 apply_cupcake_patch.sh
git-am $cupcake_root_dir/$cupcake_patch
修改为
patch –p1 < $cupcake_root_dir/$cupcake_patch
打 cupcake_patch
./ apply_cupcake_patch.sh
做打 patch 后的版本记录
git add .
git commit
配置编译环境
编译 cupcake 需要 JDK1.5 , gcc-4.3 , g++-4.3 。
但 Ubuntu9.10 未安装 jdk1.5 ,默认安装 gcc-4.4 , g++-4.4 ,所以需要安装上述 2 个。
JDK:
如果之前装了 java6 sdk ,但编译 Android 需要 jdk5 ,所以先把 Java6 屏蔽掉。
lua@ubuntu:~$ ls /usr/bin/j*
/usr/bin/java /usr/bin/javaws /usr/bin/jexec /usr/bin/jockey-text
/usr/bin/java_vm /usr/bin/jcontrol /usr/bin/jockey-gtk /usr/bin/join
lua@ubuntu:~$ sudo mv /usr/bin/java /usr/bin/java.bak
lua@ubuntu:~$ sudo mv /usr/bin/javaws /usr/bin/javaws.bak
lua@ubuntu:~$ sudo mv /usr/bin/java_vm /usr/bin/java_vm.bak
lua@ubuntu:~$ ls /usr/bin/j*
/usr/bin/java.bak /usr/bin/jcontrol /usr/bin/jockey-text
/usr/bin/java_vm.bak /usr/bin/jexec /usr/bin/join
/usr/bin/javaws.bak /usr/bin/jockey-gtk
比如 jdk-1_5_0_21-linux-i586.bin 放到如下目录
/home/lua/Downloads
在 shell 窗口执行 sh jdk-1_5_0_21-linux-i586.bin
jdk5 将安装到 /home/lua/Downloads/jdk1.5.0_21
将 /home/lua/Downloads/jdk1.5.0_21/bin 添加到 PATH
lua@ubuntu:~$ echo $PATH
/home/lua/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/lua/arm-marvell-linux-gnueabi/bin:/home/lua/bin:/home/lua/work/android-sdk-linux_86/tools:/home/lua/work/eclipse:/home/lua/Downloads/jdk1.5.0_21/bin
测试 Java ,系统能找到 java 且版本正确。
lua@ubuntu:~$ which java
/home/lua/Downloads/jdk1.5.0_21/bin/java
lua@ubuntu:~$ which javac
/home/lua/Downloads/jdk1.5.0_21/bin/javac
lua@ubuntu:~$ java -version
java version "1.5.0_21"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_21-b01)
Java HotSpot(TM) Client VM (build 1.5.0_21-b01, mixed mode, sharing)
lua@ubuntu:~$ javac -version
javac 1.5.0_21
GCC-4.3
安装文件在 ubuntu-9.10-gcc-4.3 目录下,
sudo dpkg -i cpp-4.3_4.3.4-5ubuntu1_i386.deb
sudo dpkg -i gcc-4.3-base_4.3.4-5ubuntu1_i386.deb
sudo dpkg -i gcc-4.3_4.3.4-5ubuntu1_i386.deb
sudo dpkg -i g++-4.3_4.3.4-5ubuntu1_i386.deb
sudo dpkg -i libstdc++6-4.3-dev_4.3.4-5ubuntu1_i386.deb
查看旧的 gcc , g++
ll /usr/bin/gcc*
ll /usr/bin/g++*
创建 gcc , g++ 软连接
sudo rm gcc g++
sudo ln –s gcc-4.3 gcc
sudo ln –s g++-4.3 g++
修改 cupcake bug
1. 如果直接 make ,会出现 frameworks/policies/base/PolicyConfig.mk:22: ***
No module defined for the given PRODUCT_POLICY (android.policy_phone). Stop. 错
误。
解决办法:
在 build/tools/findleaves.sh 中的第 89 行,
这一句 find "${@:0:$nargs}" $findargs -type f -name "$filename" -print |
改为 find "${@:1:$nargs-1}" $findargs -type f -name "$filename" -print |
2. qemu_gnu.patch
project external/qemu/
diff --git a/Makefile.android b/Makefile.android
index 4c697fb..98d2084 100644
--- a/Makefile.android
+++ b/Makefile.android
@@ -18,7 +18,7 @@ MY_CFLAGS := $(CONFIG_INCLUDES) -O2 -g \
# this is needed to build the emulator on 64-bit Linux systems
ifeq ($(HOST_OS)-$(HOST_ARCH),linux-x86)
- MY_CFLAGS += -Wa,--32
+ MY_CFLAGS += -Wa,--32 -D_GNU_SOURCE
endif
ifeq ($(HOST_OS),freebsd)
编译 cupcake
Buid PXA Android by:
$ . build/envsetup.sh
$ choosecombo
Note: please chose Device-release-littleton-user
$ make –j4
After a while (30~60 minutes), the binaries will be generated under /out/target/product/littleton/.
1 、神奇宝典掌上电视类业务:
目前有一些 BREW 的高端手机支持该业务,用户在神奇宝典上下载一个播放器软件后,可以通过该播放器软件观看由 CP 提供的业务。用户手机通过神奇宝典方式上网。该业务由联通和高通的合资公司博路公司负责运营。详细资料请访问 http://www.myuni.com.cn/
目前支持手机:三星 W109 、三星 E159 、三星 W209 、三星 W219 、三星 W299 、三星 W309 、摩托罗拉 A860 、 LG C910 、 LG C930 、 LG C950 、浪潮 LC7150 。
2 、联通新时讯的流媒体业务( PDA 版的视讯新干线):
目前支持该业务的终端只有一款大显 CU928 。用户手机通过掌中宽带方式上网,用户的登录名和密码: CARD 、 CARD 。该业务的运营由该业务由联通下属的全资子公司联通新时讯公司独立负责。详细资料请访问 http://www.u-web.cn
支持手机:大显 CU928
3 、 wap 方式的流媒体业务(手机版的视讯新干线):
总部的视讯新干线业务是联通公司基于 CDMA1X 网络,为与对手展开差异化竞争而推出和互动视界、彩 E 、神奇宝典等并列的又一业务子品牌。用户的登录名和密码: WAP2 、 WAP2 。该业务由总部增值业务部负责运营。详细资料请访问 http://www.myuni.com.cn/
支持手机: LG C950 、 LG - C260 、 LG - C270 、 LG - C960 、三星 SCH-E159 、三星 M299 、三星 I539
WAP 方式不需要下载客户端。这些手机已经有了播放软件。如果没有,需要另外下载一个播放软件;或者在手机 browser 中内置一个 player 。