TabActivity中的Tab标签详细设置


//################################################################# 

}

package com.woclub.tabactivitytest;


import android.app.TabActivity;
import android.content.res.ColorStateList;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TabHost;
import android.widget.TabWidget;
import android.widget.TextView;
import android.widget.TabHost.OnTabChangeListener;

/**
* 总结:在设置Tab的布局的时候首先需要newTabSpec再在其设置setIndicator(Tab名字,Tab的图标),
* 尤其需要注意setContent(),它有三种使用方法setContent(int)它是直接在布局文件中设置其布局,
* setContent(Intent)可以用Intent指定一个Activity,
* setContent(TabContentFactory)可以用一个类来指定其布局的方式
* @author Administrator
*
*/
public class MainActivity extends TabActivity {

private static final String Tab1 = "Tab1";
private static final String Tab2 = "Tab2";
private static final String Tab3 = "Tab3";
private static final String Tab4 = "Tab4";

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);


//1得到TabHost对象,正对TabActivity的操作通常都有这个对象完成
final TabHost tabHost = this.getTabHost();
final TabWidget tabWidget = tabHost.getTabWidget();

//2生成一个Intent对象,该对象指向一个Activity,当然现在例子比较简单就没有绑定其他的Activity故而不用
//3生成一个TabSpec对象,这个对象代表了一个Tab页
TabHost.TabSpec tabSpec = tabHost.newTabSpec(Tab1); 
//设置该页的indicator(指示器)设置该Tab页的名字和图标,以及布局
tabSpec.setIndicator(composeLayout("爽哉", R.drawable.coke))
.setContent(R.id.view1);
//4将设置好的TabSpec对象添加到TabHost当中
tabHost.addTab(tabSpec);

//第二个Tab
tabHost.addTab(tabHost.newTabSpec(Tab2).setIndicator(composeLayout("安逸", R.drawable.coke))
.setContent(R.id.view2));

//第三个Tab
tabHost.addTab(tabHost.newTabSpec(Tab3).setIndicator(composeLayout("开心", R.drawable.coke))
.setContent(R.id.view3));
//第四个Tab
tabHost.addTab(tabHost.newTabSpec(Tab4).setIndicator(composeLayout("说明", R.drawable.coke))
.setContent(R.id.view4));

//setContent(TabContentFactory)可以用一个类来指定其布局的方式,前三个都是用的setContent(int)方式
// CustomLayout custom = new CustomLayout(this);
// tabHost.addTab(tabHost.newTabSpec(Tab4).setIndicator("Tab4", getResources()
// .getDrawable(R.drawable.icon))
// .setContent(custom));
//*****************************这是对Tab标签本身的设置*******************************************
int width =45;
int height =48;
for(int i = 0; i < tabWidget.getChildCount(); i++)
{
//设置高度、宽度,不过宽度由于设置为fill_parent,在此对它没效果
tabWidget.getChildAt(i).getLayoutParams().height = height;
tabWidget.getChildAt(i).getLayoutParams().width = width;
/**
* 下面是设置Tab的背景,可以是颜色,背景图片等
*/
View v = tabWidget.getChildAt(i);
if (tabHost.getCurrentTab() == i) {
v.setBackgroundColor(Color.GREEN);
//在这里最好自己设置一个图片作为背景更好
//v.setBackgroundDrawable(getResources().getDrawable(R.drawable.chat));
} else {
v.setBackgroundColor(Color.GRAY);
}
}

//************************************************************************************
//设置Tab变换时的监听事件
tabHost.setOnTabChangedListener(new OnTabChangeListener() {

@Override
public void onTabChanged(String tabId) {
// TODO Auto-generated method stub
//当点击tab选项卡的时候,更改当前的背景
for(int i = 0; i < tabWidget.getChildCount(); i++)
{
View v = tabWidget.getChildAt(i);
if (tabHost.getCurrentTab() == i) {
v.setBackgroundColor(Color.GREEN);
} else {
//这里最后需要和上面的设置保持一致,也可以用图片作为背景最好
v.setBackgroundColor(Color.GRAY);
}
}
}
});

}
//##########################################这是设置TabWidget的布局
/**
* 这个设置Tab标签本身的布局,需要TextView和ImageView不能重合
* s:是文本显示的内容
* i:是ImageView的图片位置
* 将它设置到setIndicator(composeLayout("开心", R.drawable.coke))中
*/
public View composeLayout(String s, int i){
Log.e("Error", "composeLayout");
LinearLayout layout = new LinearLayout(this);
layout.setOrientation(LinearLayout.VERTICAL);

TextView tv = new TextView(this);
tv.setGravity(Gravity.CENTER);
tv.setSingleLine(true);
tv.setText(s);
tv.setTextColor(Color.RED);
layout.addView(tv, 
new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));

ImageView iv = new ImageView(this);
iv.setImageResource(i);
layout.addView(iv, 
new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
return layout;
}
//#################################################################


我都有详细的注释,估计大家都能看懂的,有些地方给了提示,扩展的需要就需要自己去完成了

下面是一个两个布局文件

一个是在layout中设置:


Java代码 

<?xml version="1.0" encoding="utf-8"?>
<!-- 
一个典型的标签Activity 是由2 部分构成的 且其id都有规定 即: 
* TabWidget 用于展示标签页 id=tabs 
* FrameLayout 用于展示隶属于各个标签的具体布局 id=tabconten
* TabHost 用于整个Tab布局 id=TabHost
还需注意要将Tab显示在最下面就需要这只LinearLayout时用Bottom
-->
<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"> 
<FrameLayout
android:id="@android:id/tabcontent" 
android:layout_width="fill_parent" 
android:layout_height="200dip" >
<RelativeLayout
android:id="@+id/view1"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
android:id="@+id/text1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="需要光临第一个Tab"/>
<ImageView
android:id="@+id/image1"
android:layout_height="wrap_content"
android:layout_below="@id/text1"
android:layout_width="wrap_content"
android:src="@drawable/icon"
/> 
</RelativeLayout>

<TextView
android:id="@+id/view2"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="需要光临第二个Tab"/>
<TextView
android:id="@+id/view3"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="需要光临第三个Tab"/>
<TextView
android:id="@+id/view4"
android:layout_width="fill_parent"
android:layout_height="fill_parent"

/>
</FrameLayout>
<TabWidget
android:id="@android:id/tabs"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
</TabWidget>
</LinearLayout>
</TabHost> 还有一个在类中设置,设置都差不多,在此类中设置只是针对每个Tab页面的设置


Java代码 

package com.woclub.tabactivitytest;
import android.app.Activity;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TabHost;
import android.widget.TextView;
/**
* 此类的功能是设置每个Tab标签的布局方式
* 使用方法
* CustomLayout ct = new CustomLayout(this); 
* tHost.addTab(tHost.newTabSpec(Tab4).setIndicator("Tab 4").setContent(ct)); 
* @author Administrator
*
*/
public class CustomLayout implements TabHost.TabContentFactory{

private Activity myActivity;
private LayoutInflater layoutHelper;//用于实例化布局
private LinearLayout layout;
//构造函数,从外面传递参数Activity
public CustomLayout(Activity myActivity)
{
this.myActivity = myActivity;
//通过getLayoutInflater从Activity中得到一个实例化的LayoutInflater
layoutHelper = myActivity.getLayoutInflater();
}
/**
* 根据不同的Tab创建不同的视图
*/
@Override
public View createTabContent(String tag) {
// TODO Auto-generated method stub
return addCustomView(tag);
}

/**
* 根据Tab的id设置不同Tab的view
* 这是普通的设置方式,设置每个Tab的布局
* @param id
* @return
*/
private View addCustomView(String id)
{
layout = new LinearLayout(myActivity);
layout.setOrientation(LinearLayout.HORIZONTAL);

if(id.equals("Tab1"))
{
ImageView iv = new ImageView(myActivity);
iv.setImageResource(R.drawable.chat);
//设置layout的布局,将一个ImageView添加到其中,并设置ImageView的布局格式,addView的第二个参数是设置ImageView的width和Height
layout.addView(iv, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT));
}
else if(id.equals("Tab2"))
{
//第一个控件,注意每添加一个空间都需要用addView添加到layout中
EditText edit = new EditText(myActivity);
layout.addView(edit, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
//第二个控件
Button button = new Button(myActivity);
button.setText("确定");
button.setWidth(100);
layout.addView(button, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT));
//第三个控件
RadioGroup rGroup = new RadioGroup(myActivity); 
rGroup.setOrientation(LinearLayout.HORIZONTAL); 
RadioButton radio1 = new RadioButton(myActivity); 
radio1.setText("Radio A"); 
rGroup.addView(radio1); 
RadioButton radio2 = new RadioButton(myActivity); 
radio2.setText("Radio B"); 
rGroup.addView(radio2); 

layout.addView(rGroup, 
new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT)); 
}
else if(id.equals("Tab3"))
{
TextView text = new TextView(myActivity);
text.setText("the third TextView");
text.setGravity(Gravity.CENTER);
layout.addView(text);
}
else if(id.equals("Tab4"))
{
LinearLayout.LayoutParams param3 = 
new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT); 
//在这里面又引用了布局文件来设置控件
layout.addView(layoutHelper.inflate(R.layout.hello, null),param3);
}
return layout;
}
 


}
好了,该说的都在代码中说明了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值