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

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

首先我的界面如下:

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

[java] view plaincopy

  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)即可,代码如下:

[java] view plaincopy

  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。如下:

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/xxx”,其中xxx自定义。其他的步骤在网上一搜一大堆我就不唠叨了。

时间: 2024-08-04 13:00:54

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

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

传统的线程技术中有两种创建线程的方式:一是继承Thread类,并重写run()方法:二是实现Runnable接口,覆盖接口中的run()方法,并把Runnable接口的实现扔给Thread.这两种方式大部分人可能都知道,但是为什么这样玩就可以呢?下面我们来详细分析一下这两种方法的来龙去脉. 1. 揭秘Thread中run()方法 上面我们看到这两种方式都跟run()方法有关,所以我们来看一下Thread的源码中run()方法到底都干了什么: @Override public void run()

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

1.首先来说说创建线程的两种方式 一种方式是继承Thread类,并重写run()方法 1 public class MyThread extends Thread{ 2 @Override 3 public void run() { 4 // TODO Auto-generated method stub 5 6 } 7 } 8 //线程使用 9 MyThread mt = new MyThread(); //创建线程 10 mt.start(); //启动线程 另外一种方式是实现Runnabl

黑马程序员——创建线程的两种方式

java中创建线程有两种方式: 1.继承Thread类 步骤: (1)定义一个类继承Thread类 (2)复写Thread类中的run()方法 (3)调用start()方法:启动线程及调用run()方法 2.实现Runnable接口的方式 步骤:(1)定义一个类实现Runnable接口 (2)覆盖Runnable接口中的run()方法,将线程要运行的代码放到该run方法中 (3)通过Thread类建立线程对象 (4)将实现Runable接口的类对象作为实际参数传递给Thread的构造函数. (5

Java并发编程-创建线程的两种方式及区别

转载请注明:http://blog.csdn.net/UniKylin/article/details/45016117 1.线程和进程的区别 并行:是多个任务在同一时间同时执行,例如多核计算机同时计算的任务可以理解为并行 并发:从微观上看是多个任务抢占一个CPU从而执行自己的任务,轮流执行任务,但是如果遇到资源冲突的时候并没有从根本提高执行效率.但是提高了CPU的使用效率. 前段时间在GitHub上的一幅图可以很好的阐述上面的概念非常形象 2.Java中创建线程的两种方式 1.第一种方式:直接

AIR打开创建进程的两种方式

写在这里,方便查阅 NativeApplication.nativeApplication.autoExit = true;// 主窗体关闭也跟着关闭 Debug.trace('ToursLocalConnection :: appExePath = ' + appExePath);currFile = new File(appExePath);//currFile = new File("C:/Users/lenovo/Desktop/LZPC_Test/LZPC/uninstall.exe&

创建线程的两种方式

首先我们需要知道什么是线程:是程序执行流的最小单元,包括就绪.阻塞和运行三种基本状态. 举个简单的例子:我们把生活中的两件事吃饭和写作业当作是两个线程,当你正在写作业的时候,爸妈叫你吃饭,你就直接去了,等吃完饭回来后再接着写作业.这就是相当于两个线程其中一个从运行状态转入就绪状态,另一个线程从就绪状态转入运行状态. 创建线程包括继承Thread类和实现Runnable接口两种方式(JDK5.0以后还包括了实现Callable等方式来实现线程,这里不做介绍,感兴趣的小伙伴可以自己查资料),下面介绍

Java接入Spark之创建RDD的两种方式和操作RDD

首先看看思维导图,我的spark是1.6.1版本,jdk是1.7版本 spark是什么? Spark是基于内存计算的大数据并行计算框架.Spark基于内存计算,提高了在大数据环境下数据处理的实时性,同时保证了高容错性和高可伸缩性,允许用户将Spark 部署在大量廉价硬件之上,形成集群. 下载和安装 可以看我之前发表的博客 Spark安装 安装成功后运行示例程序 在spark安装目录下examples/src/main目录中. 运行的一个Java或Scala示例程序,使用bin/run-examp

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

命令 vs 配置文件 Kubernetes 支持两种方式创建资源: 1. 用 kubectl 命令直接创建,比如: kubectl run nginx-deployment --image=nginx:1.7.9 --replicas=2 在命令行中通过参数指定资源的属性. 2. 通过配置文件和 kubectl apply 创建,要完成前面同样的工作,可执行命令: kubectl apply -f nginx.yml nginx.yml 的内容为: 资源的属性写在配置文件中,文件格式为 YAML

创建资源的两种方式

命令 vs 配置文件 Kubernetes 支持两种方式创建资源: 1. 用 kubectl 命令直接创建 kubectl run nginx-deployment --image=nginx:1.7.9 --replicas=2 在命令行中通过参数指定资源的属性. 2. 通过配置文件和 kubectl apply 创建 要完成前面同样的工作,可执行命令: [[email protected] k8s]# kubectl apply -f nginx.yaml deployment.extens