Android TabHost用法详解

最近研究了一下Contacts源码,仿照上面自己写了一个TabHostTest程序,现整理如下:

main.xml布局文件:

<?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="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TabWidget android:id="@android:id/tabs"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
        />

        <FrameLayout android:id="@android:id/tabcontent"
            android:layout_width="match_parent"
            android:layout_height="0dip"
            android:layout_weight="1"
        />
    </LinearLayout>
</TabHost>


inner.xml文件:

<?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="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
s
        <FrameLayout android:id="@android:id/tabcontent"
            android:layout_width="fill_parent"
            android:layout_height="0dip"
            android:layout_weight="1"
        />
        
        <TabWidget android:id="@android:id/tabs"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
        />


    </LinearLayout>
</TabHost>

Main.java (主Activity类):

package com.android.test;

import android.app.Activity;
import android.app.TabActivity;
import android.content.Intent;
import android.os.Bundle;
import android.provider.CallLog.Calls;
import android.provider.Contacts.Intents.UI;
import android.view.Window;
import android.widget.TabHost;

public class Main extends TabActivity implements TabHost.OnTabChangeListener {
    private static final int TAB_INDEX_DIALER = 0;
    private static final int TAB_INDEX_CALL_LOG = 1;
    private static final int TAB_INDEX_CONTACTS = 2;
    private static final int TAB_INDEX_FAVORITES = 3;

    private TabHost mTabHost;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        final Intent intent = getIntent();

        requestWindowFeature(Window.FEATURE_NO_TITLE);
        
        setContentView(R.layout.main);

        mTabHost = getTabHost();
        mTabHost.setOnTabChangedListener(this);

        // Setup the tabs
        setupDialerTab();
        setupCallLogTab();
        setupContactsTab();
        setupFavoritesTab();

        setCurrentTab(intent);
    }

	public void onTabChanged(String tabId) {
		 Activity activity = getLocalActivityManager().getActivity(tabId);
	        if (activity != null) {
	            activity.onWindowFocusChanged(true);
	        }
	}
	 private void setupCallLogTab() {
	        // Force the class since overriding tab entries doesn't work
	        Intent intent = new Intent("com.android.phone.action.RECENT_CALLS");

	        intent.setClass(this, Inner.class);
	        mTabHost.addTab(mTabHost.newTabSpec("call_log")
	                .setIndicator("通话记录",
	                        getResources().getDrawable(R.drawable.ic_tab_unselected_recent))
	                .setContent(intent));
	    }
	 
	private void setupDialerTab() {
        Intent intent = new Intent("com.android.phone.action.TOUCH_DIALER");
        intent.setClass(this, Inner.class);

        mTabHost.addTab(mTabHost.newTabSpec("dialer")
                .setIndicator("拨号",
                        getResources().getDrawable(R.drawable.ic_tab_unselected_dialer))
                .setContent(intent));
    }

    private void setupContactsTab() {
        Intent intent = new Intent(UI.LIST_DEFAULT);
        intent.setClass(this, Main.class);

        mTabHost.addTab(mTabHost.newTabSpec("contacts")
                .setIndicator("通讯录",
                        getResources().getDrawable(R.drawable.ic_tab_unselected_contacts))
                .setContent(intent));
    }

    private void setupFavoritesTab() {
        Intent intent = new Intent(UI.LIST_STREQUENT_ACTION);
        intent.setClass(this, Inner.class);

        mTabHost.addTab(mTabHost.newTabSpec("favorites")
                .setIndicator("收藏",
                        getResources().getDrawable(R.drawable.ic_tab_unselected_starred))
                .setContent(intent));
    }

    /**
     * Sets the current tab based on the intent's request type
     *
     * @param intent Intent that contains information about which tab should be selected
     */
    private void setCurrentTab(Intent intent) {
        // Dismiss menu provided by any children activities
        Activity activity = getLocalActivityManager().
                getActivity(mTabHost.getCurrentTabTag());
        if (activity != null) {
            activity.closeOptionsMenu();
        }

        // Tell the children activities that they should ignore any possible saved
        // state and instead reload their state from the parent's intent
        intent.putExtra("", true);

        // Choose the tab based on the inbound intent
        String componentName = intent.getComponent().getClassName();
        if (getClass().getName().equals(componentName)) {
            if (false) {
               //in a call, show the dialer tab(which allows going back to the call)
                mTabHost.setCurrentTab(TAB_INDEX_DIALER);
            } else if ((intent.getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) != 0) {
                // launched from history (long-press home) --> nothing to change
            } else if (true) {
                // The dialer was explicitly requested
                mTabHost.setCurrentTab(TAB_INDEX_DIALER);
            } 
        }
    }
}

Inner.java类:

package com.android.test;

import android.app.TabActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Window;
import android.widget.TabHost;
import android.widget.TabWidget;
import android.widget.TextView;

public class Inner extends TabActivity implements TabHost.OnTabChangeListener {
    private static final int TAB_INDEX_ALL = 0;
    private static final int TAB_INDEX_MISSED = 1;
    private static final int TAB_INDEX_OUTGOING = 2;
    private static final int TAB_INDEX_RECEIVED = 3;

    private TabHost mTabHost;
    private TabWidget mTabWidget;
    
	@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.inner);

        mTabHost = getTabHost();
        mTabHost.setOnTabChangedListener(this);

        setupTabs();
        mTabWidget = mTabHost.getTabWidget();
        mTabWidget.setStripEnabled(false);

        for (int i = 0; i < mTabWidget.getChildCount(); i++) {

            TextView tv = (TextView) mTabWidget.getChildAt(i).findViewById(
                    android.R.id.title);
            tv.setTextColor(this.getResources().getColorStateList(
                    android.R.color.white));
            
            tv.setPadding(0, 0, 0,(int) tv.getTextSize());
            tv.setText("Tab" + i);
            mTabWidget.getChildAt(i).getLayoutParams().height =(int ) (3* tv.getTextSize());
 
            mTabWidget.getChildAt(i).setBackgroundResource(R.drawable.tab_bg);
        }
    }

	public void onTabChanged(String tabId) {
		
	}

    private void setupTabs() {
        mTabHost.addTab(mTabHost.newTabSpec("all").setIndicator(
                getString(R.string.inner)).setContent(
                new Intent(this, Other.class)));
        mTabHost.addTab(mTabHost.newTabSpec("Missed").setIndicator(
                getString(R.string.inner)).setContent(
                new Intent(this, Other.class)));
        mTabHost.addTab(mTabHost.newTabSpec("Outgoing").setIndicator(
                getString(R.string.inner)).setContent(
                new Intent(this, Other.class)));
        mTabHost.addTab(mTabHost.newTabSpec("Received").setIndicator(
                getString(R.string.inner)).setContent(
                new Intent(this, Other.class)));

    }
}

效果图如下:



评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值