TabHost及ActivityGroup的使用总结

本文详细介绍了Android中TabHost的两种实现方式:通过继承TabActivity和在XML文件中定义TabHost组件。同时,还探讨了TabHost与ActivityGroup结合使用的场景及具体实现步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

TabHost的实现方式一:

通过继承TabActivity来实现

布局文件activity_main.xml文件内容如下:



    
        
	
	
    
        
	
	
    
        
	
    


MainActivity代码如下

public class MainActivity extends TabActivity {
	private TabHost tabHost;
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		//通过继承TabActivity这种方式的主要目的就是方便获得TabHost对象
		tabHost = getTabHost();
		//把定义的布局文件加载到tabHost的视图里,true代表添加到其根元素处
		LayoutInflater.from(this).inflate(R.layout.activity_main, tabHost.getTabContentView(), true);
		//增加了三个标签页,newTabSpec里的参数是我们自定义的标签名称
		//setIndicator是显示出来的标签名称
		//setContent是该标签里面显示的内容
		tabHost.addTab(tabHost.newTabSpec("tag1").setIndicator("第一页").setContent(R.id.tab1));
		tabHost.addTab(tabHost.newTabSpec("tag2").setIndicator("第二页").setContent(R.id.tab2));
		tabHost.addTab(tabHost.newTabSpec("tag3").setIndicator("第三页").setContent(R.id.tab3));
	}
}

请记住一点,MainActivity中的setContentView已经没有了意义,我们是通过inflate来动态加载xml文件

所以务必把setContentView那行代码删除,不然会报错。

*********************************************************************************************************************

TabHost的实现方式二:

在XML文件中进行定义TabHost组件,相比较为复杂。其中标签页是在底部的布局文件如下



    
	
	    
		
		    
		        
		    
		    
		        
		    
		    
		        
		    
		    
		        
		    
			        
	
    


MainActivity代码如下

public class MainActivity extends Activity {
	private TabHost tabHost;
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.tabhost);
		
		tabHost = (TabHost) findViewById(R.id.tabHost);
		tabHost.setup();
		
		View view1 = View.inflate(this, R.layout.tabview1, null);
		View view2 = View.inflate(this, R.layout.tabview2, null);
		View view3 = View.inflate(this, R.layout.tabview3, null);
		View view4 = View.inflate(this, R.layout.tabview4, null);
		
		tabHost.addTab(tabHost.newTabSpec("tag1").setIndicator(view1).setContent(R.id.tab1));
		tabHost.addTab(tabHost.newTabSpec("tag2").setIndicator(view2).setContent(R.id.tab2));
		tabHost.addTab(tabHost.newTabSpec("tag3").setIndicator(view3).setContent(R.id.tab3));
		tabHost.addTab(tabHost.newTabSpec("tag4").setIndicator(view4).setContent(R.id.tab4));
	}
}
这种方式实现的话,必须要setUp,不然会报错。此外,因为我想让标签页显示地好看一点,所以自定义了

一些View。

*********************************************************************************************************************

TabHost与ActivityGroup的结合使用

在开发中,有可能在一个TabHost标签中(tag1)有多个页面的跳转这样的需求,那么就可以使用到这种方式实现了。

第一点,该TabHost必须继承于TabActivity的方式实现

第二点,ActivityGroup的管理


第一步,上面的方式一。

第二步,代码如下

public class MainActivity extends TabActivity {
	private TabHost tabHost;
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		//setContentView(R.layout.tabhost);
		
		tabHost = getTabHost();
		
		LayoutInflater.from(this).inflate(R.layout.activity_main, tabHost.getTabContentView(),true);
		
		
		View view1 = View.inflate(this, R.layout.tabview1, null);
		View view2 = View.inflate(this, R.layout.tabview2, null);
		View view3 = View.inflate(this, R.layout.tabview3, null);
		//通过意图跳转
		Intent intent = new Intent(MainActivity.this,MyActivityGroup.class);
		//第一个标签的setContent参数为意图对象
		tabHost.addTab(tabHost.newTabSpec("tag1").setIndicator(view1).setContent(intent));
		tabHost.addTab(tabHost.newTabSpec("tag2").setIndicator(view2).setContent(R.id.test2));
		tabHost.addTab(tabHost.newTabSpec("tag3").setIndicator(view3).setContent(R.id.test3));
	}
}
第三步,定义一个类继承于ActivityGroup,该类就是用来管理在这标签上生成的Activity
public class MyActivityGroup extends ActivityGroup {
	public static ActivityGroup group;
	
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		group = this;
	}
	
	public void onBackPressed() {
		//group.getLocalActivityManager().getCurrentActivity().onBackPressed();
	}
	
	protected void onResume() {  
        super.onResume();  
        //要跳转的界面  
        Intent intent = new Intent(this, FirstActivity.class).  
                  addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);  
        //把一个Activity转换成一个View  
        Window w = group.getLocalActivityManager().startActivity("FirstActivity",intent);  
        View view = w.getDecorView();  
        //把View添加大ActivityGroup中  
        group.setContentView(view);  
    }
}
第四步,定义一个类,该类就是ActivityGroup跳转后的结果,也就是该标签第一个显示的页面
public class FirstActivity extends Activity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.zhang);  //这里你想显示什么就通过布局文件来写
	}
	//我在布局文件中增加了一个按钮,该按钮实现了跳转到该标签的下一个页面
	//其实和在ActivityGroup跳转到本Activity的区别不大,就多了一个类名来调用group
	public void click(View v){
		Intent intent = new Intent(FirstActivity.this, SecondActivity.class).  
                addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
		Window w = MyActivityGroup.group.getLocalActivityManager()  
	              .startActivity("SecondActivity",intent);  
        View view = w.getDecorView();  
        MyActivityGroup.group.setContentView(view);
	}
}
第五步,再定义一个类,SecondActivity,就是通过按钮后跳转的Activity
第六步,Manifest文件的配置
增加了:  <activity android:name=".MyActivityGroup" />
        <activity android:name=".FirstActivity" />
        <activity android:name=".SecondActivity" />



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值