在开发 Android 应用时,UI 布局是一件令人烦恼的事情。下面主要讲解一下 Android 中的界面布局。
一、线性布局(LinearLayout)
线性布局分为:
(1)垂直线性布局;
(2)水平线性布局;
针对这两种区别,只是一个属性的区别
<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="horizontal"
即可。
二、 相对布局(RelativeLayout)
一般线性布局满足不了们实际项目中的需要,就是一般做 Web 界面的 UI 设计一样,也是存在相对元素的一些 CSS 样式的布局。RelativeLayout 参数有:Width,Height,Below,AlignTop,ToLeft,Padding,和 MerginLeft。
关键源码:
<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="请输入:"/>
<EditText
android:id="@+id/entry"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@android:drawable/editbox_background"
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="确定" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toLeftOf="@id/ok"
android:layout_alignTop="@id/ok"
android:text="取消" />
</RelativeLayout>
复制代码
其中,android:layout_below=”@id/label”
设置了 EditText 处于 TextView 下方;在 Button 中android:layout_below=”@id/entry”
设置该 Button 位于 EditText 下。
三、表单布局(TableLayout)
TableLayout
由许多 TableRow 组成,每个 TableRow 都会定义一个 Row。TableLayout 容器不会显示 Row,Column 或 Cell 的边框线,每个 Row 拥有 0 个或多个 Cell,每个 Cell 拥有一个 View 对象。表格由行和列组成许多单元个,允许单元格为空。但是单元格不能跨列,这与 Html 不同。
<View
android:layout_height="2dip"android:background="#FF909090" /><TableRow>
<TextView
android:text=""android:padding="3dip" /><TextViewandroid:text="导入..."android:padding="3dip" /></TableRow><TableRow><TextViewandroid:text=""
android:padding="3dip" />
<TextView
android:text="导出..."
android:padding="3dip" />
<TextView
android:text="Ctrl-E"
android:gravity="right"
android:padding="3dip" />
</TableRow>
复制代码
android:gravity="center"
书面解释是权重比。其时就是让它居中显示。
android:stretchColumns="1,2,3,4"
它的意思就是自动拉伸 1,2,3,4 列。
注:若需实现组件居中显示,布局应如下:
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical|center_horizontal"
复制代码
TableRow 平分列
每一列的宽度设置为 android:layout_width="0.0dip",在设置每一列的 android:layout_weight=“1”
因为 ayout_weight 是将剩余空间按权重分配,而不是将全部空间按权重分配。
代码如下:
<TableRow android:paddingTop="15px">
<Button android:id="@+id/Register"android:text="@string/register"android:layout_width="0.0dip"android:layout_weight="1"android:onClick="register"/>
<Button android:id="@+id/cancel"android:layout_width="0.0dip"android:layout_weight="1"android:text="@string/button_cancel" />
</TableRow>
复制代码
四、切换卡(TabWidget)
切换卡经常用在一下选项上,类似于电话簿界面,通过多个标签切换显示不同内容。而其中,TabHost 是一个用来存放 Tab 标签的容器,通过 getTabHost 方法来获取 TabHost 的对象,通过 addTab 方法向容器里添加 Tab。Tab 在切换时都会产生一个事件,可以通过 TabActivity 的事件监听 setOnTabChangedListener.
五、TabHost 类概述
提供选项卡(Tab 页)的窗口视图容器。此对象包含两个子对象:一组是用户可以选择指定 Tab 页的标签;另一组是 FrameLayout 用来显示该 Tab 页的内容。个别元素通常控制使用这个容器对象,而不是设置在子元素本身的值。
(译者 madgoat 注:即使使用的是单个元素,也最好把它放到容器对象 ViewGroup 里)
内部类
interface TabHost.OnTabChangeListener
接口定义了当选项卡更改时被调用的回调函数
interface TabHost.TabContentFactory
当某一选项卡被选中时生成选项卡的内容
class TabHost.TabSpec
单独的选项卡,每个选项卡都有一个选项卡指示符,内容和 tag 标签,以便于记录.。
关键源码
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/tabhost"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TabWidget
android:id="@android:id/tabs"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
<FrameLayout
android:id="@android:id/tabcontent"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
android:id="@+id/textview1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="this is a tab" />
<TextView
android:id="@+id/textview2"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="this is another tab" />
<TextView
android:id="@+id/textview3"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="this is a third tab" />
</FrameLayout>
</LinearLayout>
</TabHost> 处理类
//声明TabHost对象
TabHost mTabHost;
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//取得TabHost对象
mTabHost = getTabHost();
/* 为TabHost添加标签 */
//新建一个newTabSpec(newTabSpec)
//设置其标签和图标(setIndicator)
//设置内容(setContent)
mTabHost.addTab(mTabHost.newTabSpec("tab_test1")
.setIndicator("TAB 1",getResources().getDrawable(R.drawable.img1))
.setContent(R.id.textview1));
mTabHost.addTab(mTabHost.newTabSpec("tab_test2")
.setIndicator("TAB 2",getResources().getDrawable(R.drawable.img2))
.setContent(R.id.textview2));
mTabHost.addTab(mTabHost.newTabSpec("tab_test3")
.setIndicator("TAB 3",getResources().getDrawable(R.drawable.img3))
.setContent(R.id.textview3));
//设置TabHost的背景颜色
mTabHost.setBackgroundColor(Color.argb(150, 22, 70, 150));
//设置TabHost的背景图片资源
//mTabHost.setBackgroundResource(R.drawable.bg0);
//设置当前显示哪一个标签,默认下标从0开始mTabHost.setCurrentTab(0);
//标签切换事件处理,setOnTabChangedListener
mTabHost.setOnTabChangedListener(new OnTabChangeListener(){
public void onTabChanged(String tabId) {
Dialog dialog = new AlertDialog.Builder(Examples_04_29Activity.this)
.setTitle("提示")
.setMessage("当前选中:"+tabId+"标签")
.setPositiveButton("确定",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton){
dialog.cancel();
}
}).create();//创建按钮
dialog.show();
}
});
}
复制代码
评论