- 浏览: 11433 次
- 性别:
- 来自: 深圳
最新评论
-
雨花台舞水:
你装I3不是一般的牛
用 Quartz 进行作业调度 -
cectsky:
how to use org.quartz.dataSourc ...
用 Quartz 进行作业调度
我们对Android
应用程序
运行原理及布局文件可谓有了比较深刻的认识和理解,并且用“Hello World!”程序来实践证明了。在继续深入Android开发之旅
之前,有必要解决前两篇中没有介绍的遗留问题:View的几种布局显示方法,以后就不会在针对布局方面做过多的介绍。View的布局显示方式有下面几种:线性布局
(Linear Layout)、相对布局
(Relative Layout)、表格布局
(Table Layout)、网格视图
(Grid View)、标签布局
(Tab Layout)、列表视图
(List View)、绝对布局
(AbsoluteLayout)。本文虽然是介绍View的布局方式,但不仅仅是这样,其中涉及了很多小的知识点,绝对能给你带来Android大餐! 本文的主要内容就是分别介绍以上视图的七种布局显示方式效果及实现,大纲如下: 通过前面的学习我们知道:在一个Android应用程序中,用户界面通过View
和ViewGroup
对象构建。Android中有很多种View和ViewGroup,他们都继承自View
类。View对象是Android平台上表示用户界面的基本单元。 View的布局显示方式直接影响用户界面,View的布局方式是指一组View元素如何布局,准确的说是一个ViewGroup中包含的一些View怎么样布局。ViewGroup
类是布局(layout)和视图容器(View container)的基类,此类也定义了 其实,所有的布局方式都可以归类为ViewGroup的5个类别,即ViewGroup的5个直接子类。其它的一些布局都扩展自这5个类。下面分小节分别介绍View的七种布局显示方式。 线性布局
:是一个ViewGroup以线性方向显示它的子视图(view)元素,即垂直地
或水平地
。之前我们的Hello World!程序中view的布局方式就是线性布局的,一定不陌生!如下所示res/layour/main.xml
: 从上面可以看出根LinearLayout视图组(ViewGroup)包含5个Button,它的子元素是以线性方式(horizontal,水平的)布局,运行效果如下图所示: 图2、线性布局(水平或者说是横向) 如果你在android
:orientation
="horizontal"
设置为vertical
,则是是垂直或者说是纵向的,如下图所示: 图3、线性布局(垂直或者说是纵向)
这个属性很关键,如果你没有显示设置它,它默认为0。把上面布局文件(水平显示的那个
)中的这个属性都去掉,运行会得出如下结果: 图4、layout_weight属性 没有了这个属性,我们本来定义的5个Button运行后却只显示了2个Button,为什么呢??
"
weight"
顾名思义是权重
的
意思,layout_weight
用于给一个线性布局中的诸多视图的重要程度赋值。所有的视图都有一个layout_weight值,默认为零,意思是需要显示多大的视图就占据多大的屏幕
空间。这就不难解释为什么会造成上面的情况了:Button1~Button5都设置了layout_height和layout_width属性为
wrap_content即包住文字内容,他们都没有设置layout_weight
属性,即默认为0.,这样Button1和Button2根据需要的内容占据了整个屏幕,别的就显示不了啦! 若
赋一个高于零的值,则将父视图中的可用空间分割,分割大小具体取决于每一个视图的layout_weight值以及该值在当前屏幕布局的整体
layout_weight值和在其它视图屏幕布局的layout_weight值中所占的比率而定。举个例子:比如说我们在
水平方向上有一个文本标签和两个文本编辑元素。该文本标签并无指定layout_weight值,所以它将占据需要提供的最少空间。如果两个文本编辑元素
每一个的layout_weight值都设置为1,则两者平分在父视图布局剩余的宽度(因为我们声明这两者的重要度相等)。如果两个文本编辑元素其中第一
个的layout_weight值设置为1,而第二个的设置为2,则剩余空间的三分之二分给第一个,三分之一分给第二个(数值越小,重要度越高
)。 相对布局
:是一个ViewGroup以相对位置显示它的子视图(view)元素,一个视图可以指定相对于它的兄弟视图的位置(例如在给定视图的左边或者下面)或相对于 图5、相对布局 表格布局
:是一个ViewGroup以表格显示它的子视图(view)元素,即行和列标识一个视图的位置。其实Android的表格布局跟HTML中的表格布局非常类似, 用表格布局需要知道以下几点
: 图6、表格布局 列表布局
:是一个ViewGroup以列表显示它的子视图(view)元素,列表是可滚动的列表。列表元素通过 下面通过一个例子来,创建一个可滚动的列表,并从一个字符串数组读取列表元素。当一个元素被选择时,显示该元素在列表中的位置的消息。 1)、首先,将res/layour/main.xml
的内容置为如下: 这样就定义了元素在列表中的布局。 2)、src/skynet.com.cnblogs.www/HelloWorld.Java
文件的代码如下: Note
:onCreate()
函数中并不像往常一样通过setContentView()
为活动(Activity)加载布局文件,替代的是通过 3)、运行应用程序得如下结果(点击1之后,在下面显示了1): 图7、列表布局 NOTE:
如果你改了HelloWorld extends
ListActivity
而不是Activity
之
后,运行程序是提示:“Conversion to Dalvik format failed with error 1”。可以这么解决:解决办法是
Project > Clean... > Clean project selected below > Ok 上面我们是把要填充到ListView中的元素硬编码到HelloWorld.java文件中,这样就缺乏灵活性!也不符合推荐的应用程序的界面
与控制它行为的代码
更好地分离的准则! 其实我们可以把要填充到ListView的元素写到 然而HelloWorld.java文件中的onCreate()
函数,则这样动态访问这个数组及填充到ListVies: 首先总结一下列表布局的关键部分: 其中Adapter是ListView和数据源之间的桥梁,根据数据源的不同Adapter可以分为三类: 使
用ArrayAdapter(数组适配器)顾名思义,需要把数据放入一个数组以便显示,上面的例子就是这样的;SimpleAdapter能定义各种各样
的布局出来,可以放上ImageView(图片),还可以放上Button(按钮),CheckBox(复选框)等
等;SimpleCursorAdapter是和数据库有关的东西。篇幅有限后面两种就不举例实践了。你可以参考android ListView详解
orArrayAdapter ,SimpleAdapter ,SimpleCursorAdapter 区别
。 网格布局
:是一个ViewGroup以网格显示它的子视图(view)元素,即二维的、滚动的网格。网格元素通过 下面也通过一个例子来,创建一个显示图片缩略图的网格。当一个元素被选择时,显示该元素在列表中的位置的消息。 1)、首先,将上面实践截取的图片放入 2)、res/layour/main.xml
的内容置为如下:这个GridView填满整个屏幕,而且它的属性都很好理解,按英文单词的意思就对了。 3)、然后,HelloWorld.java文件中onCreate()
函数如下: onCreate()
函数跟通常一样,首先调用超类的onCreate()
函数函数,然后通过setContentView()
为活动(Activity)加载布局文件。紧接着是,通过GridView的id获取布局文件中的gridview,然后调用它的 4)、实现我们自定义ImageAdapter,新添加一个类文件,它的代码如下: ImageAdapter类扩展自 如果View传到getView()不是空的,则本地的ImageView初始化时将循环再用View对象。在getView()方法末尾,position整数传入setImageResource()方法以从mThumbIds数组中选择图片。 运行程序会得到如下结果(点击第一张图片之后): 图8、网格布局 绝对布局
:是一个ViewGroup以绝对方式显示它的子视图(view)元素,即以坐标的方式来定位在屏幕上位置。 这种布局方式很好理解,在布局文件或编程地设置View的坐标,从而绝对地定位。如下所示布局文件: 简单吧,这里不在深入了! 标签布局
:是一个ViewGroup以标签的方式显示它的子视图(view)元素,就像在Firefox中的一个窗口中显示多个网页一样。 为了狂创建一个标签UI
(tabbed UI),需要使用到 1)、在项目中建立三个隔离的Activity类:ArtistisActivity、AlbumActivity、SongActivity。它们每个表示一个分隔的标签。每个通过TextView显示简单的一个消息,例如: 其它两个类也类似。 2)、设置每个标签的图标,每个图标应该有两个版本:一个是选中时的,一个是未选中时的。通常的设计建议是,选中的图标应该是深色(灰色),未选中的图标是浅色(白色)。 现在创建一个state-list drawable
指定哪个图标表示标签的状态:将图片放到res/drawable目录下并创建一个新的XML文件命名为 3)、res/layour/main.xml
的内容置为如下: 这个布局将显示标签和提供上面创建的活动之间的导航。 4)、HelloWorld.java文件源码如下: 设置每个标签的文字和图标,并分配每个标签一个活动(这里为了方便三个标签都有相同的图标)。TabHost的引用第一次通过 5)、打开Android的清单文件AndroidManifest.xml
,添加 现在运行可以看到如下结果:
图9、标签布局
1、view的布局显示概述
ViewGroup.LayoutParams
类,它作为布局参数的基类,此类告诉父视图其中的子视图想如何显示。例如,XML布局文件中名为layout_something
的属性(参加上篇的4.2节
)。我们要介绍的View
的布局方式的类,都是直接或间接继承自ViewGroup
类,如下图所示:
图1、继承自ViewGroup的一些布局类
2、线性布局(Linear Layout)
<?
xml version="1.0" encoding="utf-8"?>
<
LinearLayout
xmlns
:android
="http://schemas.android.com/apk/res/android"
android
:layout_width
="fill_parent"
android
:layout_height
="fill_parent"
android
:orientation
="horizontal"
><!-- have an eye on ! -->
<
Button
android
:id
="@+id/button1"
android
:layout_width
="wrap_content"
android
:layout_height
="wrap_content"
android
:text
="Hello, I am a Button1"
android
:layout_weight
="1"
/>
<
Button
android
:id
="@+id/button2"
android
:layout_width
="wrap_content"
android
:layout_height
="wrap_content"
android
:text
="Hello, I am a Button2"
android
:layout_weight
="1"
/>
<
Button
android
:id
="@+id/button3"
android
:layout_width
="wrap_content"
android
:layout_height
="wrap_content"
android
:text
="Hello, I am a Button3"
android
:layout_weight
="1"
/>
<
Button
android
:id
="@+id/button4"
android
:layout_width
="wrap_content"
android
:layout_height
="wrap_content"
android
:text
="Hello, I am a Button4"
android
:layout_weight
="1"
/>
<
Button
android
:id
="@+id/button5"
android
:layout_width
="wrap_content"
android
:layout_height
="wrap_content"
android
:text
="Hello, I am a Button5"
android
:layout_weight
="1"
/>
</
LinearLayout
>
2.1、Tips:android
:layout_weight
="1"
3、相对布局(Relative Layout)
RelativeLayout
的特定区域的位置(例如底部对齐,或中间偏左)。
相对布局是设计用户界面的有力工具,因为它消除了嵌套视图组。如果你发现你使用了多个嵌套的
LinearLayout
视图组后,你可以考虑使用一个RelativeLayout
视图组了。看下面的res/layour/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
="Type here:"
/>
<
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"
/><!-- have an eye on ! -->
<
Button
android
:id
="@+id/ok"
android
:layout_width
="wrap_content"
android
:layout_height
="wrap_content"
android
:layout_below
="@id/entry" <!-- have an eye on ! -->
android
:layout_alignParentRight
="true" <!-- have an eye on ! -->
android
:layout_marginLeft
="10dip"
android
:text
="OK"
/>
<
Button
android
:layout_width
="wrap_content"
android
:layout_height
="wrap_content"
android
:layout_toLeftOf
="@id/ok" <!-- have an eye on ! -->
android
:layout_alignTop
="@id/ok" <!-- have an eye on ! -->
android
:text
="Cancel"
/>
</
RelativeLayout
>
从上面的布局文件我们知道,RelativeLayout
视图组包含一个TextView、一个EditView、两个Button,注意标记了<!-- have an eye on ! -->
的属性,在使用相对布局
方式中就是使用这些类似的属性来定位视图到你想要的位置,它们的值是你参照的视图的id
。这些属性的意思很简单,就是英文单词的直译,就不多做介绍了。运行之后,得如下结果:
4、 表格布局(Table Layout)
TableRow
就像HTML表格的<tr>标记。
看下面的res/layour/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
:shrinkColumns
="0,1,2"
><!-- have an eye on ! -->
<
TableRow
><!-- row1 -->
<
Button
android
:id
="@+id/button1"
android
:layout_width
="wrap_content"
android
:layout_height
="wrap_content"
android
:text
="Hello, I am a Button1"
android
:layout_column
="0"
/>
<
Button
android
:id
="@+id/button2"
android
:layout_width
="wrap_content"
android
:layout_height
="wrap_content"
android
:text
="Hello, I am a Button2"
android
:layout_column
="1"
/>
</
TableRow
>
<
TableRow
><!-- row2 -->
<
Button
android
:id
="@+id/button3"
android
:layout_width
="wrap_content"
android
:layout_height
="wrap_content"
android
:text
="Hello, I am a Button3"
android
:layout_column
="1"
/>
<
Button
android
:id
="@+id/button4"
android
:layout_width
="wrap_content"
android
:layout_height
="wrap_content"
android
:text
="Hello, I am a Button4"
android
:layout_column
="1"
/>
</
TableRow
>
<
TableRow
>
<
Button
android
:id
="@+id/button5"
android
:layout_width
="wrap_content"
android
:layout_height
="wrap_content"
android
:text
="Hello, I am a Button5"
android
:layout_column
="2"
/>
</
TableRow
>
</
TableLayout
>
运行之后可以得出下面的结果:
5、列表视图(List View)
ListAdapter
自动插入到列表。
ListAdapter
:扩展自Adapter
,它是ListView
和数据列表之间的桥梁。ListView可以显示任何包装在ListAdapter中的数据。该类提供两个公有类型的抽象方法:
<?
xml version="1.0" encoding="utf-8"?>
<
TextView
xmlns
:android
="http://schemas.android.com/apk/res/android"
android
:layout_width
="fill_parent"
android
:layout_height
="fill_parent"
android
:padding
="10dp"
android
:textSize
="16sp"
>
</
TextView
>
package
skynet.com.cnblogs.www;import
android.app.ListActivity;import
android.os.Bundle;import
android.view.View;import
android.widget.AdapterView;import
android.widget.ArrayAdapter;import
android.widget.ListView;import
android.widget.TextView;import
android.widget.Toast;import
android.widget.AdapterView.OnItemClickListener;public
class
HelloWorld extends
ListActivity
{
//注意这里Helloworld类不是扩展自Acitvity,而是扩展自ListAcitivty /** Called when the activity is first created. */
@Override public
void
onCreate(Bundle savedInstanceState) { super
.onCreate(savedInstanceState); setListAdapter(new
ArrayAdapter<String>(this
, R.layout.main, COUNTRIES));
ListView lv = getListView(); lv.setTextFilterEnabled(true
); lv.setOnItemClickListener(new
OnItemClickListener() { public
void
onItemClick(AdapterView<?> parent, View view, int
position, long
id) { // When clicked, show a toast with the TextView text
Toast.makeText(getApplicationContext(), ((TextView) view).getText(), Toast.LENGTH_SHORT).show(); } }); } static
final
String[] COUNTRIES = new
String[] { "1
", "2
", "3
", "4
", "5
", "6
", "7
", "8
", "9
", "10
", "11
", "12
", "13
", "14
", "15
", "16
", "17
", "18
", "19
", "20
", "21
", "22
", "23
", "24
" };}
setListAdapter(ListAdapter)
自动添加一个ListView填充整个屏幕的ListActivity。在此文件中这个方法以一个ArrayAdapter为参数:setListAdapter(new
ArrayAdapter<String>(this
, R.layout.main, COUNTRIES))
,
这个ArrayAdapter管理填入ListView中的列表元素。ArrayAdapter的构造函数的参数为:this(表示应用程序的上下文
context)、表示ListViewde布局文件(这里是R.layout.main)、插入ListView的List对象对数组(这里是
COUNTRES)。
setOnItemClickListener(OnItemClickListener)
定义了每个元素的点击(on-click)的监听器,当ListView中的元素被点击时,
onItemClick()
方法被调用,在这里是即一个
Toast
消息——每个元素的位置将显示。
5.1、一个小的改进
res/values/strings.xml
文件中的<string-array>
元素中,然后再源码中动态地读取。这样strings.xml的内容类似下面:
<?
xml version="1.0" encoding="utf-8"?>
<
resources
>
<
string
-array
name
="countries_array"
>
<
item
>
1</
item
>
<
item
>
2</
item
>
<
item
>
3</
item
>
<
item
>
4</
item
>
<
item
>
5</
item
>
<
item
>
6</
item
>
<
item
>
7</
item
>
</
string
-array>
</
resources
>
String[] countries = getResources().getStringArray(R.array.countries_array);
setListAdapter(new
ArrayAdapter<String>(this
, R.layout.list_item, countries));
5.2、补充说明
6、网格视图(Grid View)
ListAdapter
自动插入到网格。
ListAdapter跟上面的列表布局是一样的,这里就不重复累述了。res/drawable/
<?
xml version="1.0" encoding="utf-8"?>
<
GridView
xmlns
:android
="http://schemas.android.com/apk/res/android"
android
:id
="@+id/gridview"
android
:layout_width
="fill_parent"
android
:layout_height
="fill_parent"
android
:columnWidth
="90dp"
android
:numColumns
="auto_fit"
android
:verticalSpacing
="10dp"
android
:horizontalSpacing
="10dp"
android
:stretchMode
="columnWidth"
android
:gravity
="center"
/>
public
void
onCreate(Bundle savedInstanceState) { super
.onCreate(savedInstanceState); setContentView(R.layout.main); GridView gridview = (GridView) findViewById(R.id.gridview); gridview.setAdapter(new
ImageAdapter(this
)); gridview.setOnItemClickListener(new
OnItemClickListener() { public
void
onItemClick(AdapterView<?> parent, View v, int
position, long
id) { Toast.makeText(HelloWorld.this
, "
" + position, Toast.LENGTH_SHORT).show(); } }); }
setListAdapter(ListAdapter)
函数填充它,它的参数是一个我们自定义的ImageAdapter。后面的工作跟列表布局中一样,为监听网格中的元素被点击的事件而做的工作。package
skynet.com.cnblogs.www;import
android.content.Context;import
android.view.View;import
android.view.ViewGroup;import
android.widget.BaseAdapter;import
android.widget.GridView;import
android.widget.ImageView;public
class
ImageAdapter extends
BaseAdapter { private
Context mContext; public
ImageAdapter(Context c) { mContext = c; } public
int
getCount() { return
mThumbIds.length; } public
Object getItem(int
position) { return
null
; } public
long
getItemId(int
position) { return
0; } // create a new ImageView for each item referenced by the Adapter
public
View getView(int
position, View convertView, ViewGroup parent) { ImageView imageView; if
(convertView == null
) { // if it's not recycled, initialize some attributes
imageView = new
ImageView(mContext); imageView.setLayoutParams(new
GridView.LayoutParams(85, 85)); imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); imageView.setPadding(8, 8, 8, 8); } else
{ imageView = (ImageView) convertView; } imageView.setImageResource(mThumbIds[position]); return
imageView; } // references to our images
private
Integer[] mThumbIds = { R.drawable.linearlayout1, R.drawable.linearlayout2, R.drawable.linearlayout3, R.drawable.listview, R.drawable.relativelayout, R.drawable.tablelayout };}
BaseAdapter
,所以首先得实现它所要求必须实现的方法。构造函数和getcount()函数很好理解,而getItem(int)应该返回实际对象在适配器中的特定位置,但是这里我们不需要。类似地,getItemId(int)应该返回元素的行号,但是这里也不需要。
这里重点要介绍的是getView()方法,它为每个要添加到ImageAdapter的图片都创建了一个新的View。当调用这个方法时,一个View是循环再用的,因此要确认对象是否为空。如果是空的话,一个
ImageView
就被实例化且配置想要的显示属性:
setLayoutParams(ViewGroup.LayoutParams)
:设置View的高度和宽度,这确保不管drawable中图片的大小,每个图片都被重新设置大小且剪裁以适应这些尺寸。setScaleType(ImageView.ScaleType)
:声明图片应该向中心剪裁(如果需要的话)。setPadding(int, int, int, int)
:定义补距,如果图片有不同的横纵比,小的补距将导致更多的剪裁以适合设置的ImageView的高度和宽度。
7、绝对布局
(AbsoluteLayout)
<
AbsoluteLayout
xmlns
:android
="http://schemas.android.com/apk/res/android"
android
:id
="@+id/AbsoluteLayout01"
android
:layout_width
="fill_parent"
android
:layout_height
="fill_parent"
>
<
TextView
android
:id
="@+id/txtIntro"
android
:text
="绝对布局"
android
:layout_width
="fill_parent"
android
:layout_height
="wrap_content"
android
:layout_x
="20dip"<!-- have an eye on ! -->
android
:layout_y
="20dip"
><!-- have an eye on ! -->
</
TextView
>
</
AbsoluteLayout
>
8、标签布局(Tab Layout)
TabHost
和TabWidget
。
TabHost
必须是布局的根节点,它包含为了显示标签的TabWidget
和显示标签内容的
FrameLayout
。可
以有两种方式实现标签内容:使用标签在同一个活动中交换视图、使用标签在完全隔离的活动之间改变。根据你的需要,选择不同的方式,但是如果每个标签提供不
同的用户活动,为每个标签选择隔离的活动,因此你可以更好地以分离的组管理应用程序,而不是一个巨大的应用程序和布局。
下面还有一个例子来创建一个标签UI,每个标签使用隔离的活动。
public
class
ArtistsActivity extends
Activity { public
void
onCreate(Bundle savedInstanceState) { super
.onCreate(savedInstanceState); TextView textview = new
TextView(this
); textview.setText("This is the Artists tab
"); setContentView(textview); }}
ic_tab_artists.xml
,内容如下:<?
xml version="1.0" encoding="utf-8"?>
<
selector
xmlns
:android
="http://schemas.android.com/apk/res/android"
>
<!-- When selected, use grey -->
<
item
android
:drawable
="@drawable/ic_tab_artists_grey"
android
:state_selected
="true"
/>
<!-- When not selected, use white-->
<
item
android
:drawable
="@drawable/ic_tab_artists_white"
/>
</
selector
>
<?
xml version="1.0" encoding="utf-8"?>
<
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"
android
:padding
="5dp"
>
<
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"
android
:padding
="5dp"
/>
</
LinearLayout
>
</
TabHost
>
TabHost
要求包含一个TabWidget
和一个
FrameLayout
。TabWidget
和FrameLayout
TabHost
以线性垂直地显示。package
skynet.com.cnblogs.www;import
android.widget.TabHost;import
android.app.TabActivity;import
android.content.Intent;import
android.content.res.Resources;import
android.os.Bundle;public
class
HelloWorld extends
TabActivity{ /** Called when the activity is first created. */
@Override public
void
onCreate(Bundle savedInstanceState) { super
.onCreate(savedInstanceState); setContentView(R.layout.main); Resources res = getResources(); // Resource object to get Drawables
TabHost tabHost = getTabHost(); // The activity TabHost
TabHost.TabSpec spec; // Resusable TabSpec for each tab
Intent intent; // Reusable Intent for each tab
// Create an Intent to launch an Activity for the tab (to be reused)
intent = new
Intent().setClass(this
, ArtistsActivity.class
); // Initialize a TabSpec for each tab and add it to the TabHost
spec = tabHost.newTabSpec("artists
").setIndicator("Artists
", res.getDrawable(R.drawable.ic_tab_artists)) .setContent(intent); tabHost.addTab(spec); // Do the same for the other tabs
intent = new
Intent().setClass(this
, AlbumsActivity.class
); spec = tabHost.newTabSpec("albums
").setIndicator("Albums
", res.getDrawable(R.drawable.ic_tab_artists)) .setContent(intent); tabHost.addTab(spec); intent = new
Intent().setClass(this
, SongsActivity.class
); spec = tabHost.newTabSpec("songs
").setIndicator("Songs
", res.getDrawable(R.drawable.ic_tab_artists)) .setContent(intent); tabHost.addTab(spec); tabHost.setCurrentTab(2); }}
getTabHost()
获取。然后,为每个标签,创建
TabHost.TabSpec
定义标签的属性。
newTabSpec(String)
方法创建一个新的TabHost.TabSpec
以给定的字符串标识标签。调用TabHost.TabSpec
, setIndicator(CharSequence, Drawable)
为每个标签设置文字和图标,调用setContent(Intent)
指定Intent
去打开合适的活动。每个TabHost.TabSpec
通过调用addTab(TabHost.TabSpec)
添加到TabHost。
最后,
setCurrentTab(int)
设置打开默认显示的标签,通过索引标签的位置。NoTitleBar
主题到HelloWorld的
<activity>
标记。这将移除默认应用程序的标题和顶端布局,给标签腾出位置。
<activity>
标记应该像这样: <
activity
android
:name
=".HelloWorld"
android
:label
="@string/app_name"
android
:theme
="@android:style/Theme.NoTitleBar"
>
你运行这个程序能够得到什么结果呢?请自行检查。不过我在这里告诉你很有可能会运行不了,报“java.lang.NullPointerException
”错!我想运行这个例子的很多人都会有这个问题,不信你试试!
PS:其实这也算是Android的一个bug,而且这个bug在2.2中还没有解决,这个问题全球N多人都碰到了,并在http://code.google.com/p/android/issues
中挂号了,相关问题的编号有不止一个。
接着往下看……
如果你看了我这篇文章,你一定会是个幸运儿!经过我艰苦的调试+找资料,我找到了解决方法:
在清单文件AndroidManifest.xml
,添加下面三个Activity:
<
activity
android
:name
=".AlbumsActivity"
android
:label
="@string/app_name"
>
</
activity
>
<
activity
android
:name
=".ArtistsActivity"
android
:label
="@string/app_name"
>
</
activity
>
<
activity
android
:name
=".SongsActivity"
android
:label
="@string/app_name"
>
</
activity
>
相关推荐
### Android布局详解 Android应用程序开发过程中,布局设计是至关重要的环节之一。良好的布局不仅能够提升应用的用户体验,还能让开发者更高效地管理界面元素。本文将详细介绍Android中的各种布局属性及其作用,...
### Android布局详解 #### 一、概述 在Android应用开发中,布局管理是构建用户界面的基础。合理且灵活地使用不同的布局方式可以帮助开发者创建出既美观又实用的应用界面。本篇文章将详细介绍Android中的几种基本...
Android布局详解【图文】 在Android应用开发中,布局(Layout)是构建用户界面的基础,它决定了各个组件在屏幕上的排列方式和位置。本篇将详细讲解Android中的五种主要布局:线性布局(Linear Layout)、相对布局...
Android开发中布局管理器是用于组织界面元素的重要工具,它决定了界面元素在屏幕上的排列方式。Android系统提供了多种布局管理器,以下是五大常用布局方式的详细说明: 1. 线性布局(LinearLayout): 线性布局是最...
### Android布局详解 Android应用程序开发过程中,布局设计是至关重要的环节之一。良好的布局不仅能够提升应用的用户体验,还能让开发者更高效地管理界面元素。本文将深入探讨Android布局中的关键属性及其应用场景...
### Android布局属性详解 在Android应用开发过程中,布局设计至关重要,它决定了用户界面的美观性和易用性。本文将深入探讨Android布局中的关键属性,并通过示例解释它们的具体用途及应用场景。 #### ...
在Android开发中,界面布局是构建用户界面的关键部分。它决定了应用中各个组件的位置和排列方式,从而影响用户体验。本文将深入探讨Android界面布局的各个方面。 1、用户界面及视图层次 Android用户界面主要由View...
### Android界面布局详解 在Android应用开发中,创建直观且响应迅速的用户界面(UI)是至关重要的。本文将深入探讨Android系统提供的五种基本布局类型:LinearLayout(线性布局)、TableLayout(表格布局)、...
0302_TableLayout`、`android_0304_RelativeLayout`、`android_0303_FrameLayout`可能对应着分别讲解这四种布局的示例代码或教程资源,通过学习这些实例,开发者可以更好地理解和掌握Android布局的实际应用。...
### Android六大布局详解 #### 一、基本理论 在Android应用开发中,界面设计是非常重要的一个环节,良好的界面布局能够显著提升用户体验。Android系统提供了多种布局类型来满足不同场景下的需求,下面将详细介绍六...
本文档主要讲述的是android界面布局详解;在通过“Hello World!”介绍Android中的布局问题之前,不得不先介绍一下Android中的用户界面,因为布局问题也是用户界面问题之一。在一个Android应用程序中,用户界面通过...
Android XML 布局属性详解 Android XML 布局属性是 Android 应用程序中最基本也是最重要的一部分。它负责控制屏幕上的各种控件的布局和排列。 Android XML 布局属性可以分为三类:第一类是属性值为 true 或 false ...
"android 五大布局详解" Android 中的五大布局对象是指 FrameLayout、LinearLayout、AbsoluteLayout、RelativeLayout 和 TableLayout。这些布局对象是 Android 应用程序开发中最基本和最常用的布局方式。 ...
Android布局详解实例,包含:线性布局(LinearLayout)、相对布局(RelativeLayout)、帧布局(FrameLayout)、表格布局(TableLayout)四大布局方式的demo
Android studio布局详解
### Android布局控件之RelativeLayout详解 #### 一、概述 在Android开发中,布局是非常重要的一环,良好的布局设计能够使界面美观且适应各种屏幕尺寸。`RelativeLayout`作为Android提供的几种基本布局之一,通过...