`
hao3100590
  • 浏览: 128644 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

TabActivity中的Tab标签详细设置

阅读更多

 

参考链接:

http://www.iteye.com/topic/602737

这个写的很不错,我是跟着一步步写下来的,不过到最后也遇到了麻烦,就是不能将Tab标签的文字和图片分开,始终是重合的,而且每个具体的代码,还是搞了许久才出来,故而分享之,希望能给大家带来方便,也谢谢下面的高人,呵呵!

http://www.youmi.net/bbs/thread-102-1-4.html

这个和上面的代码是一样的,不过代码不全,对于初学者来说,考验的时候来了,完善就是提高的过程,不要怕麻烦!

下面就根据上面的参考自己写的,当然大部分是相同的,不过有详细的注释,完整的代码

如果有什么不明白就留言吧!呵呵

首先结果图:

图1:

图2:



 图3:


当然界面没有前面的仁兄好看,我是讲究实用,美化需要自己慢慢做了

呵呵

 

下面直接代码:

 

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中设置:

 

<?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页面的设置

 

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;
	}
	


}

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

希望大家喜欢,做的粗糙,就由大家去改进吧!

呵呵!

欢迎大家的讨论

 

  • 大小: 5.2 KB
  • 大小: 18 KB
  • 大小: 16.4 KB
0
0
分享到:
评论
1 楼 a41606709 2015-06-20  
为什么我的tabhost显示不出来? 怎么设置在全部页面中让他先死

相关推荐

    TabActivity自定义实现标签换页

    一个简单的TabActivity自定义实现标签换页例子

    使用 TabActivity 实现滑动翻页(带动画)和标签置底

    使用 TabActivity 实现滑动翻页(带动画)和标签置底

    Android Tab标签的使用基础

    Android程序中,Tab标签窗口是一种常用的UI界面元素。它的实现主要是利用了TabHost类。 TabHost说明 TabHost是一个标签窗口的容器。 一个TabHost对象包含两个子元素对象: 一个对象是tab标签集合(TabWidget),用户...

    Android开发之TabActivity用法实例详解

    TabActivity实现标签页的功能,通过导航栏对各个页面进行管理。 二.XML布局文件 注意: 1.TabActivity的布局文件要求以TabHost作为XML布局文件的根。 2.通常我们采用线性布局,所以&lt;TabHost&gt; 的子元素是 。 3.对应...

    Android之ActivityGroup + GridView 实现Tab分页标签

    很多客户端软件和浏览器软件都喜欢用Tab分页标签来搭建界面框架。读者也许会马上想到使用TabHost 与 TabActivity的组合,其实最常用的不是它们,而是由GridView与ActivityGroup的组合。每当用户在GridView选中一项,...

    ActivityGroup|顶部底部均有Tab标签之二

    ActivityGroup|顶部底部均有Tab标签之二 http://blog.csdn.net/geofferysun/article/details/41852605

    TabFragment 使用Fragment 实现标签功能

    最好用的标签实现方法。通过隐藏不需要的Fragment 实现 .直接导入攻城即可使用

    Android切换卡TabWidget用法示例

    Tab选项卡类似与电话本的界面,通过多个标签切换不同的内容,要实现这个效果,首先要知道TabHost,它是一个用来存放多个Tab标签的容器,每一个Tab都可以对应自己的布局,比如,电话本中的Tab布局就是一个线性布局 ...

    android的Tag标签的实现

    //设置其标签和图标(setIndicator) //设置内容(setContent) mTabHost.addTab(mTabHost.newTabSpec("test1") .setIndicator("TAB 1",getResources().getDrawable(R.drawable.img1)) .setContent(R.id....

    andrpod TAB

    tabHost.addTab(tabHost.newTabSpec("tab1").setIndicator("欣赏音乐").setContent(R.id.tab1_layout)); tabHost.addTab(tabHost.newTabSpec("tab2").setIndicator("查看日历").setContent(R.id.tab2_layout)); ...

    android UI源码.zip

    备注:我在继承TabActivity的时候,将TabWidget的android:layout_height设置为"fill_parent"时,tab中不显示任何东西。如图: 如果修改了tabwidget和framelayout的id,系统会报需要相应的标签,这个是在setup方法...

    Android入门之ActivityGroup+GridView实现Tab分页标签的方法

    在Android程序中很多客户端软件和浏览器软件都喜欢用Tab分页标签来搭建界面框架。读者也许会马上想到使用TabHost 与 TabActivity的组合,其实最常用的不是它们,而是由GridView与ActivityGroup的组合。每当用户在...

    ActivityTab

    这是一个教你怎么分类标签的教程,用tabActivity实现分页

    Android TabWidget切换卡的实现应用

    要实现这一效果,首先要了解TabHost,它是一个用来存放多个Tab标签的容器。每一个Tab都可以对应自己的布局,比如,电话薄中的Tab布局就是一个List的线性布局了。 要使用TabHost,首先需要通过getTabHost方法来获取...

    LCRapidDevelop-master

    //设置页面为加载中.. progress.showLoading(); //设置适配器 mQuickAdapter = new ListViewAdapter(R.layout.list_view_item_layout,null); //设置加载动画 mQuickAdapter.openLoadAnimation...

    Android Tabhost使用方法详解

    Android 实现tab视图有2种方法,一种是在布局页面中定义标签,另一种就是继承tabactivity.但是我比较喜欢第二种方式,应为如果页面比较复杂的话你的XML文件会写得比较庞大,用第二种方式XML页面相对要简洁得多。 下面...

Global site tag (gtag.js) - Google Analytics