详解Android TabHost的多种实现方法 附源码下载

最近仔细研究了下TabHost,主要是为了实现微信底部导航栏的功能,最后也给出一个文章链接,大家不要着急

正文:

TabHost的实现分为两种,一个是不继承TabActivity,一个是继承自TabActivity;当然了选用继承自TabActivity的话就相对容易一些,下面来看看分别是怎样来实现的吧。

方法一、定义tabhost:不用继承TabActivity
 1、布局文件:activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="vertical"
 tools:context=".MainActivity" >
 <Button
 android:id="@+id/button1"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:text="Button" />
 <TabHost
 android:id="@+id/tabhost"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"> 

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

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

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

  <!-- 第一个tab的布局 -->
  <LinearLayout
   android:id="@+id/tab1"
   android:layout_width="match_parent"
   android:layout_height="match_parent" > 

   <TextView
   android:id="@+id/textView1"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:text="林炳东" /> 

  </LinearLayout> 

  <!-- 第二个tab的布局 -->
  <LinearLayout
   android:id="@+id/tab2"
   android:layout_width="match_parent"
   android:layout_height="match_parent" > 

   <TextView
   android:id="@+id/textView2"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:text="张小媛" /> 

  </LinearLayout> 

  <!-- 第三个tab的布局 -->
  <LinearLayout
   android:id="@+id/tab3"
   android:layout_width="match_parent"
   android:layout_height="match_parent" > 

   <TextView
   android:id="@+id/textView3"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:text="马贝贝" /> 

  </LinearLayout>
  </FrameLayout>
 </LinearLayout>
 </TabHost> 

</LinearLayout>

2、JAVA代码

public class MainActivity extends Activity { 

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

 TabHost th=(TabHost)findViewById(R.id.tabhost);
 th.setup();  //初始化TabHost容器 

 //在TabHost创建标签,然后设置:标题/图标/标签页布局
 th.addTab(th.newTabSpec("tab1").setIndicator("标签1",getResources().getDrawable(R.drawable.ic_launcher)).setContent(R.id.tab1));
 th.addTab(th.newTabSpec("tab2").setIndicator("标签2",null).setContent(R.id.tab2));
 th.addTab(th.newTabSpec("tab3").setIndicator("标签3",null).setContent(R.id.tab3)); 

 //上面的null可以为getResources().getDrawable(R.drawable.图片名)设置图标 

 }
}

效果图:

此例源码地址:Demo1

方法二、Tab的内容分开:不用继承TabActivity
1、第一个tab的XML布局文件,tab1.xml:

<?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="我是标签1的内容喔"
  android:id="@+id/TextView01"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content">
 </TextView>
 </LinearLayout>

2、第二个tab的XML布局文件,tab2.xml:

<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:id="@+id/LinearLayout02"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"> 

 <TextView android:text="标签2"
   android:id="@+id/TextView01"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content" />
</LinearLayout>

3、主布局文件,activity_main.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
 android:orientation="vertical" > 

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

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

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

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

  </FrameLayout>
 </LinearLayout>
 </TabHost> 

</LinearLayout>

4、JAVA代码:

public class MainActivity extends Activity { 

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

 TabHost m = (TabHost)findViewById(R.id.tabhost);
 m.setup(); 

 LayoutInflater i=LayoutInflater.from(this);
 i.inflate(R.layout.tab1, m.getTabContentView());
 i.inflate(R.layout.tab2, m.getTabContentView());//动态载入XML,而不需要Activity 

 m.addTab(m.newTabSpec("tab1").setIndicator("标签1").setContent(R.id.LinearLayout01));
  m.addTab(m.newTabSpec("tab2").setIndicator("标签2").setContent(R.id.LinearLayout02)); 

 }
}

效果图:


此例源码地址:Demo2

方法三、继承自TabActivity
1、主布局文件,activity_main.xml:

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

 <!-- 第一个布局 -->
 <LinearLayout
 android:id="@+id/view1"
 android:layout_width="match_parent"
 android:layout_height="match_parent" >
 <TextView
  android:id="@+id/textView1"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="张小媛" />
 </LinearLayout> 

 <!-- 第二个布局 -->
 <LinearLayout
 android:id="@+id/view2"
 android:layout_width="match_parent"
 android:layout_height="match_parent" > 

 <TextView
  android:id="@+id/textView2"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="马贝贝" />
 </LinearLayout> 

 <!-- 第三个布局 -->
 <TextView android:id="@+id/view3"
 android:background="#00ff00"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
 android:text="Tab3"/> 

</FrameLayout>

2、JAVA代码:
先将派生自Activity改为TabActivity,然后代码如下:

public class MainActivity extends TabActivity { 

 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setTitle("TabDemoActivity");
 TabHost tabHost = getTabHost();
 LayoutInflater.from(this).inflate(R.layout.activity_main,
  tabHost.getTabContentView(), true);
 tabHost.addTab(tabHost.newTabSpec("tab1").setIndicator("tab1", getResources().getDrawable(R.drawable.ic_launcher))
  .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)); 

  //标签切换事件处理,setOnTabChangedListener
 tabHost.setOnTabChangedListener(new OnTabChangeListener(){
  @Override
  public void onTabChanged(String tabId) {
  if (tabId.equals("tab1")) { //第一个标签
  }
  if (tabId.equals("tab2")) { //第二个标签
  }
  if (tabId.equals("tab3")) { //第三个标签
  }
  }
 }); 

 } 

}

效果图:

 

此例源码地址:Demo3

四、实现微信底部导航栏

效果:

 

参看:Android仿微信底部菜单栏功能显示未读消息数量

原文地址:http://blog.csdn.net/harvic880925/article/details/17120325

以上就是本文的全部内容,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Android实现中国象棋附源码下载

    象棋,很多人多接触过,学者写了一个,大神可以指点一下~直接上代码: 贴出主要代码,想要Demo的点击下载:中国象棋Demo package wyf.ytl; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; impor

  • Android内核源码 在Ubuntu上下载,编译,安装

    从源代码树下载下来的最新Android源代码,是不包括内核代码的,也就是Android源代码工程默认不包含Linux Kernel代码,而是使用预先编译好的内核,也就是prebuilt/android-arm/kernel/kernel-qemu文件.那么,如何才能DIY自己的内核呢?这篇文章一一道来. 一. 首选,参照前一篇在Android源码 在Ubuntu上下载,编译和安装准备好Android源代码目录.       二. 下载Linux Kernel for Android源代码. 1.

  • Android源码 在Ubuntu上下载,编译和安装

    看完了前面说的几本书之后,对Linux Kernel和Android有一定的认识了,是不是心里蠢蠢欲动,想小试牛刀自己编译一把Android源代码了呢?一直习惯使用Windows系统,而Android源代码是不支持在Windows上编译上,于是决定使用虚拟机安装Ubuntu,然后下载.编译和安装Android源代码.      一. 环境准备. 1. 磁盘空间预留20G左右,内存3G,因为一边要跑主机,一边要跑虚拟机,内存要求还是比较高的,这样才会比较流畅. 2. 安装VMWare 7.1.4.

  • 详解Android中用于线程处理的AsyncTask类的用法及源码

    为什么要用AsyncTask 我们写App都有一个原则,主线程不能够运行需要占用大量CPU时间片的任务,如大量复杂的浮点运算,较大的磁盘IO操作,网络socket等,这些都会导致我们的主线程对用户的响应变得迟钝,甚至ANR,这些会使应用的用户体验变差,但是有时又的确需要执行这些耗时的任务,那么我们通常可以使用AsyncTask或者new Thread 来处理,这样把任务放入工作线程中执行,不会占用主线程的时间片,所以主线程会及时响应用户的操作,如果使用new Thread来执行任务,那么如果需要

  • 从源码分析Android的Glide库的图片加载流程及特点

    0.基础知识 Glide中有一部分单词,我不知道用什么中文可以确切的表达出含义,用英文单词可能在行文中更加合适,还有一些词在Glide中有特别的含义,我理解的可能也不深入,这里先记录一下. (1)View: 一般情况下,指Android中的View及其子类控件(包括自定义的),尤其指ImageView.这些控件可在上面绘制Drawable (2)Target: Glide中重要的概念,目标.它即可以指封装了一个View的Target(ViewTarget),也可以不包含View(SimpleTa

  • Android编程实现可滑动的开关效果(附demo源码下载)

    本文实例讲述了Android编程实现可滑动的开关效果.分享给大家供大家参考,具体如下: 闲着没事,把之前写的一个Demo放上来分享下.就是一个开关,实现可滑动和动画效果.不是图片切换. 好了,先上图: 完整实例代码点击此处本站下载. 直接把自定义的这个View代码放上来,有注释应该很好理解: 首先是布局: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android=&qu

  • Android源码系列之深入理解ImageView的ScaleType属性

    做Android开发的童靴们肯定对系统自带的控件使用的都非常熟悉,比如Button.TextView.ImageView等.如果你问我具体使用,我会给说:拿ImageView来说吧,首先创建一个新的项目,在项目布局文件中应用ImageView控件,代码如下: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.

  • 单独编译Android 源代码中的模块实现方法

    第一次下载好Android源代码工程后,我们通常是在Android源代码工程目录下执行make命令,经过漫长的等待之后,就可以得到Android系统镜像system.img了.以后如果我们修改了Android源代码中的某个模块或者在Android源代码工程新增一个自己的模块,是不是还是执行make命令呢?答案是否定的,Google为我们准备了另外的命令来支持编译单独的模块,以及重新打包system.img的命令.在继续学习Android源代码之前,就让我们先来看看这个命令吧. 一. 首先在And

  • 详解Android TabHost的多种实现方法 附源码下载

    最近仔细研究了下TabHost,主要是为了实现微信底部导航栏的功能,最后也给出一个文章链接,大家不要着急 正文: TabHost的实现分为两种,一个是不继承TabActivity,一个是继承自TabActivity:当然了选用继承自TabActivity的话就相对容易一些,下面来看看分别是怎样来实现的吧. 方法一.定义tabhost:不用继承TabActivity  1.布局文件:activity_main.xml <LinearLayout xmlns:android="http://s

  • php+jQuery+Ajax实现点赞效果的方法(附源码下载)

    本文实例讲述了php+jQuery+Ajax实现点赞效果的方法.分享给大家供大家参考,具体如下: 数据库设计 先准备两张表,pic表保存的是图片信息,包括图片对应的名称.路径以及图片"赞"总数,pic_ip则记录用户点击赞后的IP数据. CREATE TABLE IF NOT EXISTS `pic` ( `id` int(11) NOT NULL AUTO_INCREMENT, `pic_name` varchar(60) NOT NULL, `pic_url` varchar(60

  • 详解 PHP加密解密字符串函数附源码下载

    项目中有时我们需要使用PHP将特定的信息进行加密,也就是通过加密算法生成一个加密字符串,这个加密后的字符串可以通过解密算法进行解密,便于程序对解密后的信息进行处理. 下面先给大家展示下效果图,感兴趣的朋友继续阅读全文. 效果演示     源码下载 笔者收录了一些比较经典的PHP加密解密函数代码,分享给大家.加密解密原理一般都是通过一定的加密解密算法,将密钥加入到算法中,最终得到加密解密结果. 1.非常给力的authcode加密函数,Discuz!经典代码(带详解): function authc

  • Android编程实现画板功能的方法总结【附源码下载】

    本文实例讲述了Android编程实现画板功能的方法.分享给大家供大家参考,具体如下: Android实现画板主要有2种方式,一种是用自定义View实现,另一种是通过Canvas类实现.当然自定义View内部也是用的Canvas.第一种方式的思路是,创建一个自定义View(推荐SurfaceView),在自定义View里通过Path对象记录手指滑动的路径调用lineTo()绘制:第二种方式的思路是,先用Canvas绘制一张空的Bitmap,通过ImageView的setImageBitmap()方

  • vue使用引用库中的方法附源码

    monaco-editor-vue的官方源码如下 Index.js import * as monaco from 'monaco-editor/esm/vs/editor/editor.api'; function noop() { } export { monaco }; export default { name: 'MonacoEditor', props: { diffEditor: { type: Boolean, default: false }, //是否使用diff模式 wid

  • Android开发实现横向列表GridView横向滚动的方法【附源码下载】

    本文实例讲述了Android开发实现横向列表GridView横向滚动的方法.分享给大家供大家参考,具体如下: Android 横向列表实现,可左右滑动,如下图 1. 主界面布局代码:activity_main.xml a.包裹HorizontalScrollView控件是GirdView横向滚动的基本条件 b.GirdView外包裹LinearLayout是java代码中参数设置的必要条件 <?xml version="1.0" encoding="utf-8"

  • Android编程实现滑动开关组件功能【附源码下载】

    本文实例讲述了Android编程实现滑动开关组件功能.分享给大家供大家参考,具体如下: 由于Android并未提供滑动开关之类的组件,所以我们需要自己去实现一个自定义的视图组件来实现滑动开关效果. 这里有一个示例代码,它包括三个类:开关组件视图.状态监听接口.MainActivity 我们先来看看整个demo的效果图: 我们先来看看视图组件的完整代码,代码都已经注释: package com.bear.swtichbuttondemo; import java.util.ArrayList; i

  • Hook实现Android 微信、陌陌 、探探位置模拟(附源码下载)

    Hook实现Android 微信.陌陌 .探探位置模拟 最近需要对微信,陌陌等程序进行位置模拟 实现世界各地发朋友圈,搜索附近人的功能,本着站在巨人肩膀上的原则 爱网上搜索一番. 也找到一些 代码和文章,但是代码大都雷同而且都有一个弊端 比如说 微信 对目标函数实现hook之后第一次打开微信 第一次定位是可以改变的 但是 我如果想更换地址的话 就需要重启手机了,重新加载hook了,试了很多次都是这样满足不了需求. 为了改进这个地方我们从gps定义的源代码流程开始看寻找hook系统函数的突破口 我

  • Android实现画板、写字板功能(附源码下载)

    前言 本文给大家分享一个使用Android开发写字板功能Dem.简单操作内存中的图像.对图像进行简单的处理.绘制直线.以达到写字板的效果 效果图如下 XML布局代码 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="

  • Android仿腾讯QQ实现滑动删除 附源码下载

    看了很多大神们的文章,感觉受益良多,也非常欣赏大家的分享态度,所以决定开始写Blog,给大家分享自己的心得. 先看看效果图: 本来准备在ListView的每个Item的布局上设置一个隐藏的Button,当滑动的时候显示.但是因为每次只要存在一个Button,发现每个Item上的Button相互间不好控制.所以决定继承ListView然后结合PopupWindow. 首先是布局文件: delete_btn.xml:这里只需要一个Button <?xml version="1.0"

随机推荐