Android Tab标签的使用基础

作者:圣骑士Wind 时间:2023-11-21 18:10:03 

Android程序中,Tab标签窗口是一种常用的UI界面元素。它的实现主要是利用了TabHost类。

TabHost说明

TabHost是一个标签窗口的容器。

一个TabHost对象包含两个子元素对象:

一个对象是tab标签集合(TabWidget),用户点击它们来选择一个特定的标签;

另一个是FrameLayout对象,展示当前页的内容。 

子元素通常是通过容器对象来控制,而不是直接设置子元素的值。

下面结合ApiDemos中的例子来说明TabHost的用法。 

第一个Tab例子:使用TabActivity

这个例子使用了 TabActivity。

Java程序代码:


package com.meng.hellotab;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.widget.TabHost;
import android.app.TabActivity;

@SuppressWarnings("deprecation")
public class HelloTabActivity extends TabActivity
{

@Override
 protected void onCreate(Bundle savedInstanceState)
 {
   super.onCreate(savedInstanceState);

// 得到TabActivity中的TabHost对象
   TabHost tabHost = getTabHost();

// 内容:采用布局文件中的布局
   LayoutInflater.from(this).inflate(R.layout.activity_hello_tab,
       tabHost.getTabContentView(), true);

// 加上标签
   // 参数设置:新增的TabSpec的标签,标签中显示的字样
   // setContent设置内容对应的View资源标号
   tabHost.addTab(tabHost.newTabSpec("tab1")
       .setIndicator("tab1 indicator").setContent(R.id.view1));
   tabHost.addTab(tabHost.newTabSpec("tab3").setIndicator("tab2")
       .setContent(R.id.view2));
   tabHost.addTab(tabHost.newTabSpec("tab3").setIndicator("tab3")
       .setContent(R.id.view3));
 }

}

其中布局文件如下:

布局文件1


布局文件1

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent" >

<TextView
   android:id="@+id/view1"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:background="@drawable/blue"
   android:text="@string/tab1" />

<TextView
   android:id="@+id/view2"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:background="@drawable/red"

android:text="@string/tab2" />

<TextView
   android:id="@+id/view3"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:background="@drawable/green"
   android:text="@string/tab3" />

</FrameLayout>

布局文件中的颜色字符串如下:文本字符串略。


colors.xml

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

<drawable name="red">#7f00</drawable>
 <drawable name="blue">#770000ff</drawable>
 <drawable name="green">#7700ff00</drawable>
 <drawable name="yellow">#77ffff00</drawable>
 <drawable name="screen_background_black">#ff000000</drawable>
 <drawable name="translucent_background">#e0000000</drawable>
 <drawable name="transparent_background">#00000000</drawable>

<color name="solid_red">#f00</color>
 <color name="solid_blue">#0000ff</color>
 <color name="solid_green">#f0f0</color>
 <color name="solid_yellow">#ffffff00</color>

</resources>

运行截图:

Android Tab标签的使用基础

Android Tab标签的使用基础

Android Tab标签的使用基础

注意 TabActivity这个类已经被标注为:This class was deprecated in API level 13。

第二个程序:使用TabHost.TabContentFactory

TabHost.TabContentFactory这个接口是用来在tab被选择时自己创建内容,而不是显示一个已经存在的view或者启动一个activity,这两种要用其他的方法。

具体实现见代码:


package com.meng.hellotab;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.TabHost;
import android.widget.TextView;
import android.app.TabActivity;

@SuppressWarnings("deprecation")
public class HelloTabActivity extends TabActivity implements
   TabHost.TabContentFactory
{

@Override
 protected void onCreate(Bundle savedInstanceState)
 {
   super.onCreate(savedInstanceState);

TabHost tabHost = getTabHost();

// 不再需要载入布局文件,如果此句不注释掉会导致content的重叠
   // LayoutInflater.from(this).inflate(R.layout.activity_hello_tab,
   // tabHost.getTabContentView(), true);

// setContent中传递this
   tabHost.addTab(tabHost.newTabSpec("tab1")
       .setIndicator("tab1 indicator").setContent(this));
   tabHost.addTab(tabHost.newTabSpec("tab3").setIndicator("tab2")
       .setContent(this));
   tabHost.addTab(tabHost.newTabSpec("tab3").setIndicator("tab3")
       .setContent(this));
 }

// setContent的参数设为this时,从这个方法得到每一个Tab的内容(此次不用布局文件,用的话会重叠)
 @Override
 public View createTabContent(String tag)
 {
   // 参数: 这个方法会接受到被选择的tag的标签

final TextView tv = new TextView(this);
   tv.setText("Content for tab with tag " + tag);
   return tv;
 }

}

程序运行截图:

Android Tab标签的使用基础

另外,Tab的content的内容还可以启动另一个Activity,只要在setContent方法中传入一个Intent即可。

此部分不再介绍,可以参见ApiDemos中的Tabs3.java代码。 

第三个程序:不继承TabActivity

前面两个程序例子中都是继承了TabActivity类,如果不继承它,需要自己写TabHost的布局,其中包含了两个必要的子元素:TabWidget和FrameLayout,其id都是固定值,见代码。

布局文件代码:


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="vertical" >

<TextView
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:text="@string/hello_world" />

<!-- TabHost必须包含一个 TabWidget和一个FrameLayout -->

<TabHost
   android:id="@+id/myTabHost"
   android:layout_width="match_parent"
   android:layout_height="match_parent" >

<LinearLayout
     android:layout_width="fill_parent"
     android:layout_height="fill_parent"
     android:orientation="vertical" >

<!-- TabWidget的id属性必须为 @android:id/tabs -->

<TabWidget
       android:id="@android:id/tabs"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:layout_weight="0"
       android:orientation="horizontal" />

<!-- FrameLayout的id属性必须为 @android:id/tabcontent -->

<FrameLayout
       android:id="@android:id/tabcontent"
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       android:layout_weight="0" >

<TextView
         android:id="@+id/view1"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:text="Tab1 Content" />

<TextView
         android:id="@+id/view2"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:text="Tab2 Content" />

<TextView
         android:id="@+id/view3"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:text="Tab3 Content" />
     </FrameLayout>
   </LinearLayout>
 </TabHost>

</LinearLayout>

Activity代码:


package com.meng.hellotabhost;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.TabHost;

public class HelloTabHostActivity extends Activity
{

@Override
 protected void onCreate(Bundle savedInstanceState)
 {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.activity_hello_tab_host);

TabHost tabHost = (TabHost) findViewById(R.id.myTabHost);

// 如果不是继承TabActivity,则必须在得到tabHost之后,添加标签之前调用tabHost.setup()
   tabHost.setup();

// 这里content的设置采用了布局文件中的view
   tabHost.addTab(tabHost.newTabSpec("tab1")
       .setIndicator("tab1 indicator").setContent(R.id.view1));
   tabHost.addTab(tabHost.newTabSpec("tab3").setIndicator("tab2")
       .setContent(R.id.view2));
   tabHost.addTab(tabHost.newTabSpec("tab3").setIndicator("tab3")
       .setContent(R.id.view3));
 }

}

这种方式可以实现比较灵活的布局,可以方便地加入其他组件,还可以改变标签栏和内容栏的相对位置。

第四个程序:scrolling Tab

当标签太多时,需要把标签设置进一个ScrollView中进行滚动。有了上面的程序做基础,这个很好理解。

ApiDemos中给出的仍然是继承TabActivity的方法,在这里给出另一种不用继承TabActivity的方法,两种方法很类似。

布局文件:


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="vertical" >

<TabHost
   android:id="@+id/myTabHost"
   android:layout_width="match_parent"
   android:layout_height="match_parent" >

<LinearLayout
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:orientation="vertical"
     android:padding="5dp" >

<HorizontalScrollView
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:scrollbars="none" >

<TabWidget

android:id="@android:id/tabs"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content" />
     </HorizontalScrollView>

<FrameLayout
       android:id="@android:id/tabcontent"
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       android:padding="5dp" />
   </LinearLayout>
 </TabHost>

</LinearLayout>

Java代码:


package com.meng.hellotabscroll;

import android.os.Bundle;
import android.app.Activity;
import android.view.View;
import android.widget.TabHost;
import android.widget.TextView;

public class HelloTabScrollActivity extends Activity implements
   TabHost.TabContentFactory
{

@Override
 protected void onCreate(Bundle savedInstanceState)
 {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.activity_hello_tab_scroll);

// 从布局中获取TabHost并建立
   TabHost tabHost = (TabHost) findViewById(R.id.myTabHost);
   tabHost.setup();

// 加上30个标签
   for (int i = 1; i <= 30; i++)
   {
     String name = "Tab " + i;
     tabHost.addTab(tabHost.newTabSpec(name).setIndicator(name)
         .setContent(this));
   }

}

@Override
 public View createTabContent(String tag)
 {
   final TextView tv = new TextView(this);
   tv.setText("Content for tab with tag " + tag);
   return tv;
 }

}

来源:http://www.cnblogs.com/mengdd/archive/2013/05/08/3065156.html

标签:android,tab
0
投稿

猜你喜欢

  • Android EditText限制输入字符类型的方法总结

    2023-10-11 15:48:19
  • Spring MVC请求参数与响应结果全局加密和解密详解

    2023-02-16 07:04:32
  • SpringBoot里使用Servlet进行请求的实现示例

    2021-09-17 11:47:37
  • 浅谈Synchronized和Lock的区别

    2023-10-26 04:28:33
  • 一文详解Object类和抽象类

    2023-06-09 16:27:14
  • 探究实现Aware接口的原理及使用

    2022-10-14 14:29:39
  • SpringBoot 利用thymeleaf自定义错误页面

    2023-11-29 08:29:55
  • 关于C#理解装箱与拆箱

    2023-06-18 21:07:50
  • Android BottomNavigationView结合ViewPager实现底部导航栏步骤详解

    2021-09-01 00:42:38
  • Android实现信息弹出框

    2023-04-20 06:27:40
  • Android应用中使用Fragment组件的一些问题及解决方案总结

    2022-09-12 09:22:27
  • 带你了解Java的类和对象

    2022-05-08 09:10:21
  • C#中string.format用法详解

    2023-07-12 21:25:48
  • C#实现截取验证码图片

    2023-08-04 04:22:56
  • Java通过JavaMail发送邮件功能

    2022-09-07 16:47:20
  • Java编程实现向文本文件中读取数据之Scanner用法示例

    2022-08-01 03:38:57
  • java实现转圈打印矩阵算法

    2022-11-27 06:38:21
  • C# 使用鼠标点击对Chart控件实现数据提示效果

    2023-03-05 14:20:06
  • Mybatis 入参类型方式全面详解

    2023-10-16 20:03:40
  • 基于Spring Mvc实现的Excel文件上传下载示例

    2022-01-22 02:02:56
  • asp之家 软件编程 m.aspxhome.com