注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

是缘是情是童真

如果你用笑脸面对 你会看见别人的笑脸

 
 
 

日志

 
 

TabActivity & TabHost  

2011-07-21 17:03:09|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |


  tabActivity继承自Activity,其内部定义好了TabHost,可以通过getTabHost()获取。TabHost 包含了两种子元素:一些可以自由选择的Tab 和tab对应的内容tabContentto,在Layout的<TabHost>下它们分别对应 TabWidget和FrameLayout。
  使用TabActivity可以让同一个界面容纳更多的内容。我们将按照Standup Timer里的TeamDetailsActivity来讲述TabActivity的使用。在该例中,包含了两个Tab一个用于展示team的统计信息,一个用于展示team所参加的会议的列表(这是一个ListView)。

创建Layout 

<?xml version="1.0" encoding="utf-8"?>
  这里需要注意的是不管你是使用TabActivity 还是自定义TabHost,都要求以TabHost作为XML布局文件的根。
<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">
<RelativeLayout 
android:id="@+id/tab_rela"
android:layout_width="fill_parent" 
android:layout_height="50dip"
android:background="@drawable/channelgallery_bg"
>
<ImageButton 
android:id="@+id/tab_release"
android:layout_width="32dip" 
android:layout_height="32dip"
android:src="@drawable/release"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
/>
<ImageButton 
android:id="@+id/tab_camera"
android:layout_width="32dip" 
android:layout_height="32dip"
android:src="@drawable/camera"
android:layout_alignTop="@id/tab_release"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
/>
`<TextView 
android:id="@+id/tab_name"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center"
android:layout_centerVertical="true"
android:layout_toLeftOf="@id/tab_camera"
android:layout_toRightOf="@id/tab_release"
android:layout_alignTop="@id/tab_release"
android:text=""
/>
</RelativeLayout>

<FrameLayout android:id="@android:id/tabcontent"
android:layout_weight="1" 
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>
<TabWidget android:id="@android:id/tabs"
android:layout_alignParentBottom="true" 
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>
</TabHost>

 

通常我们采用线性布局所以<TabHost> 的子元素是 <LinearLayout>。<TabWidger>对应Tab。<FrameLayout>则用于包含Tab需要展示的内容。需要注意的是<TabWidger> 和<FrameLayout>的Id 必须使用系统id,分别为android:id/tabs 和 android:id/tabcontent 。因为系统会使用者两个id来初始化TabHost的两个实例变量(mTabWidget 和 mTabContent)。

编写Java代码

  我们可以采用两种方法编写标签页:一种是继承TabActivity ,然后使用getTabHost()获取TabHost对象;第二种方法是使用自定的TabHost在布局文件上<TabHost>的自定义其ID,然后通过findViewById(),方法获得TabHost对象。
 /**
  本文中采用继承TabActivity的方法。
     * TabHost控件
     */
    private TabHost tabHost;

    /**
     * TabWidget控件
     */
    private TabWidget mTabWidget;
    
    private final static String TAB1 = "MAIN";
    private final static String TAB2 = "CROP";
    private final static String TAB3 = "CALLME";
    private final static String TAB4 = "SEARCH";
    private final static String TAB5 = "OTHER";
    
    private ImageButton release;
    private ImageButton camera;
    private TextView username;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
    requestWindowFeature(Window.FEATURE_NO_TITLE);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.tab_activity);
        tabHost = getTabHost();
        /* 去除标签下方的白线 */
        tabHost.setPadding(tabHost.getPaddingLeft(),
        tabHost.getPaddingTop(), tabHost.getPaddingRight(),
        tabHost.getPaddingBottom() - 5);
        
        //outTab1选项卡
        Intent oneIntent = new Intent();
        oneIntent.setClass(this, MainMylangActivity.class);
        TabHost.TabSpec oneTabSpec = tabHost.newTabSpec(TAB1);
        oneTabSpec.setIndicator(getString(R.string.main_page), getResources().getDrawable(R.drawable.main));
        oneTabSpec.setContent(oneIntent);
        tabHost.addTab(oneTabSpec);
        
        //outTab2选项卡
        Intent twoIntent = new Intent();
        twoIntent.setClass(this, CropActivity.class);
        TabHost.TabSpec twoTabSpec = tabHost.newTabSpec(TAB2);
        twoTabSpec.setIndicator(getString(R.string.crop),getResources().getDrawable(R.drawable.crop));
        twoTabSpec.setContent(twoIntent);
        tabHost.addTab(twoTabSpec);

        //outTab3选项卡
        Intent threeIntent = new Intent();
        threeIntent.setClass(this, CallMeActivity.class);
        TabHost.TabSpec threeTabSpec = tabHost.newTabSpec(TAB3);
        threeTabSpec.setIndicator(getString(R.string.call_me), getResources().getDrawable(R.drawable.callme));
        threeTabSpec.setContent(threeIntent);
        tabHost.addTab(threeTabSpec);
        
        //outTab4选项卡
        Intent fourIntent = new Intent();
        fourIntent.setClass(this, SearchingActivity.class);
        TabHost.TabSpec fourTabSpec = tabHost.newTabSpec(TAB4);
        fourTabSpec.setIndicator(getString(R.string.search), getResources().getDrawable(R.drawable.search));
        fourTabSpec.setContent(fourIntent);
        tabHost.addTab(fourTabSpec);
        
      //outTab5选项卡
        Intent fiveIntent = new Intent();
        fiveIntent.setClass(this, OtherSetActivity.class);
        TabHost.TabSpec fiveTabSpec = tabHost.newTabSpec(TAB5);
        fiveTabSpec.setIndicator(getString(R.string.other), getResources().getDrawable(R.drawable.other));
        fiveTabSpec.setContent(fiveIntent);
        tabHost.addTab(fiveTabSpec);

 
        /* 对Tab标签的定制 */
        mTabWidget = tabHost.getTabWidget();
        for (int i = 0; i < mTabWidget.getChildCount(); i++)
        {
            /* 得到每个标签的视图 */
//            View view = mTabWidget.getChildAt(i);
            /* 设置每个标签的背景 */
//            if (tabHost.getCurrentTab() == i)
//            {
//                view.setBackgroundDrawable(getResources().getDrawable(
//                        R.drawable.back));
//            }
//            else
//            {
//                view.setBackgroundDrawable(getResources().getDrawable(
//                        R.drawable.bottom_menu_press_background));
//            }
            /* 设置Tab间分割竖线的颜色 */
            // tabWidget.setBackgroundColor(Color.WHITE);
            /* 设置Tab间分割竖线的背景图片 */
            // tabWidget.setBackgroundResource(R.drawable.icon);
            /* 设置tab的高度 */
            mTabWidget.getChildAt(i).getLayoutParams().height = 50;
            TextView tv = (TextView) mTabWidget.getChildAt(i).findViewById(
                    android.R.id.title);
            /* 设置tab内字体的颜色 */
//            tv.setTextColor(Color.rgb(49, 116, 171));
            //设置字体大小
            tv.setTextSize(12);
        }
        
        release = (ImageButton) findViewById(R.id.tab_release);
        camera = (ImageButton) findViewById(R.id.tab_camera);
        username = (TextView) findViewById(R.id.tab_name);
        
        release.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent mIntent = new Intent(HomeActivity.this,ReleaseActivity.class);
Bundle extra = new Bundle();
extra.putString("text", "发布");
mIntent.putExtras(extra);
startActivity(mIntent);
}
});
    }


SDK上的原文:
  Call setup() before adding tabs if loading TabHost using findViewById(). However You do not need to call setup() after getTabHost() in TabActivity

  接着向TabHost添加tabs.即调用tabHost.addTab(TabSpec) 方法。TabSpec主要包含了setIndicator 和 setContent 方法,通过这两个方法来指定Tab 和 TanContent。
  TabSpec 通过 .newTabSpec(String tag)来创建实例。实例化后对其属性进行设置 。setIndicator()设置tab,它有3个重载的函数
  •  public TabHost.TabSpec setIndicatior(CharSwquence label,Drawable icon).指定tab的标题和图标。
  • public TabHost.TabSpec (View view)通过View来自定义tab
  • public TabHost.TabSpec(CharSequence label) 指定tab的标题,此时无图标。
   setContent 指定tab的展示内容,它也有3种重载
  • public TabHost.TabSpec setContent(TabHost.TabContentFactory )
  • public TabHost.TabSpec setContent(int ViewId)
  • public TabHost.TabSpec setContent(Intent intent)
  后两种方法比较后理解一个是通过 ViewId指定显示的内容,如.setContent(R.id.Team_EditText)。第三种则是直接通过Intent加载一个新的Activity页。如.setContent(new Intent(this, MeetingActivity.class)));
  本例中是通过TabContentFactory 来指定对应的TabContent。TabContentFactory 是一个接口,其只包含了 一个返回 View 的createTabContent(String tag)方法。
private TabContentFactory createMeetingDetails(Team team2) {

return new TabHost.TabContentFactory() {

@Override
public View createTabContent(String tag) {
          //设置View
setStatsTabContent();
return findViewById(R.id.teamStats);
}
};
}

private TabHost.TabContentFactory createMeetingList()
{
return new TabHost.TabContentFactory() {

@Override
public View createTabContent(String tag) {
      
meetingListAdapter
= createMeetingListAdapter();
meetingList.setAdapter(meetingListAdapter);
return meetingList;
}
};
}

 

事先声明好的
private ListView meetingList=null;
private ArrayAdapter<String> meetingListAdapter = null;

 

我们也可以让TabActivity去实现TabContentFactory 接口
public class Tabs2 extends TabActivity implements TabHost.TabContentFactory

 

然后在TabActiviy类中实现createTabContent方法
@Override
public View createTabContent(String tag) {
final TextView tv = new TextView(this);
tv.setText(
"Content for tab with tag " + tag);
return tv;
}

 

setStatsTabContent();方法
TabActivity  TabHost - 只要心里有爱 - 只要心里有爱setStatsTabContent

 

  最后将TabSpec 添加到 TabHost上,即tabHost.addTab(tabSpec)。我们发现TabSpec 的setIndicator 和 setContent 方法返回的都是 TabSpec 自身所以可以使用窜的方式编写代码:

tabhost.addTab(tabhost.newTabSpec("stats_tab")
.setIndicator(
this.getString(R.string.stats))
.setContent(createMeetingDetails(team)));

  评论这张
 
阅读(1961)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017