`

android tabhost --android UI 学习

阅读更多
最近由于项目原因,需要使用tabhost,写一下自己的使用方法

  实现TabHost有三种方式:继承自TabActivity,ActivityGroup和自定义的Activity

1.使用TabAcitvity

    TabActivity他自己包含一个Tabhost,我们通过getTabhost(),也不需要调用setContentView()设置layout。如果设置一定要按照android SDK的规定进行设置。SDK规定的是:TabHost,TabWidget,FrameLayout的id必须为@android:id/tabhost,@android:id/tabs
,@android:id/tabcontent;
<TabHost xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/tabhost" android:layout_height="match_parent"
android:layout_width="fill_parent" android:background="@drawable/inde_bg">
<LinearLayout android:orientation="vertical" android:id="@+id/layout1"
android:layout_width="fill_parent" android:layout_height="fill_parent">

<TabWidget android:id="@android:id/tabs"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
</TabWidget>
<FrameLayout android:id="@android:id/tabcontent"
android:layout_width="wrap_content" android:layout_height="wrap_content">
</FrameLayout>
</LinearLayout>

</TabHost>
否则会报什么需要设置相应的id。
实现代码如下(需要的图片包括在zip文件中):
         public class IndexActicity extends TabActivity  {
	private int index_tab = 0;
	private TabWidget tabWidget;

	@Override
	protected void onCreate(Bundle savedInstanceState) {

		super.onCreate(savedInstanceState);
		DisplayMetrics dm = new DisplayMetrics();
		getWindowManager().getDefaultDisplay().getMetrics(dm);
		Constant.WIDTH = dm.widthPixels;
		Constant.HEIGHT= dm.heightPixels;
		TabHost t =getTabHost();
		t.setBackgroundDrawable(getResources().getDrawable(R.drawable.inde_bg));
		t.setPadding(0, 0, 0, 0);
		tabWidget = t.getTabWidget();

		LayoutInflater fi = LayoutInflater.from(IndexActicity.this);

		View view = fi.inflate(R.layout.tab_layout, null);
		LinearLayout ll = (LinearLayout) view.findViewById(R.id.tablayout);
		View tab1 = view.findViewById(R.id.tab1);
		View tab2 = view.findViewById(R.id.tab2);
		View tab3 = view.findViewById(R.id.tab3);
		View tab4 = view.findViewById(R.id.tab4);
		ll.removeAllViews();
		t.addTab(t.newTabSpec("1").setIndicator(tab1
						).setContent(
								new Intent(IndexActicity.this,
										TabActivity1.class)));
		t.addTab(t.newTabSpec("2").setIndicator(tab2
						).setContent(
								new Intent(IndexActicity.this,
										TabActivity2.class)));
		t.addTab(t.newTabSpec("3").setIndicator(tab3
						).setContent(
								new Intent(IndexActicity.this,
										TabActivity3.class)));
		t.addTab(t.newTabSpec("4").setIndicator(tab4).setContent(
				new Intent(IndexActicity.this, TabActivity4.class)));
		tabWidget.setBackgroundColor(getResources().getColor(R.color.alpha_00));
		tabWidget.setBaselineAligned(true);
		tab1.setBackgroundDrawable(getResources().getDrawable(
				R.drawable.menu_bg));
		for (int i = 0; i < tabWidget.getChildCount(); i++) {
			tabWidget.getChildAt(i).getLayoutParams().width = Constant.WIDTH / 4;
			tabWidget.getChildAt(i).getLayoutParams().height=50;
		}
		t.setOnTabChangedListener(new OnTabChangeListener() {

			@Override
			public void onTabChanged(String tabId) {
				tabChanged(tabId);
			}
		});

	}
//捕获tab变化事件
	public void tabChanged(String tabId) {
		if (index_tab != (Integer.valueOf(tabId) - 1)) {
			tabWidget.getChildAt(Integer.valueOf(tabId) - 1)
					.setBackgroundDrawable(
							getResources().getDrawable(R.drawable.menu_bg));
			tabWidget.getChildAt(index_tab).setBackgroundDrawable(null);

			index_tab = Integer.valueOf(tabId) - 1;
		}
	}
}

运行结构如图1
[img]

[/img]

备注:我在继承TabActivity的时候,将TabWidget的android:layout_height设置为"fill_parent"时,结构出现的图为
[img]

[/img]

2.使用GroupActivity和自定义
    
   使用GroupActivity和自己定义的Activity的区别不大,主要区别是:GroupActivity主要为了实现每个Tab可以包含不同的Activity,而自己定义的Activity却不能实现,只能显示一些View。所以如果你需要在不同的tab中显示Activity时,则需要继承GroupActivity,或者TabActivity。
    
        用这两种方法实现需要调用setContentView()设置layout,layout中包括这个tabhost,tabwidget及Fremelayout。而且一定要对tabhost调用setup方法,否则会出现空指针异常,原因是setup方法初始化tabwidget和framelayout对象。
        这个时候的layout如下:
        
	<TabHost xmlns:android="http://schemas.android.com/apk/res/android" 
	android:id="@+id/testhost" android:layout_height="match_parent"
		android:layout_width="fill_parent" android:background="@drawable/inde_bg">
		<LinearLayout android:orientation="vertical" android:id="@+id/layout1"
			android:layout_width="fill_parent" android:layout_height="fill_parent">
			<TabWidget android:id="@android:id/tabs"
				 android:layout_width="fill_parent"
				android:layout_height="wrap_content">
			</TabWidget>
			<FrameLayout android:id="@android:id/tabcontent"
				android:layout_width="wrap_content" android:layout_height="wrap_content">
			</FrameLayout>
		</LinearLayout>

	</TabHost>

类如下
  
public class IndexActicity extends ActivityGroup  {
	private int index_tab = 0;
	private TabWidget tabWidget;

	@Override
	protected void onCreate(Bundle savedInstanceState) {

		super.onCreate(savedInstanceState);
		setContentView(R.layout.index_layout);
		DisplayMetrics dm = new DisplayMetrics();
		getWindowManager().getDefaultDisplay().getMetrics(dm);
		Constant.WIDTH = dm.widthPixels;
		Constant.HEIGHT= dm.heightPixels;
		//TabHost t =getTabHost();
		TabHost t = (TabHost)findViewById(R.id.testhost);
		t.setBackgroundDrawable(getResources().getDrawable(R.drawable.inde_bg));
		t.setup(this.getLocalActivityManager());
		t.setPadding(0, 0, 0, 0);
		tabWidget = t.getTabWidget();

		LayoutInflater fi = LayoutInflater.from(IndexActicity.this);

		View view = fi.inflate(R.layout.tab_layout, null);
		LinearLayout ll = (LinearLayout) view.findViewById(R.id.tablayout);
		View tab1 = view.findViewById(R.id.tab1);
		View tab2 = view.findViewById(R.id.tab2);
		View tab3 = view.findViewById(R.id.tab3);
		View tab4 = view.findViewById(R.id.tab4);
		ll.removeAllViews();
		t.addTab(t.newTabSpec("1").setIndicator(tab1
						).setContent(
								new Intent(IndexActicity.this,
										TabActivity1.class)));
		t.addTab(t.newTabSpec("2").setIndicator(tab2
						).setContent(
								new Intent(IndexActicity.this,
										TabActivity2.class)));
		t.addTab(t.newTabSpec("3").setIndicator(tab3
						).setContent(
								new Intent(IndexActicity.this,
										TabActivity3.class)));
		t.addTab(t.newTabSpec("4").setIndicator(tab4).setContent(
				new Intent(IndexActicity.this, TabActivity4.class)));
		tabWidget.setBackgroundColor(getResources().getColor(R.color.alpha_00));
		tabWidget.setBaselineAligned(true);
		tab1.setBackgroundDrawable(getResources().getDrawable(
				R.drawable.menu_bg));
		for (int i = 0; i < tabWidget.getChildCount(); i++) {
			tabWidget.getChildAt(i).getLayoutParams().width = Constant.WIDTH / 4;
			tabWidget.getChildAt(i).getLayoutParams().height=50;
		}
		t.setOnTabChangedListener(new OnTabChangeListener() {

			@Override
			public void onTabChanged(String tabId) {
				tabChanged(tabId);
			}
		});

	}
//捕获tab变化事件
	public void tabChanged(String tabId) {
		if (index_tab != (Integer.valueOf(tabId) - 1)) {
			tabWidget.getChildAt(Integer.valueOf(tabId) - 1)
					.setBackgroundDrawable(
							getResources().getDrawable(R.drawable.menu_bg));
			tabWidget.getChildAt(index_tab).setBackgroundDrawable(null);

			index_tab = Integer.valueOf(tabId) - 1;
		}
	}

细心的人可能看到,这个layout中的tabhost 的属性id不是android默认的tabhost了,这个时候,就需要在activity中使用findViewById(R.id.XXXX);当然你也可以使用android的默认id,在类中直接使用:TabHost t = (TabHost)findViewById(android.R.id.tabhost);但是如果你修改了tabhost的属性id,而在调用的时候又使用默认的id,则会报找不到android.R.id.tabhost标签。

   如果修改了tabwidget和framelayout的id,系统会报需要相应的标签,这个是在setup方法调用的默认id。因为他只会在当前的layout中找android.R.id.tabs和android.R.id.tabcontent。

   如果想让tab显示在下边,只需要将tabwidget和framelayout调换位置即可。

    试着修改了一下tabwidget和framelayout的属性id值,但是没有找到解决办法,哪位大牛如果知道,可以告诉一下,
  • 大小: 69.3 KB
  • 大小: 73.8 KB
分享到:
评论
1 楼 joyvag 2012-09-03  
同求最后一个问题的解决方案

相关推荐

    android tabhost --android UI源码.zip项目安卓应用源码下载

    android tabhost --android UI源码.zip项目安卓应用源码下载android tabhost --android UI源码.zip项目安卓应用源码下载 1.适合学生毕业设计研究参考 2.适合个人学习研究参考 3.适合公司开发项目技术参考

    android tabhost --android UI源码.rar

    这个“android tabhost --android UI源码.rar”压缩包文件包含了关于如何使用TabHost进行界面设计的源代码示例,非常适合开发者参考学习。 首先,TabHost是一个容器,它可以包含一个FrameLayout(称为“宿主”),...

    android tabhost --android UI源码.zip

    总的来说,这个"android tabhost --android UI源码"项目提供了一个学习和研究Android TabHost的实例,对于初学者或希望深入理解Android UI设计的开发者来说具有很高的价值。通过对源码的深入学习,不仅可以掌握...

    Android源码——android tabhost --android UI源码.zip

    这个压缩包"Android源码——android tabhost --android UI源码.zip"可能包含了一些示例代码,图片资源以及关于如何使用TabHost的解释。 首先,我们来深入理解TabHost的工作原理。TabHost是一个容器,它管理着多个...

    Android代码-tabhost--UI源码.zip

    然而,了解TabHost仍然是学习Android历史和进阶开发的重要一环。 首先,TabHost包含两个主要元素:TabWidget和FrameLayout。TabWidget负责显示并管理各个标签,而FrameLayout则承载被选中标签对应的内容。当用户...

    android tabhost --android UI源码-IT计算机-毕业设计.zip

    总之,这个“android tabhost --android UI源码”项目是学习Android开发中TabHost组件的宝贵资源,对于初次接触Android应用开发的学生来说,是理解和实践Android界面设计的好材料。通过深入研究这个源码,不仅可以...

    Androidtabhost--AndroidUI源码.zip

    这个压缩包“Androidtabhost--AndroidUI源码.zip”很可能包含了一个关于如何使用TabHost进行UI设计的示例代码。 TabHost在Android中是一个容器,它负责管理和显示多个Tab。它的工作原理是通过TabWidget来展示各个...

    安卓Android源码——tabhost--UI源码.zip

    在安卓开发中,TabHost是实现多标签...综上所述,这个压缩包提供了一个学习和研究Android TabHost UI的好资源。通过源码分析和示例图片,开发者可以更好地掌握这一关键组件的使用,从而提升应用的用户体验和交互设计。

    Android ViewPager和Tabhost结合,可滑动的tabhost-IT计算机-毕业设计.zip

    4. 最后,可能还需要对UI进行一些定制,比如修改TabHost的样式,或者添加滑动指示器等,以提供更友好的用户体验。 这个源码Demo适合初学者研究,通过实践理解Android中如何将旧有的TabHost组件与ViewPager结合,...

    android_radiogroup_switch_fragment_replace_tabhost-master.zip

    通过学习和分析这个项目,开发者可以深入理解如何在Android中创建动态的、可交互的底部菜单栏,同时掌握RadioGroup、Switch、Fragment等组件的用法,以及如何优雅地替换旧的TabHost组件。这对于提升Android UI设计和...

    Android应用源码-系统工具类设计安卓源代码(82例).zip

    android tabhost --android UI源码 Android Txt文本阅读器源码 Android Widget快捷拨号程序源码 Android 仓库管理系统源码 Android 仿ES界面文件浏览器源码 Android 仿iPhoneQQ气泡聊天样式源码 Android 仿QQ多级...

    Android应用源码之ViewPager和Tabhost结合,可滑动的tabhost-IT计算机-毕业设计.zip

    本项目"Android应用源码之ViewPager和Tabhost结合,可滑动的tabhost"是一个很好的学习资源,特别适合毕业设计和论文研究。 首先,我们要理解ViewPager。ViewPager是Android Support Library中的一个组件,它允许...

    android--自定义TabHost

    总的来说,自定义TabHost是一个涉及UI设计和交互逻辑的过程,它可以让你的Android应用拥有独特的标签栏设计。通过学习和实践,开发者可以根据项目需求创建出符合品牌形象且功能完善的标签栏,提高用户的使用体验。

    android-->tabHost

    总的来说,`TabHost`是Android早期实现多标签导航的重要工具,虽然现在有了更多选择,但理解其工作原理仍对理解Android UI设计有帮助。在源码分析中,我们可以看到`TabHost`如何组织和管理选项卡,以及如何与`Intent...

    Android TabHost UI设计 菜单完美显示

    在Android应用开发中,UI设计是至关重要的,它直接影响到用户体验和应用的吸引力。本教程将专注于使用TabHost创建一个美观且功能完善的菜单系统。TabHost是Android SDK提供的一种组件,用于实现多标签页的界面布局,...

Global site tag (gtag.js) - Google Analytics