使用自定义的TabHost可以不用继承TabActicity,但是要注意的是如果使用Activity作为Content的话,有两处代码是一定要加的。不然就会出现RuntimeError,还有在XML布局中使用自定义的TabHost时除了TabHost的id自定义外,LinearLayout和TabWidget的id必须使用系统默认。具体可参考下面的Demo。
使用TabWidget的效果(左)和自定义View的效果图(右):
       
MainActivity加载的XML布局:

<RelativeLayout 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"
tools:context=".MainActivity" > <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"
android:layout_weight="0" /> <FrameLayout
android:id="@android:id/tabcontent"
android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="1" />
</LinearLayout>
</TabHost> </RelativeLayout>

MainActivity的Java代码(注意红色代码):

package com.hitech.tabhostdemo;

import android.app.Activity;
import android.app.LocalActivityManager;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.widget.TabHost;
import android.widget.TabHost.TabSpec; @SuppressWarnings("deprecation")
public class MainActivity extends Activity { private LocalActivityManager lam;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); TabHost tabHost = (TabHost) findViewById(R.id.tabhost); // Intent对象
Intent intent1 = new Intent(this, TabSpecActivity1.class);
Intent intent2 = new Intent(this, TabSpecActivity2.class);
Intent intent3 = new Intent(this, TabSpecActivity3.class); // TabSpec对象
TabSpec tabSpec1 = tabHost.newTabSpec("first");
tabSpec1.setIndicator("第一页",
getResources().getDrawable(android.R.drawable.ic_dialog_email));
tabSpec1.setContent(intent1); TabSpec tabSpec2 = tabHost.newTabSpec("second");
tabSpec2.setIndicator("第二页",
getResources().getDrawable(android.R.drawable.ic_btn_speak_now));
tabSpec2.setContent(intent2); TabSpec tabSpec3 = tabHost.newTabSpec("third");
tabSpec3.setIndicator("第三页",
getResources().getDrawable(android.R.drawable.ic_dialog_dialer));
tabSpec3.setContent(intent3); lam = new LocalActivityManager(this, false);
lam.dispatchCreate(savedInstanceState);
tabHost.setup(lam);

tabHost.addTab(tabSpec1);
tabHost.addTab(tabSpec2);
tabHost.addTab(tabSpec3); // TabActivity
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
} @Override
protected void onPause() {
super
.onPause();
lam.dispatchPause(isFinishing());
}
}

自定义View代替TabWidget效果的实现原理:隐藏TabWidget,然后在线性布局中加入自定义View,如上图中即为LinearLayout中添加三个TextView,再分别对TextView设置点击事件来模拟TabWidget的效果。
同样,MainActivity加载的XML布局如下:

<RelativeLayout 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"
tools:context=".MainActivity" > <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"
android:layout_weight="0"
android:orientation="horizontal"android:visibility="gone" /> <FrameLayout
android:id="@android:id/tabcontent"
android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="1" /> <View
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_marginBottom="1dp"
android:background="@android:color/background_light" /> <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" > <TextView
android:id="@+id/tab_convst"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:drawablePadding="-10dp"
android:drawableTop="@drawable/ic_widget_conversation"
android:gravity="center"
android:paddingBottom="5dp"
android:text="@string/conversation" /> <TextView
android:id="@+id/tab_folder"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:drawablePadding="-10dp"
android:drawableTop="@drawable/ic_widget_folder"
android:gravity="center"
android:paddingBottom="5dp"
android:text="@string/folder" /> <TextView
android:id="@+id/tab_group"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:drawablePadding="-10dp"
android:drawableTop="@drawable/ic_widget_group"
android:gravity="center"
android:paddingBottom="5dp"
android:text="@string/group" />
</LinearLayout>
</LinearLayout>
</TabHost> </RelativeLayout>

注意和以往不同之处已做标记,分别是TabWidget和自定义的LinearLayout。
MainActivity中的处理:

package com.hitech.capacitymessage;

import android.app.Activity;
import android.app.LocalActivityManager;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TabHost;
import android.widget.TabHost.TabSpec;
import android.widget.TextView; @SuppressWarnings("deprecation")
public class MainActivity extends Activity implements OnClickListener { private static final String TAG = "MainActivity";
private LocalActivityManager lam;
private TabHost tabHost;
private Bundle state;
private TabSpec tab1;
private TabSpec tab2;
private TabSpec tab3; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.state = savedInstanceState;
activityInitializer();
} private void activityInitializer() {
tabHost = (TabHost) findViewById(R.id.tabhost);
tab1 = tabHost.newTabSpec("tab1");
tab1.setIndicator("会话",
getResources().getDrawable(R.drawable.ic_widget_conversation));
tab1.setContent(new Intent(this, TabActivity1.class)); tab2 = tabHost.newTabSpec("tab2");
tab2.setIndicator("文件夹",
getResources().getDrawable(R.drawable.ic_widget_folder));
tab2.setContent(new Intent(this, TabActivity2.class)); tab3 = tabHost.newTabSpec("tab3");
tab3.setIndicator("群组",
getResources().getDrawable(R.drawable.ic_widget_group));
tab3.setContent(new Intent(this, TabActivity3.class)); lam = new LocalActivityManager(this, true);
lam.dispatchCreate(state);
tabHost.setup(lam); tabHost.addTab(tab1);
tabHost.addTab(tab2);
tabHost.addTab(tab3); TextView block1 = (TextView) findViewById(R.id.tab_convst);
TextView block2 = (TextView) findViewById(R.id.tab_folder);
TextView block3 = (TextView) findViewById(R.id.tab_group); block1.setOnClickListener(this);
block2.setOnClickListener(this);
block3.setOnClickListener(this);
} @Override
public void onClick(View v) {
String tabTag = tabHost.getCurrentTabTag();
switch (v.getId()) {
case R.id.tab_convst:
if (!tabTag.equals("tab1")) {
tabHost.setCurrentTabByTag("tab1");
}
Log.e(TAG, tabHost.getCurrentTabTag());
break;
case R.id.tab_folder:
if (!tabTag.equals("tab2")) {
tabHost.setCurrentTabByTag("tab2");
}
Log.e(TAG, tabHost.getCurrentTabTag());
break;
case R.id.tab_group:
if (!tabTag.equals("tab3")) {
tabHost.setCurrentTabByTag("tab3");
}
Log.e(TAG, tabHost.getCurrentTabTag());
break;
default:
break;
}
} @Override
protected void onPause() {
super.onPause();
lam.dispatchPause(isFinishing());
}
}

TabHost的自定义的更多相关文章

  1. 【读书笔记《Android游戏编程之从零开始》】6.Android 游戏开发常用的系统控件(TabHost、ListView)

    3.9 TabSpec与TabHost TabHost类官方文档地址:http://developer.android.com/reference/android/widget/TabHost.htm ...

  2. TabHost自定义外观

    博客园:http://www.cnblogs.com 农民伯伯: http://www.cnblogs.com/over140 版本 新浪微博 weibo_10235010.apk 正文 一.效果图 ...

  3. 使用自定义RadioButton和ViewPager实现TabHost效果和带滑动的页卡效果

    在工作中又很多需求都不是android系统自带的控件可以达到效果的,内置的TabHost就是,只能达到简单的效果 ,所以这个时候就要自定义控件来达到效果:这个效果就是: 使用自定义RadioButto ...

  4. android自定义tabhost,tabcontent用intent获得

    地址:http://my.oschina.net/aowu/blog/36282 自己改的自定义tabhost组建,效果图如左.有更好的朋友可以相互交流一下,嘿嘿. 1.先上AndroidManife ...

  5. 自定义TabHost,TabWidget样式

    先看效果: 京东商城底部菜单栏 新浪微博底部菜单栏 本次学习效果图:

  6. 安卓自定义类似TabHost的导航栏

    有时候为了项目需要我们要自定义一些导航控件,类似下面这样. 下面给大家讲讲我是怎么实现的, 1.素材准备(这个都是美工的事情) 2.①资源文件共有五个 如下: activity_main_first. ...

  7. Android 自定义TabHost,TabWidget样式

    界面比较简单,要想做得漂亮换几张图片就可以了. 第一步:先在布局(这里用了main.xml创建时自动生成的)里面放上TabHost ,只要将TabHost控件托至屏幕中就可: <?xml ver ...

  8. Android 实现分页(使用TabWidget/TabHost)

    注:本文为转载,但该内容本人已亲身尝试,确认该方法可行,代码有点小的改动,转载用作保存与分享. 原作者地址:http://gundumw100.iteye.com/blog/853967 个人吐嘈:据 ...

  9. 利用TabHost制作QQ客户端标签栏效果(低版本QQ)

    学习一定要从基础学起,只有有一个好的基础,我们才会变得更加的perfect 下面小编将利用TabHost制作QQ客户端标签栏效果(这个版本的QQ是在前几年发布的)…. 首先我们看一下效果: 看到这个界 ...

随机推荐

  1. bzoj2663: [Beijing wc2012]灵魂宝石(二分+匈牙利)

    2663: [Beijing wc2012]灵魂宝石 题目:传送门 题解: 又是一道卡精度的题目. 很容易就可以看出单调性啊,如果R越大,选的人就越多,R越小,选的人就越少. 那最小值就直接搞咯. 那 ...

  2. 智课雅思词汇---十二、vent是什么意思

    智课雅思词汇---十二.vent是什么意思 一.总结 一句话总结:词根:ven, vent = come, 表示“来” 词根:vent = wind 风 1.tact是什么意思? 词根:-tact-, ...

  3. ie浏览器检测不到cookie的问题

    之前做项目由于客户的要求设置缓存必须由后台来设置必须使用cookie(session是没问题的),后期设置时出现了登录页面与首页来还跳转的局面.原因就是首页没检测到登录后的缓存,而后台验证到确实已经是 ...

  4. Python学习之基本概念

    1.Python是一种解释型语言.Python解释器通过“一次执行一条语句”的方式执行程序的. 2.Python用空白来组织程序,不像R等用大括号. 3.# 是Python的注释符号. 4.变量是按引 ...

  5. 【原创】Apache和Tomcat实现动静分离

    集群中每个节点都启用了页面静态化功能,所以,为了防止单个节点刷新造成找不到页面问题,将每个节点刷新的页面都放入apache虚拟目录下,由apache统一来处理.静态页面由apache处理,动态页面仍然 ...

  6. hiho 1604 - 股票价格,思维题

    题目链接 题目大意 小Hi最近在关注股票,为了计算股票可能的盈利,他获取了一只股票最近N天的价格A1~AN. 在小Hi的策略中,每天可以在下列三种操作中选取一种: 1.什么也不做: 2.按照当天的价格 ...

  7. springmvc整合mybatis实现商品列表查询

    转载.https://blog.csdn.net/chizhuyuyu/article/details/82180404 https://www.jianshu.com/p/689bdd11bfcc. ...

  8. HDU 5273 Dylans loves sequence【 树状数组 】

    题意:给出n个数,再给出q个询问,求L到R的逆序对的个数 先自己写的时候,是每次询问都重新插入来求sum(r)-sum(l) 果断T 后来还是看了别人的代码---- 预处理一下,把所有可能的区间的询问 ...

  9. 安卓、safari和微信各个浏览器的设计标准

  10. 百度蜘蛛IP地址到底代表什么含义?

    百度蜘蛛IP地址到底代表什么含义,是不是不同的ip地址所代表的含义不一样呢?对权重和抓取是否有影响?哪些是无效的蜘蛛,哪些是站长工具的蜘蛛,那些又是百度自己真正的蜘蛛?百度蜘蛛,是百度搜索引擎的一个自 ...