创建TabHost的两种方式的简单分析

时间:2021-01-20 00:22:32

最近做了一个TabHost的界面,在做的过程中发现了一些问题,故和大家分享一下。

首先我的界面如下:

创建TabHost的两种方式的简单分析

目前就我所知,创建TabHost有两种方式,第一种是继承TabActivity类,然后用getTabHost方法来得到一个TabHost的实例,然后就可以给这个TabHost添加Tab了。示例代码如下:

  1. public class PlotHost extends TabActivity  {
  2. @Override
  3. protected void onCreate(Bundle savedInstanceState) {
  4. // TODO Auto-generated method stub
  5. super.onCreate(savedInstanceState);
  6. //      setContentView(R.layout.activity_main);
  7. setContentView(R.layout.tabhost);
  8. Resources res=getResources();
  9. TabHost tabhost=getTabHost();
  10. TabSpec dynamicplotSpec;
  11. TabSpec staticplotSpec;
  12. Intent dynamicplotIntent;
  13. Intent staticplotIntent;
  14. View dynamicplotView;
  15. View staticplotView;
  16. dynamicplotIntent=new Intent(this,Tab1.class);
  17. dynamicplotView=new TabView(this, R.drawable.dynamicploto, R.drawable.dynamicplots, "动态曲线");
  18. dynamicplotSpec=tabhost.newTabSpec("DynamicplotTab");
  19. dynamicplotSpec.setIndicator(dynamicplotView).setContent(dynamicplotIntent);
  20. tabhost.addTab(dynamicplotSpec);
  21. staticplotSpec=tabhost.newTabSpec("StaticplotTab");
  22. staticplotView=new TabView(this, R.drawable.staticploto, R.drawable.staticplots, "历史曲线");
  23. staticplotIntent=new Intent(this,Tab2.class);
  24. staticplotSpec.setIndicator(staticplotView).setContent(staticplotIntent);
  25. tabhost.addTab(staticplotSpec);
  26. tabhost.setCurrentTab(0);
  27. }
  28. //自定义一个tab选项卡显示样式
  29. private  class TabView extends LinearLayout {
  30. ImageView imageView ;
  31. public TabView(Context c, int drawableSelected, int drawableUnselected,String label) {
  32. super(c);
  33. this.setOrientation(VERTICAL);
  34. imageView = new ImageView(c);
  35. StateListDrawable listDrawable = new StateListDrawable();
  36. listDrawable.addState(SELECTED_STATE_SET, this.getResources()
  37. .getDrawable(drawableSelected));
  38. listDrawable.addState(ENABLED_STATE_SET, this.getResources()
  39. .getDrawable(drawableUnselected));
  40. imageView.setImageDrawable(listDrawable);
  41. imageView.setBackgroundColor(Color.TRANSPARENT);
  42. setGravity(Gravity.CENTER);
  43. addView(imageView);
  44. TextView tv_label=new TextView(c);
  45. tv_label.setText(label);
  46. tv_label.setGravity(Gravity.CENTER);
  47. addView(tv_label);
  48. }
  49. }
  50. }

具体代码我就不用多分析,只需要提一点的就是,用这种方式根本就不用你自定义一个TabHost的组建,getTabHost方法会自动调用系统默认的布局来帮助你进行显示,所以代码里面使用setContentView是多余的。

第二种方式问题就比较多了,其中网上大部分都说直接集成Activity,然后使用findViewbyId找到自定义的TabHost的组件,最
后对这个TabHost调用setup方法即可。但是不知道是何原因,也许是我的API版本比较高的原因,使用这种方法始终没有成功,logcat里面报
java.lang.RuntimeException异常。最后google后发现,需要改一下方式,即继承ActivityGroup,然后最后
setup的时候需要使用setup(this.getLocalActivityManager)即可,代码如下:

  1. public class PlotHost extends ActivityGroup  {
  2. @Override
  3. protected void onCreate(Bundle savedInstanceState) {
  4. // TODO Auto-generated method stub
  5. super.onCreate(savedInstanceState);
  6. //      setContentView(R.layout.activity_main);
  7. setContentView(R.layout.tabhost);
  8. Resources res=getResources();
  9. TabHost tabhost=(TabHost)findViewById(R.id.tabhost);
  10. tabhost.setup(this.getLocalActivityManager());
  11. TabSpec dynamicplotSpec;
  12. TabSpec staticplotSpec;
  13. Intent dynamicplotIntent;
  14. Intent staticplotIntent;
  15. View dynamicplotView;
  16. View staticplotView;
  17. dynamicplotIntent=new Intent(this,Tab1.class);
  18. dynamicplotView=new TabView(this, R.drawable.dynamicploto, R.drawable.dynamicplots, "动态曲线");
  19. dynamicplotSpec=tabhost.newTabSpec("DynamicplotTab");
  20. dynamicplotSpec.setIndicator(dynamicplotView).setContent(dynamicplotIntent);
  21. tabhost.addTab(dynamicplotSpec);
  22. staticplotSpec=tabhost.newTabSpec("StaticplotTab");
  23. staticplotView=new TabView(this, R.drawable.staticploto, R.drawable.staticplots, "历史曲线");
  24. staticplotIntent=new Intent(this,Tab2.class);
  25. staticplotSpec.setIndicator(staticplotView).setContent(staticplotIntent);
  26. tabhost.addTab(staticplotSpec);
  27. tabhost.setCurrentTab(0);
  28. }
  29. //自定义一个tab选项卡显示样式
  30. private  class TabView extends LinearLayout {
  31. ImageView imageView ;
  32. public TabView(Context c, int drawableSelected, int drawableUnselected,String label) {
  33. super(c);
  34. this.setOrientation(VERTICAL);
  35. imageView = new ImageView(c);
  36. StateListDrawable listDrawable = new StateListDrawable();
  37. listDrawable.addState(SELECTED_STATE_SET, this.getResources()
  38. .getDrawable(drawableSelected));
  39. listDrawable.addState(ENABLED_STATE_SET, this.getResources()
  40. .getDrawable(drawableUnselected));
  41. imageView.setImageDrawable(listDrawable);
  42. imageView.setBackgroundColor(Color.TRANSPARENT);
  43. setGravity(Gravity.CENTER);
  44. addView(imageView);
  45. TextView tv_label=new TextView(c);
  46. tv_label.setText(label);
  47. tv_label.setGravity(Gravity.CENTER);
  48. addView(tv_label);
  49. }
  50. }
  51. }

其实内容大同小异,至于为什么要这么做,貌似是如果直接调用TabHost的setup方法,不能实例化它的TabWidget和TabContent对象,需要借助于LocalActivityManager自动对二者进行实例化。因为看了一个老兄的博客,setup主要完成的功能便是实例化它的TabWidget和TabContent。如下:

创建TabHost的两种方式的简单分析mTabWidget = (TabWidget) findViewById(com.android.internal.R.id.tabs);
创建TabHost的两种方式的简单分析        if (mTabWidget == null) {
创建TabHost的两种方式的简单分析            throw new RuntimeException(
创建TabHost的两种方式的简单分析                    "Your TabHost must have a TabWidget whose id attribute is 'android.R.id.tabs'");
创建TabHost的两种方式的简单分析        }
创建TabHost的两种方式的简单分析创建TabHost的两种方式的简单分析
创建TabHost的两种方式的简单分析mTabContent = (FrameLayout) findViewById(com.android.internal.R.id.tabcontent);
创建TabHost的两种方式的简单分析        if (mTabContent == null) {
创建TabHost的两种方式的简单分析            throw new RuntimeException(
创建TabHost的两种方式的简单分析                    "Your TabHost must have a FrameLayout whose id attribute is 'android.R.id.tabcontent'");
创建TabHost的两种方式的简单分析        }

同时,还要补充,使用第二种方法的时候注意修改TabHost在布局当中的ID格式为“@+id/xxx”,其中xxx自定义。其他的步骤在网上一搜一大堆我就不唠叨了。

创建TabHost的两种方式的简单分析的更多相关文章

  1. 【java并发】传统线程技术中创建线程的两种方式

    传统的线程技术中有两种创建线程的方式:一是继承Thread类,并重写run()方法:二是实现Runnable接口,覆盖接口中的run()方法,并把Runnable接口的实现扔给Thread.这两种方式 ...

  2. Java并发基础01. 传统线程技术中创建线程的两种方式

    传统的线程技术中有两种创建线程的方式:一是继承Thread类,并重写run()方法:二是实现Runnable接口,覆盖接口中的run()方法,并把Runnable接口的实现扔给Thread.这两种方式 ...

  3. 创建线程的两种方式比较Thread VS Runnable

    1.首先来说说创建线程的两种方式 一种方式是继承Thread类,并重写run()方法 public class MyThread extends Thread{ @Override public vo ...

  4. ubuntu创建用户的两种方式

    ubuntu创建用户有两种方式: useradd和adduser 这两者,就像零件与产品的关系.useradd是DIY,需要自己调配,adduser是品牌机,拿来就能用. 对于创建一般用户来讲,use ...

  5. Spring创建JobDetail的两种方式

    一.Spring创建JobDetail的两种方式 二.整合方式一示例步骤 1.将spring核心jar包.quartz.jar和Spring-context-support.jar导入类路径. 2.编 ...

  6. 用idea简单创建web项目——两种方式

    最近同学让我教她们用idea创建web项目,于是我用两种方式创建web项目,并整理截图给她们看,一种是用maven创建,一种是不用maven创建,适合菜鸟哈哈~ 方法一:不用maven 1.解压tom ...

  7. Easyui 创建dialog的两种方式,以及他们带来的问题

    $('#yy').dialog('open');//打开dialog 这地方要注意,加入你关闭窗口的地方使用$('#yy').dialog('destroy');那么你这个dialog就只能使用一次, ...

  8. Java值创建线程的两种方式对比

    在Java中创建线程的方式有两种,第一种是直接继承Thead类,另一种是实现Runable接口.那么这两种方式孰优孰劣呢? 采用继承Thead类实现多线程: 优势:编写简单,如果需要访问当前线程,只需 ...

  9. k8s 创建资源的两种方式 - 每天5分钟玩转 Docker 容器技术(124)

    命令 vs 配置文件 Kubernetes 支持两种方式创建资源: 1. 用 kubectl 命令直接创建,比如: kubectl run nginx-deployment --image=nginx ...

随机推荐

  1. (转)Ubuntu samba配置服务文件包

    转:http://os.51cto.com/art/201001/176366.htm Ubuntu samba服务配置是很不错的文件应用很有学习价值,这里我主要讲解Ubuntu samba服务配置的 ...

  2. spark MySQL jar 包

    /** * Created by songcl on 2016/6/24. */ import java.sql.DriverManager //val sqlContext = new org.ap ...

  3. 网易云课堂 OCP

    数据库DBA任务: 管理数据库可用性 设计并创建数据库 管理物理结构 管理基于设计的存储 管理安全性 网络管理 备份与恢复 数据库调整与优化 关系型数据库(RDBMS) 多个表数据之间存在着关系 关系 ...

  4. lower_bound实现函数

    lower_bound实现 [参考链接]lower_bound二分的三种写法 我在以前,总是用lower_bound,现在发现这样不行,有些复杂的数据结构二分的时候用这个会很麻烦,不如手写二分,我接着 ...

  5. 浅谈c#枚举

    结构中的成员可以赋值,枚举呢....是取值,只读的 以下情况可以考虑将类创建为结构:(1)如果一个类其中的字段非常少,所有字段占用的内存总量不超过8.16字节:(2)如果一个类中的字段都是值类型: 关 ...

  6. c++基本函数

    std::abs 求绝对值函数 double abs (double x); float abs (float x); long double abs (long double x); std::sw ...

  7. 漏洞利用查询工具sandi

    漏洞利用查询工具sandi   在渗透测试中,一旦发现漏洞,就需要查找该漏洞的利用方式.由于漏洞众多,就需要渗透测试人员从海量的漏洞信息找出可用攻击载荷.Kali Linux内置了一个查询工具sand ...

  8. memcpy - how to copy float* to float* variable

    how to copy float* to float* float* seg_segmap = new float[OUTPUT_H * OUTPUT_W]; float* temp = new f ...

  9. 10.Spring——框架的AOP

    1.Spring 框架的 AOP 2.Spring 中基于 AOP 的 XML架构 3.Spring 中基于 AOP 的 @AspectJ 1.Spring 框架的 AOP Spring 框架的一个关 ...

  10. Visual Studio 2017 远程调试(Remote Debugger)应用

    I.远程调试情景 项目部署在远程服务器或非本地环境中,需要 处理应用中遇到的一些错误时 (不能直接附加进程或F5调试应用). II. 远程调试准备 1.远程服务器--操作系统和硬件要求 MSDN 操作 ...