1.TabActivity 继承自Activity,其内部定义好了TabHost,可以通过getTabHost()获取TabHost。
TabHost 包含了两种子元素:一些可以自由选择的Tab,及 与这些tab对应的内容tabContent,在layout的<TabHost>下它们分别对应 TabWidget (用于展示标签页, id固定为tabs )和 FrameLayout(用于展示隶属于各个标签的具体布局, id固定为tabcontent)。
Tabhost默认的布局文件:
<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:gravity="bottom"
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="200dip" >
</FrameLayout>
</LinearLayout>
</TabHost>
2.最简单的TabActivity示例,不用设置setContentView(R.layout.main); ,不依靠布局文件:
public class ILoveConactActivity extends TabActivity implements TabHost.TabContentFactory,OnTabChangeListener
{
public void onCreate(Bundle icicle)
{
super.onCreate(icicle);
//取得TabHost对象
TabHost tabHost=this.getTabHost();
tabHost.setOnTabChangedListener(this);
for(int i=0;i<4;i++)
{
String tabItemTitle="tab"+i;
String tabItemTag=""+i;
TabSpec tabSpec=tabHost.newTabSpec(tabItemTag);
tabSpec.setIndicator(tabItemTitle);//或者setIndicator(CharSequence label, Drawable icon) ,setIndicator(View view)
/*
或者tabSpec.setContent(R.id.viewId);//R.id.viewId是在布局文件中的view的id。,setIndicator(View view),
setContent(TabContentFactory contentFactory)时会动态确定内容。
setContent(Intent intent) Specify an intent to use to launch an activity as the tab content.
*/
tabSpec.setContent(this);
tabHost.addTab(tabSpec);
}
tabHost.setCurrentTab(1);//或者setCurrentTabByTag(String tag)
//加上下面这4行代码,使TabWidget到底部:
TabWidget tabWidget = this.getTabWidget(); //或者tabHost.getTabWidget();
LinearLayout layout= (LinearLayout) tabHost.getChildAt(0);
layout.removeViewAt(0);
layout.addView(tabWidget);//把tabWidget 从第一个位置移除,再添加到下面来。
}
@Override
public void onTabChanged(String tabId)
{
// TODO Auto-generated method stub
}
@Override
public View createTabContent(String tag)
{
TextView view=new TextView(this);
view.setText("tab content "+tag);
return view;//不能返回null,否则会报错。
}
}
intent必须是一个关联Activity的intent。
http://www.cnblogs.com/over140/archive/2010/12/13/1904085.html
3.对TabWidget的理解:
(1)TabWidget 为 horizontal 的 LinearLayout
(2)且 其包含的标签又是一个RelativeLayout
(3) 每个标签RelativeLayout 里面包含2个View:TextView和ImageView
推算出其布局为:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<RelativeLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<ImageView />
<TextView />
</RelativeLayout>
<RelativeLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<ImageView />
<TextView />
</RelativeLayout>
<RelativeLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<ImageView />
<TextView />
</RelativeLayout>
<RelativeLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<ImageView />
<TextView />
</RelativeLayout>
</LinearLayout>
4.基于默认的Tabhost布局文件,自定义布局文件:
<?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">
<!-- TabHost必须包含一个 TabWidget和一个FrameLayout-->
<TabHost android:id="@+id/tabhost"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>
<LinearLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<!-- TabWidget的id属性必须为 @android:id/tabs-->
<TabWidget android:id="@android:id/tabs"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
</TabWidget>
<!-- FrameLayout的id属性必须为 @android:id/tabcontent-->
<FrameLayout android:id="@android:id/tabcontent"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView android:id="@+id/view1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/>
<TextView android:id="@+id/view2"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/>
<TextView android:id="@+id/view3"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/>
</FrameLayout>
</LinearLayout>
</TabHost>
</LinearLayout>
5.TabHost中的子Activity虽然是用Intent参数来启动,但实际上并没有去启动一个全新的Activity。维护了几个子View
6.ActivityGroup的问题:
它是用来做Tab切换用的,不是用做栈导航的;
在一个ActivityGroup中连续开启同一个Activity,第2个及之后和第1个在创建菜单的函数调用顺序上不同;
在一个ActivityGroup中连续开启同一个Activity非同一个Activity,后面的创建菜单的函数不再调用了...
另外也没有StartActivityForResult函数。
ActivityGroup中可以指定界面中的各个部分内容来自不同的Activity,这时这些Actvitiy只作为内容管理单元。
发送邮件失败,检查个人信息中的姓名,邮件地址是否填写了。