tabHost 使用方法

article/2025/9/9 15:07:17

  近日 学习TabHost的使用  再网上搜不少文章  觉得这篇写的挺好  !

 

 

   出处  :http://www.blogjava.net/freeman1984/archive/2010/10/29/302803.html

 

 

Android 自带拨号器的界面

 

 

查看tabhost的源代码,主要实例变量有:

private  TabWidget mTabWidget;
    
private  FrameLayout mTabContent;
    
private  List < TabSpec >  mTabSpecs

 

也就是说我们的tabhost必须有这三个东西,所以我们的.xml文件就会有规定:继续查看源代码:

if  (mTabWidget  ==   null {
            
throw   new  RuntimeException(
                    
" Your TabHost must have a TabWidget whose id attribute is 'android.R.id.tabs' " );
        }




 mTabContent 
=  (FrameLayout) findViewById(com.android.internal.R.id.tabcontent);
        
if  (mTabContent  ==   null {
            
throw   new  RuntimeException(
                    
" Your TabHost must have a FrameLayout whose id attribute is 'android.R.id.tabcontent' " );
        }

     也就是说我们的.xml文件需要TabWidgetFrameLayout 标签。

接下来构建我们自己的tab实例:

      有两种方式可以实现:
      一种是继承TabActivity 类,可以使用android的自己内部定义好的.xml资源文件作容器文件。也就是在我们的代码中使用getTabHost(); , 而相应的后台源码是这样的:

this .setContentView(com.android.internal.R.layout.tab_content);

       在系统的资源文件中可以看见这个layout


      有了容器,然后我们就需要我们为每个tab分配内容,当然要可以是如何类型的标签:
      例如我们构建一下.xml文件
  首先tab1.xml 是一个LinearLayout 布局

<? xml version = " 1.0 "  encoding = " utf-8 " ?>

< LinearLayout xmlns:android = " http://schemas.android.com/apk/res/android "
    android:id
= " @+id/LinearLayout01 "  android:layout_width = " wrap_content "
    android:layout_height
= " wrap_content " >
    
< TextView android:text = " tab1 with linear layout "
        android:id
= " @+id/TextView01 "  android:layout_width = " wrap_content "
        android:layout_height
= " wrap_content " >
    
</ TextView >
</ LinearLayout >


 
然后是tab2.xml是一个FrameLayout 布局

<? xml version = " 1.0 "  encoding = " utf-8 " ?>
    
< FrameLayout  xmlns:android = " http://schemas.android.com/apk/res/android "
    
    android:id
= " @+id/FrameLayout02 "
        android:layout_width
= " wrap_content "
        android:layout_height
= " wrap_content " >
        
< LinearLayout android:id = " @+id/LinearLayout02 "
            android:layout_width
= " wrap_content "
            android:layout_height
= " wrap_content " >
            
< TextView android:text = " tab2 "
                android:id
= " @+id/TextView01 "  android:layout_width = " wrap_content "
                android:layout_height
= " wrap_content " >
            
</ TextView >
        
</ LinearLayout >
        
    
</ FrameLayout >

接着要注册这两个FrameLayout为tabhost的Content,也就是接下来的代码:

LayoutInflater inflater_tab1  =  LayoutInflater.from( this );   
        inflater_tab1.inflate(R.layout.tab1, mTabHost.getTabContentView());  
        inflater_tab1.inflate(R.layout.tab2, mTabHost.getTabContentView()); 

 
然后需要构建前面说的tabhost的第三个实例变量对应得内容,源代码中是这样的:

private  List < TabSpec >  mTabSpecs  =   new  ArrayList < TabSpec > ( 2 );

 初始化是两个tab的空间然后会自动扩展:
好 我们构建我们的tabspec:
 

mTabHost.addTab(mTabHost.newTabSpec( " tab_test1 " ).setIndicator( " TAB 11 " ).setContent(R.id.LinearLayout01));  
        mTabHost.addTab(mTabHost.newTabSpec(
" tab_test1 " ).setIndicator( " TAB 11 " ).setContent(R.id.FrameLayout02));    


也就是把我们的2个layout作为他的content,当然FrameLayout 中可以有其他的布局,来放我的组件。
我们不需要在代码里面设置setContentView();因为getTabHost(); 这个方法调用后就已经设置了,源代码:
  

if  (mTabHost  ==   null {
            
this .setContentView(com.android.internal.R.layout.tab_content);
        }

也就是把系统的tab_content当做view设置。
运行后如下:

 

完整代码:

 TabHost mTabHost  =  getTabHost();
        LayoutInflater inflater_tab1 
=  LayoutInflater.from( this );   
        inflater_tab1.inflate(R.layout.tab1, mTabHost.getTabContentView());  
        inflater_tab1.inflate(R.layout.tab2, mTabHost.getTabContentView());   
        mTabHost.addTab(mTabHost.newTabSpec(
" tab_test1 " ).setIndicator( " TAB 11 " ).setContent(R.id.LinearLayout01));  
        mTabHost.addTab(mTabHost.newTabSpec(
" tab_test1 " ).setIndicator( " TAB 11 " ).setContent(R.id.FrameLayout02)); 




 还有一种就是定义我们自己的tabhost:不用继承TabActivity

 首先建立我们自己的.xml文件,当然要包含Tabhost,TabWidget ,FrameLayout,着3个标签:

<? xml version = " 1.0 "  encoding = " utf-8 " ?>   
< TabHost xmlns:android = " http://schemas.android.com/apk/res/android "   
    android:id
= " @+id/tabhost "   
    android:layout_width
= " fill_parent "   
    android:layout_height
= " fill_parent " >   
    
< LinearLayout  
        android:orientation
= " vertical "   
        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 "   />   
        
< FrameLayout  
            android:id
= " @android:id/tabcontent "   
            android:layout_width
= " fill_parent "   
            android:layout_height
= " fill_parent " >   
             
        
</ FrameLayout >   
    
</ LinearLayout >   
</ TabHost >   

     注意的是:除了tabhost的id可以自定义外,其他的必须使用系统的id,为什么后面说,
       当然我们可以在FrameLayout 里面添加view来作为tab的内容只需要在create tabspce时候添加就可以了,我们为了把每个tab的内容分开我们依然使用前面用到的两个tab xml文件
 java代码:
      获取TabHost 通过findviewbyid,

setContentView(R.layout.main);   
        TabHost mTabHost 
=  (TabHost)findViewById(R.id.tabhost);

    接下来很重要的一步是要使用TabHost.setup();
     作用是来初始化我们的TabHost容器:
    源代码是这样说的:

< p > Call setup() before adding tabs  if  loading TabHost using findViewById().  < i >< b > However </ i ></ b > : You  do
      
*  not need to call setup() after getTabHost() in  {@link android.app.TabActivity TabActivity} .

  也就是说通过findviewbyid,方法获得tabhost必须setup 而通过getTabHost则不用。
  setup干什么呢:源代码

mTabWidget  =  (TabWidget) findViewById(com.android.internal.R.id.tabs);
        
if  (mTabWidget  ==   null {
            
throw   new  RuntimeException(
                    
" Your TabHost must have a TabWidget whose id attribute is 'android.R.id.tabs' " );
        }


mTabContent 
=  (FrameLayout) findViewById(com.android.internal.R.id.tabcontent);
        
if  (mTabContent  ==   null {
            
throw   new  RuntimeException(
                    
" Your TabHost must have a FrameLayout whose id attribute is 'android.R.id.tabcontent' " );
        }

   他主要是初始化了tabhost的两个实例变量,这里也回答了为什么我们的id必须使用系统定义的id的原因
  接下来工作就和前面相同了:

LayoutInflater inflater_tab1  =  LayoutInflater.from( this );   
        inflater_tab1.inflate(R.layout.tab1, mTabHost.getTabContentView());  
        inflater_tab1.inflate(R.layout.tab2, mTabHost.getTabContentView());
        mTabHost.addTab(mTabHost.newTabSpec(
" tab_test1 " ).setIndicator( " TAB a " ).setContent(R.id.LinearLayout01));   
        mTabHost.addTab(mTabHost.newTabSpec(
" tab_test2 " ).setIndicator( " TAB b " ).setContent(R.id.FrameLayout02)); 


 完整代码:

setContentView(R.layout.main);   
        TabHost mTabHost 
=  (TabHost)findViewById(R.id.tabhost); 
        mTabHost.setup();
        LayoutInflater inflater_tab1 
=  LayoutInflater.from( this );   
        inflater_tab1.inflate(R.layout.tab1, mTabHost.getTabContentView());  
        inflater_tab1.inflate(R.layout.tab2, mTabHost.getTabContentView());
        mTabHost.addTab(mTabHost.newTabSpec(
" tab_test1 " ).setIndicator( " TAB a " ).setContent(R.id.LinearLayout01));   
        mTabHost.addTab(mTabHost.newTabSpec(
" tab_test2 " ).setIndicator( " TAB b " ).setContent(R.id.FrameLayout02));  


  运行结果同上。 如有问题欢迎提出。

    转载请说明出处。。。


加上源代码,有用了可以下载下:/Files/freeman1984/atab.rar

 

 

 


http://chatgpt.dhexx.cn/article/6DjGBVHs.shtml

相关文章

android Tabhost控件的使用

Tabhost用来实现如图的效果&#xff1a; 上图的首页、自选、警报是由Tabhost控件来实现的&#xff0c;Tabhost控件中的每个tab其实都是一个Activity&#xff0c;也就是说我创建一个Tabhost&#xff0c;在tabhost中添加tab页就可以实现。 实现方式&#xff1a;1、创建布局文件 …

TabHost详解0

一、TabHost是一个选项卡容器&#xff0c;通过标签页将多个Activity整合到一起。 TabHost的三要素为&#xff1a;TabWidget、FrameLayout、List<TabSpec>。 其主要的使用方式有两种&#xff1a; 1.继承TabActivity&#xff0c;结合对应的xml配置文件导入tab选项内容体 …

TabHost

TabHost的实现有两种方式&#xff0c;第一种继承TabActivity&#xff0c;从TabActivity中用getTabHost()方法获取TabHost。各个Tab中的内容在布局文件中定义就行了。 mainActivity.xml private TabHost myTabHost;Overridepublic void onCreate(Bundle savedInstanceState) {su…

Android初级控件TabHost

TabHost我们都知道是用来实现导航栏布局来切换页面的&#xff0c;这个也是元老级的控件了&#xff0c;现在逐渐被TabLayout,BottomNavigationBar,使用RadioButton自定义。。。等等给取代了。TabHost有个好处就是它添加的是Activity而不像上面那些全部使用Fragment来显示内容。 …

Android中TabHost嵌套TabHost

在嵌套TabHost时&#xff0c;先后遇到了以下情况&#xff1a; 问题1&#xff1a;内部TabHos无显示&#xff0c;只显示了其中的一个Activity&#xff1b; 解决&#xff1a;按下文比对主子TabHos的布局文件和java文件并修改&#xff1b; 问题2&#xff1a;如上所做后&#xff…

Android的Tab与TabHost讲解

在Android应用中&#xff0c;经常会用到TabHost选项卡,可以方便地在不同页面间切换。之前看过网上的一些教程&#xff0c;但大多都是一个形式&#xff0c;看得迷迷糊糊&#xff0c;不能让人很好的理解和学习。所以&#xff0c;在此详细地列出了Tab与TabHost的使用方法&#xff…

Android - TabHost 选项卡功能用法详解

一、实例 二.、TabHost介绍 TabHost组件可以在界面中存放多个选项卡, 很多软件都使用了改组件进行设计; 1. TabHost常用组件 TabWidget : 该组件就是TabHost标签页中上部 或者 下部的按钮, 可以点击按钮切换选项卡; TabSpec : 代表了选项卡界面, 添加一个TabSpec即可添加到TabH…

【转】TabHost详解

请大家尊重作者版权&#xff0c;转载请标明出处&#xff1a;http://blog.csdn.net/harvic880925/article/details/17120325 前言&#xff1a;今天仔细研究了下TabHost&#xff0c;主要是为了实现微信底部导航栏的功能&#xff0c;最后也给出一个链接&#xff0c;这位老兄用TabH…

Android入门第十一篇之TabHost,TabWidget

本文来自http://blog.csdn.net/hellogv/ &#xff0c;引用必须注明出处&#xff01; 这回要介绍的是Android的Tab控件&#xff0c;Tab控件可以达到分页的效果&#xff0c;让一个屏幕的内容尽量丰富&#xff0c;当然也会增加开发的复杂程度&#xff0c;在有必要的时候再使用。An…

android Tabhost部件

本文结合源代码和实例来说明TabHost的用法。 使用TabHost 可以在一个屏幕间进行不同版面的切换&#xff0c;例如android自带的拨号应用&#xff0c;截图&#xff1a; 查看tabhost的源代码&#xff0c;主要实例变量有&#xff1a; private TabWidget mTabWidget; …

TabHost的用法

http://blog.csdn.net/lastsweetop/article/details/5566200 本文结合源代码和实例来说明TabHost的用法。 使用TabHost 可以在一个屏幕间进行不同版面的切换&#xff0c;例如android自带的拨号应用&#xff0c;截图&#xff1a; 查看tabhost的源代码&#xff0…

ViewPager和Tabhost结合,可滑动的tabhost

有朋友反映资源下载下来有问题&#xff0c;我看了下&#xff0c;确实是&#xff0c;已更新下面文章中的代码和资源&#xff0c;现在可以好好的跑起来了&#xff0c;另外还改动了个小地方的逻辑&#xff0c;因为我在使用中出了点小错&#xff0c;需要的可以试下。另外&#xff0…

TabSpec和TabHost实例

TabSpec与TabHost TabHost相当于浏览器中浏览器分布的集合&#xff0c;而Tabspec则相当于浏览器中的每一个分页面。d在Android中&#xff0c;每一个TabSpec分布可以是一个组件&#xff0c;也可以是一个布局&#xff0c;然后将每一个分页装入TabHost中&#xff0c;TabHost即可将…

Android中的TabHost

介绍 有时&#xff0c;我们想在一个window中显示多个视图&#xff0c;这时就需要用到Tab容器。在Android里它叫TabHost。 使用TabHost有两种方式&#xff1a; 在相同的activity中使用TabHost导航多个视图使用TabHost导航多个Activity(通过intents) Tab应用的结构 TabHost的A…

Android修行手册 - TabHost回忆

往期文章分享 点击跳转>《导航贴》- Unity手册&#xff0c;系统实战学习点击跳转>《导航贴》- Android手册&#xff0c;重温移动开发 &#x1f449;关于作者 众所周知&#xff0c;人生是一个漫长的流程&#xff0c;不断克服困难&#xff0c;不断反思前进的过程。在这个过…

Android TabHost的使用

1. 最简单的TabHost&#xff0c;Tab来自于layout下的元素 &#xff08;只从1个Layout中取数据&#xff09; &#xff08;1&#xff09;效果图 &#xff08;2&#xff09;代码 1&#xff09;tab_demo.xml <?xml version"1.0" encoding"utf-8"?&g…

TabHost详解

前言&#xff1a;今天仔细研究了下TabHost&#xff0c;主要是为了实现微信底部导航栏的功能&#xff0c;最后也给出一个链接&#xff0c;这位老兄用TabHost基本做出来了微信导航栏。 正文 TabHost的实现分为两种&#xff0c;一个是不继承TabActivity&#xff0c;一个是继承自…

Android选项卡TabHost功能和用法

1、选项卡TabHost介绍 TabHost可以方便地在窗口上放置多个标签页&#xff0c;每个标签页相当于获得了一个与外部容器大小相同的组件摆放区域 TabHost是一个简单的容器&#xff0c;提供如下两种方法来创建选项卡 newTabSpec(String tag):创建选项卡 addTab(TabHost.TabSpec tabS…

[Android] 选项卡组件TabHost

Tab选项卡实现多个分页之间的快速切换&#xff0c;每个分页可以显示不同的内容&#xff0c;在Android平台提供了TabHost组件实现Tab选项卡的功能&#xff0c;选项卡组件的主要功能是可以进行应用程序分类管理。 每个选项卡称为一个Tab&#xff0c;而包含这多个选项卡的容器称为…

交叉熵:计算交叉熵损失函数nn.CrossEntropyLoss()

首先要提出的问题是。。。什么是损失函数&#xff1f;干什么的&#xff08;功能&#xff09;&#xff1f;类型有哪些&#xff1f; 1.什么是损失函数&#xff1f; 损失函数&#xff08;loss function&#xff09;或 代价函数&#xff08;cost function&#xff09;是将随机事件或…