android 开发,TabHost 做标签页 ,求大神指教
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android 开发,TabHost 做标签页 ,求大神指教相关的知识,希望对你有一定的参考价值。
myHost.addTab(myHost.newTabSpec("ONE").setIndicator("ONE") .setContent(new Intent(this,OneActivity.class)));这句话的两处“ONE”有什么关系啊?
myHost.setCurrentTabByTag("ONE");这句话中的“ONE”又是什么?是标签名吗?
main.xml中的tag是这样设置的
第一个ONE: 是设置标签页的Id,相当于一个布局里面设置一个Id一样,方便监控这个Tab的事件(比如点击事件啊,TabHost操作这个Tab等)。
第二个ONE:其实就是设置这个Tab里面的内容,相当于标题(title),其实这个方法还是设置对应的图片,如
setIndicator("ONE",DrawableId);
楼主还问了一个 myHost.setCurrentTabByTag("ONE");这句话中的“ONE”又是什么?
这个“ONE” 其实就是你刚才在newTabSpec中设置进去的,TabHost可以直接通过这个相当于Id的"ONE"操作设置的Tab了,整句话的意思就是显示当前Id为“ONE”这项标签页的内容。追问
恩恩大概懂了,谢谢你啊
还有一个问题,就是在布局里面设置的tag跟id 又有什么关系呢,set……ByTag("XXX");到底是通过tag设置还是Id设置呢?
布局tag是不包含在R类里面的而是在对应的View里面,相当于一个同类对象的区分吧(可以这么理解,也可以解释为在操作相同类时,便于区分对象,例如有2个View 的对象,但是你不知道这个2个对象到底哪儿才是你想要的,你就可以用TAG来区分了(其实它有很多用处,一时也讲不完,记住Tag是一个Object,而Id是一个Int)),ID一般放在R类里面,便于索引,任何地方都可以找到它。(这些都是我自己的理解,望楼主观望对待)
set……ByTag("XXX");到底是通过tag设置还是Id设置呢?
Tag设置的,其实也可以认为是一种另类的Id,哈哈!
setIndicator中的只是标签显示的文本 参考技术B "ONE"不是标签名,只是标签上显示的文本
Android乐学成语之TabHost介绍及使用Fragment 替换 TabActivity
TabHost介绍
TabHost组件可以在界面中存放多个选项卡, 很多软件都使用了改组件进行设计;
1. TabHost常用组件
TabWidget : 该组件就是TabHost标签页中上部 或者 下部的按钮, 可以点击按钮切换选项卡;
TabSpec : 代表了选项卡界面, 添加一个TabSpec即可添加到TabHost中;
-- 创建选项卡 : newTabSpec(String tag), 创建一个选项卡;
-- 添加选项卡 : addTab(tabSpec);
TabHost的使用请看http://blog.csdn.net/harvic880925/article/details/17120325/
自Android3.2之后,TabActibvity被弃用(Deprecated),取而代之的是FragmentActivity,因为 Fragment比Activiy更灵活,消耗的资源更小,完全能够满足TabActivity的效果,所以直接替代之。原来的 TabActibvity+TabHost+Activity那套还可以用,不过强烈建议改用 FragmentActivity+FragmentTabHost+Fragement
FragmentTabHost用法:
1. 定义FragmentActivity的layout:
[html] view plaincopy
- <? xml version = "1.0" encoding = "utf-8" ?>
- < LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"
- android:layout_width = "fill_parent"
- android:layout_height = "fill_parent"
- android:orientation = "vertical" >
- < FrameLayout
- android:id = "@+id/realtabcontent"
- android:layout_width = "fill_parent"
- android:layout_height = "0dip"
- android:layout_weight = "1" />
- < android.support.v4.app.FragmentTabHost
- android:id = "@android:id/tabhost"
- android:layout_width = "fill_parent"
- android:layout_height = "wrap_content"
- android:background = "@drawable/maintab_toolbar_bg" >
- < FrameLayout
- android:id = "@android:id/tabcontent"
- android:layout_width = "0dp"
- android:layout_height = "0dp"
- android:layout_weight = "0" />
- </ android.support.v4.app.FragmentTabHost >
- </ LinearLayout >
2. 必须继承FragmentActivity
[java] view plaincopy
- public class MainTabActivity extends FragmentActivity{
- //定义FragmentTabHost对象
- private FragmentTabHost mTabHost;
3. 得到FragmentTabHost对象
[java] view plaincopy
- mTabHost = (FragmentTabHost)findViewById(android.R.id.tabhost);
4. 初始化FragmentTabHost对象
[java] view plaincopy
- mTabHost.setup( this , getSupportFragmentManager(), R.id.realtabcontent);
注意,这里的R.id.realtabcontent可以是任一个ViewGroup或其子类的对象id,比如LinearLayout。其实际作用就是个容器,Tab切换时,当前Tab对应的Fragment会被加入到这个ViewGroup作为其子View
5.按顺序添加每个Tab页
[java] view plaincopy
- //为每一个Tab按钮设置图标、文字和内容
- TabSpec tabSpec = mTabHost.newTabSpec( "TAG1" ).setIndicator(yourTabItemView);
- //将Tab按钮添加进Tab选项卡中
- mTabHost.addTab(tabSpec, fragmentPage1. class , null );
- //设置Tab按钮的背景
- mTabHost.getTabWidget().getChildAt(i).setBackgroundResource(R.drawable.selector_tab_background);
注意,mTabHost.newTabSpec("TAG1").setIndicator(yourTabItemview);这里的"TAG1"其实没什么什么意思,区分一下每个tab就好。
重点在于setIndicator函数,其有三个不同的实现,也就是说,你可以使用三种方式来定义你的Tab的风格:
[java] view plaincopy
- //只使用要文字标识tab
- TabHost.TabSpec.setIndicator(CharSequence label)
- //使用文字+icon标识tab
- TabHost.TabSpec.setIndicator(CharSequence label, Drawable icon)
- //使用自定义的View表示tab
- TabHost.TabSpec.setIndicator(View view)
前面两种tab风格,是我们在绝大多数tabhost的范例中看到的风格(Holo风格),也就是当前选择的tab下面会有类似于滚动条的一个 高亮显示的一个线条(indicator),很多时候我们不需要它,比如微信风格的Tab。这时候你就可以使用第三种方式来自定义你的Tab风格,你可以 实现任何样式的Tab:
[java] view plaincopy
- View yourTabItemView = layoutInflater.inflate(R.layout.tab_item_view, null );
- ImageView imageView = (ImageView) view.findViewById(R.id.imageview);
- imageView.setImageResource(mImageViewArray[index]);
- TextView textView = (TextView) view.findViewById(R.id.textview);
- textView.setText(mTextviewArray[index]);
另外,fragmentPage1.class是一个继承自Fragment的类,在切换Tab时,会被动态实例化,并且add到R.id.realtabcontent这个内容容器中显示
完成上面几点,一个简单的FragementActivity+FragmentTabHost+Fragment效果就出来了,接下来讲如何调整Tab停靠在顶部还是底部。
当R.id.realtabcontent与R.id.tabhost不在一个布局文件时,默认Tab在上TabContent在下,不能调整TabContent与Tab。
当R.id.realtabcontent与R.id.tabhost在一个布局文件时,如果R.id.realtabcontent在 R.id.tabhost上面,那么Tab将会在TabContent下面,也就是说R.id.realtabcontent与R.id.tabhost 的相对位置决定了选页在上还是在下。
不要在布局文件中给FragmentTabHost 设置子View,否则子View将显示在以Tab左上角为坐标0点的View中。给R.id.realtabcontent设置 android:layout_weight="1",因为默认时Tabcontent高度是wrap_content并且不能被调整,当Tab在 Tabcontent下面并且显示的View不足把Tab挤到底部时,Tab会挂在显示的View的末尾,设置后Tabcontent就会被填充满了。
以上是关于android 开发,TabHost 做标签页 ,求大神指教的主要内容,如果未能解决你的问题,请参考以下文章
带有 Fragments 和 FragmentActivity 的 TabHost
Android 片段,在 TabHost 中找不到 id 的视图
Android乐学成语之TabHost介绍及使用Fragment 替换 TabActivity