TabActivity

2023-10-07 13:58
文章标签 tabactivity

本文主要是介绍TabActivity,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

简单介绍:


一个典型的标签Activity  是由2 部分构成的 且其id都有规定 即:
* TabHost必须用于展示标签页 id=@android:id/tabhost
* TabWidget 必须用于展示标签页 id=@android:id/tabs
* FrameLayout 必须用于展示隶属于各个标签的具体布局 id=@android:id/tabcontent

TabActivity
首先Android里面有个名为TabActivity来给我们方便使用。其中有以下可以关注的函数:
 public TabHost getTabHost ()  获得当前TabActivity的TabHost
public TabWidget getTabWidget () 获得当前TabActivity 的TabWidget
public void setDefaultTab (String tag) 这两个函数很易懂, 就是设置默认的Tab
 public void setDefaultTab (int index)  通过tab名——tag或者index(从0开始)
protected void onRestoreInstanceState (Bundle state) 这 两个函数的介绍可以
protected void onSaveInstanceState (Bundle outState) 参考 Activity的生命周期
TabHost
那么我们要用到的Tab载体是TabHost,需要从TabActivity.getTabHost获取。
现在看看TabHost类,它有3个内嵌类:1个类TabHost.TabSpec,2个接口 TabHost.TabContentFactory和TabHost.OnTabChangeListener。后面会介绍这些类和接口。
TabHost类的一些函数:
public void addTab (TabHost.TabSpec tabSpec) 添加 tab,参数TabHost.TabSpec通过下面的函数返回得到
public TabHost.TabSpec newTabSpec (String tag) 创 建TabHost.TabSpec
public void clearAllTabs () remove所有的Tabs
public int getCurrentTab ()
public String getCurrentTabTag ()
public View getCurrentTabView ()
public View getCurrentView ()
public FrameLayout getTabContentView () 返回Tab content的FrameLayout
 public TabWidget getTabWidget ()
public void setCurrentTab (int index)       设置当前的Tab by index
public void setCurrentTabByTag (String tag) 设置当前的Tab by tag
public void setOnTabChangedListener (TabHost.OnTabChangeListener l) 设置TabChanged事件的响应处理
public void setup () 这个函数后面介绍
TabHost.TabSpec
从上面的函数可以知道如何添加tab了,要注意,这里的Tag(标签),不是Tab按钮上的文字。
而要设置tab的label和content,需要设置TabHost.TabSpec类。 引用SDK里面的话——“A tab has a tab indicator, content, and a tag that is used to keep track of it.”,TabHost.TabSpec就是管理这3个东西:
public String getTag ()
public TabHost.TabSpec setContent
public TabHost.TabSpec setIndicator
我理解这里的 Indicator 就是Tab上的label,它可以
设置label :  setIndicator (CharSequence label)
或者同时 设置label和iconsetIndicator (CharSequence label, Drawable icon)
或者直接 指定某个view :  setIndicator (View view)
对于 Content ,就是Tab里面的内容,可以
设置View的id :  setContent(int viewId)
或者 TabHost.TabContentFactory 的createTabContent(String tag)来处理: setContent(TabHost.TabContentFactory contentFactory)
或者用 new Intent 来引入其他Activity的内容: setContent(Intent intent)


一个例子:
<?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" />
        <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>

import android.app.AlertDialog;
import android.app.Dialog;
import android.app.TabActivity;
import android.content.DialogInterface;
import android.graphics.Color;
import android.os.Bundle;
import android.widget.TabHost;
import android.widget.TabHost.OnTabChangeListener;

public class Activity01 extends TabActivity
{
    //声明TabHost对象
    TabHost mTabHost;
    /** Called when the activity is first created. */
    @Override
    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);
       
        //设置当前显示哪一个标签
        mTabHost.setCurrentTab(0);
       
        //标签切换事件处理,setOnTabChangedListener
        mTabHost.setOnTabChangedListener(new OnTabChangeListener()
        {
            // TODO Auto-generated method stub
            @Override
            public void onTabChanged(String tabId)
            {
                    Dialog dialog = new AlertDialog.Builder(Activity01.this)
                            .setTitle("提示")
                            .setMessage("当前选中:"+tabId+"标签")
                            .setPositiveButton("确定",
                            new DialogInterface.OnClickListener()
                            {
                                public void onClick(DialogInterface dialog, int whichButton)
                                {
                                    dialog.cancel();
                                }
                            }).create();//创建按钮
             
                    dialog.show();
            }           
        });
    }
}

可能很多人对TabActivity 不满意 原因之一:其很不美观 而不美观的根源就是:其图像和文字相互覆盖
那么 我们可以自己扩展么? 当然可以

//不调用setIndicator() 不可以了
tab_2.setIndicator("");
//获取TabWidget节点
TabWidget tw =this.getTabWidget();
//打开获取第二个layout
RelativeLayout rl =(RelativeLayout)tw.getChildAt(1);
//添加view
rl.addView(LayoutInflater.from(this).inflate(R.layout.tab_2, rl,false));
tabhost.addTab(tab_2);


这篇关于TabActivity的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/158207

相关文章

Android TabActivity使用方法

TabActivity   首先Android里面有个名为TabActivity来给我们方便使用。其中有以下可以关注的函数:    public TabHost getTabHost ()  获得当前TabActivity的TabHost    public TabWidget getTabWidget () 获得当前TabActivity 的TabWidget      public

Android TabActivity的生命周期

TabActivity 是android应用中很特殊的一个activity,再特殊它也是继承Activity,生命周期也应该是符合Activity的那个 onCreate--》onResume....这样的正常的生命周期的吧?   本文之所以提到是因为,是因为我再使用TabActivity的时候,每次点击了tab子activity,而我们的mainActivity的onResume都会调用一次

Android TabActivity中onKeyDown无法响应的解决方法

Android中某个类继承Activity的子类TabActivity时,重载Activity中的public boolean onKeyDown(int keyCode, KeyEvent event)方法时,点击按键时并得不到响应,解决的方法是: 重载public boolean dispatchKeyEvent(KeyEvent event)方法,其示例代码如下: privat

Android开发:使用Fragment改造TabActivity

TabActivity在API 13(Android 3.2)被标记为过期,需要使用Fragment来实现,Fragment是Android 3.0引入的一个概念,主要就是为了适应各种不同的屏幕大小(手机、平板电脑)。Android 4.1发布时,google还发布了一个Android Support v4的包,用于Android 1.6以上的系统兼容新的特性,其中包括Fragment。为了在低于