TabActivity在android中实现多Activity切换,效果和之前的文章ActivityGroup+ScrollView效果类似。在SDK文档中TabActivity的类继承结构如下:
java.lang.Object ↳ android.content.Context ↳ android.content.ContextWrapper ↳ android.view.ContextThemeWrapper ↳ android.app.Activity ↳ android.app.ActivityGroup ↳ android.app.TabActivity文档在介绍这个类的时候还用了很多Demo来讲解,可以去看看。
好,这里主要介绍TabActivity+TabHost配置实现多个Activity切换的效果,根据官网的Demo和网上资料,我写了一个小小的例子来说明这个类的使用
首先建立一个类继承TabActivity
package dxd.tabactivity.test; import android.app.TabActivity; import android.content.Intent; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.widget.TabHost; import android.widget.TabHost.TabSpec; public class TabActivityTestActivity extends TabActivity { private TabHost m_tabHost; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); m_tabHost = getTabHost(); addOneTab(); addTwoTab(); addThreeTab(); } public void addOneTab(){ Intent intent = new Intent(); intent.setClass(TabActivityTestActivity.this, ActivityA.class); TabSpec spec = m_tabHost.newTabSpec("One"); LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE); View view = inflater.inflate(R.layout.tabspec1_layout, null); spec.setIndicator(view); spec.setContent(intent); m_tabHost.addTab(spec); } public void addTwoTab(){ Intent intent = new Intent(); intent.setClass(TabActivityTestActivity.this, ActivityB.class); TabSpec spec = m_tabHost.newTabSpec("Two"); spec.setIndicator(getString(R.string.two), getResources().getDrawable(R.drawable.icon)); spec.setContent(intent); m_tabHost.addTab(spec); } public void addThreeTab(){ Intent intent = new Intent(); intent.setClass(TabActivityTestActivity.this, ActivityC.class); TabSpec spec = m_tabHost.newTabSpec("Three"); spec.setIndicator(getString(R.string.three), null); spec.setContent(intent); m_tabHost.addTab(spec); } }由代码可以看出,是用TabHost下的一个子类TabSpec将这些按钮和Activity加入其中的,我加了3中风格的Tab进去,第一种是自己定义的布局文件,使用LayoutInflater将layout转换成View,第二种是加入了一个图片和文字,第三种只加入了文字。可以去看setIndicator这个方法,这里我罗列一下:
TabHost.TabSpec setIndicator(CharSequence label) // 只设置文字信息 TabHost.TabSpec setIndicator(View view) // 设置一个View 这就很灵活了 TabHost.TabSpec setIndicator(CharSequence label, Drawable icon) // 设置文字和图片,但是这个图文重叠了。求解啊,该怎么改?
即TabHost的id必须是android:id="@android:id/tabhost"
TabWidget的id必须是android:id="@android:id/tabs"
定义一个FrameLayout的id必须是android:id="@android:id/tabcontent"
见代码:
<?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"> <TabWidget android:id="@android:id/tabs" android:layout_width="fill_parent" android:layout_height="wrap_content" android:paddingLeft="1dip" android:paddingRight="1dip" android:paddingTop="4dip" /> <FrameLayout android:id="@android:id/tabcontent" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout> </TabHost>
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/tabspec" android:layout_width="fill_parent" android:orientation="horizontal" android:background="#fff000" android:layout_height="fill_parent"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="28sp" android:text="是的" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="28sp" android:text="@string/one" /> </LinearLayo