Android底部TabHost API

今天在项目中遇到了底部TabHost,顺便就写了一个底部TabHost的api继承即可使用非常简单,以下为源代码:

首先是自定义的TabHostActivity,如果要使用该TabHost继承该类即可

  1 package com.api;
  2
  3 import android.app.TabActivity;
  4 import android.content.Intent;
  5 import android.os.Bundle;
  6 import android.view.LayoutInflater;
  7 import android.view.View;
  8 import android.widget.LinearLayout;
  9 import android.widget.TabHost;
 10 import android.widget.TabHost.OnTabChangeListener;
 11 import android.widget.TabHost.TabSpec;
 12 import android.widget.TabWidget;
 13 import android.widget.TextView;
 14
 15 public abstract class TabHostActivity extends TabActivity {
 16
 17     private TabHost mTabHost;
 18     private TabWidget mTabWidget;
 19     private LayoutInflater mLayoutflater;
 20
 21     @Override
 22     protected void onCreate(Bundle savedInstanceState) {
 23         super.onCreate(savedInstanceState);
 24         // set theme because we do not want the shadow
 25         setTheme(R.style.Theme_Tabhost);
 26         setContentView(R.layout.api_tab_host);
 27
 28         mLayoutflater = getLayoutInflater();
 29
 30         mTabHost = getTabHost();
 31         mTabWidget = getTabWidget();
 32         //mTabWidget.setStripEnabled(false);    // need android2.2
 33
 34         prepare();
 35
 36         initTop();
 37         initTabSpec();
 38     }
 39
 40     private void initTop() {
 41         View child = getTop();
 42         LinearLayout layout = (LinearLayout) findViewById(R.id.tab_top);
 43         layout.addView(child);
 44     }
 45
 46     private void initTabSpec() {
 47
 48         int count = getTabItemCount();
 49
 50         for (int i = 0; i < count; i++) {
 51             // set text view
 52             View tabItem = mLayoutflater.inflate(R.layout.api_tab_item, null);
 53
 54             TextView tvTabItem = (TextView) tabItem.findViewById(R.id.tab_item_tv);
 55             setTabItemTextView(tvTabItem, i);
 56             // set id
 57             String tabItemId = getTabItemId(i);
 58             // set tab spec
 59             TabSpec tabSpec = mTabHost.newTabSpec(tabItemId);
 60             tabSpec.setIndicator(tabItem);
 61             tabSpec.setContent(getTabItemIntent(i));
 62
 63             mTabHost.addTab(tabSpec);
 64         }
 65
 66
 67
 68     }
 69
 70
 71
 72
 73
 74
 75
 76     /** 在初始化界面之前调用 */
 77     protected void prepare() {
 78         // do nothing or you override it
 79     }
 80
 81     /** 自定义头部布局 */
 82     protected View getTop() {
 83         // do nothing or you override it
 84         return null;
 85     }
 86
 87     protected int getTabCount() {
 88         return mTabHost.getTabWidget().getTabCount();
 89     }
 90
 91     /** 设置TabItem的图标和标题等*/
 92     abstract protected void setTabItemTextView(TextView textView, int position);
 93
 94     abstract protected String getTabItemId(int position);
 95
 96     abstract protected Intent getTabItemIntent(int position);
 97
 98     abstract protected int getTabItemCount();
 99
100     protected void setCurrentTab(int index) {
101         mTabHost.setCurrentTab(index);
102     }
103
104     protected void focusCurrentTab(int index) {
105         mTabWidget.focusCurrentTab(index);
106     }
107
108 }

需要再创建一个javabean TabItem

 1 package com.api.example.app;
 2
 3 import android.content.Intent;
 4
 5 public class TabItem {
 6     private String title;        // tab item title
 7     private int icon;            // tab item icon
 8     private int bg;            // tab item background
 9     private Intent intent;    // tab item intent
10
11     public TabItem(String title, int icon, int bg, Intent intent) {
12         super();
13         this.title = title;
14         this.icon = icon;
15         this.bg = bg;
16         this.intent = intent;
17     }
18
19     public String getTitle() {
20         return title;
21     }
22
23     public void setTitle(String title) {
24         this.title = title;
25     }
26
27     public int getIcon() {
28         return icon;
29     }
30
31     public void setIcon(int icon) {
32         this.icon = icon;
33     }
34
35     public int getBg() {
36         return bg;
37     }
38
39     public void setBg(int bg) {
40         this.bg = bg;
41     }
42
43     public Intent getIntent() {
44         return intent;
45     }
46
47     public void setIntent(Intent intent) {
48         this.intent = intent;
49     }
50 }

然后创建一个Activity继承上面的TabHostActivity即可使用该自定义的TabHost了

  1 package com.api.example.app;
  2
  3 import java.util.ArrayList;
  4 import java.util.List;
  5
  6 import android.content.Intent;
  7 import android.os.Bundle;
  8 import android.view.LayoutInflater;
  9 import android.view.View;
 10 import android.widget.TabWidget;
 11 import android.widget.TextView;
 12
 13 import com.api.R;
 14 import com.api.TabHostActivity;
 15
 16 /**
 17  * <p>整个流程就像使用ListView自定BaseAdapter一样</p>
 18  *
 19  * <p>如果要自定义TabHostActivity的Theme,并且不想要头部阴影
 20  * 一定要添加这个android:windowContentOverlay = null</p>
 21  *
 22  * <p>如果想在别的项目里面使用TabHostActivity
 23  * 可以项目的属性里面找到Android,然后在Library部分添加这个项目(Api)
 24  * <a href="http://www.cnblogs.com/qianxudetianxia/archive/2011/05/01/2030232.html">如何添加</a></p>
 25  * */
 26 public class ExampleActivity extends TabHostActivity {
 27
 28     List<TabItem> mItems;
 29     private LayoutInflater mLayoutInflater;
 30
 31     /**在初始化TabWidget前调用
 32      * 和TabWidget有关的必须在这里初始化*/
 33     @Override
 34     protected void prepare() {
 35         TabItem home = new TabItem(
 36                 "首页",                                    // title
 37                 R.drawable.icon_home,                    // icon
 38                 R.drawable.example_tab_item_bg,            // background
 39                 new Intent(this, Tab1Activity.class));    // intent
 40
 41         TabItem info = new TabItem(
 42                 "资料",
 43                 R.drawable.icon_selfinfo,
 44                 R.drawable.example_tab_item_bg,
 45                 new Intent(this, Tab2Activity.class));
 46
 47         TabItem msg = new TabItem(
 48                 "信息",
 49                 R.drawable.icon_meassage,
 50                 R.drawable.example_tab_item_bg,
 51                 new Intent(this, Tab3Activity.class));
 52
 53         TabItem square = new TabItem(
 54                 "广场",
 55                 R.drawable.icon_square,
 56                 R.drawable.example_tab_item_bg,
 57                 new Intent(this, Tab4Activity.class));
 58
 59         TabItem more = new TabItem(
 60                 "更多",
 61                 R.drawable.icon_more,
 62                 R.drawable.example_tab_item_bg,
 63                 new Intent(this, Tab5Activity.class));
 64
 65         mItems = new ArrayList<TabItem>();
 66         mItems.add(home);
 67         mItems.add(info);
 68         mItems.add(msg);
 69         mItems.add(square);
 70         mItems.add(more);
 71
 72         // 设置分割线
 73         TabWidget tabWidget = getTabWidget();
 74         tabWidget.setDividerDrawable(R.drawable.tab_divider);
 75
 76         mLayoutInflater = getLayoutInflater();
 77     }
 78
 79     @Override
 80     protected void onCreate(Bundle savedInstanceState) {
 81         super.onCreate(savedInstanceState);
 82         setCurrentTab(0);
 83     }
 84
 85     /**tab的title,icon,边距设定等等*/
 86     @Override
 87     protected void setTabItemTextView(TextView textView, int position) {
 88         textView.setPadding(3, 3, 3, 3);
 89         textView.setText(mItems.get(position).getTitle());
 90         textView.setBackgroundResource(mItems.get(position).getBg());
 91         textView.setCompoundDrawablesWithIntrinsicBounds(0, mItems.get(position).getIcon(), 0, 0);
 92
 93     }
 94
 95     /**tab唯一的id*/
 96     @Override
 97     protected String getTabItemId(int position) {
 98         return mItems.get(position).getTitle();    // 我们使用title来作为id,你也可以自定
 99     }
100
101     /**点击tab时触发的事件*/
102     @Override
103     protected Intent getTabItemIntent(int position) {
104         return mItems.get(position).getIntent();
105     }
106
107     @Override
108     protected int getTabItemCount() {
109         return mItems.size();
110     }
111
112     /**自定义头部文件*/
113     @Override
114     protected View getTop() {
115         return mLayoutInflater.inflate(R.layout.example_top, null);
116     }
117
118 }

效果如下:

时间: 2024-10-10 19:07:28

Android底部TabHost API的相关文章

android之实现底部TabHost

转:http://www.open-open.com/lib/view/open1330697955842.html 先说布局文件,如下:利用android:layout_alignParentBottom="true" 实现底部显示 <?xml version="1.0" encoding="utf-8"?> <TabHost xmlns:android="http://schemas.android.com/apk

Android底部菜单栏(用TabHost一次性加载耗内存)

上一个项目已经做完了,这周基本上没事,所以整理了下以前的项目,想把一些通用的部分封装起来,这样以后遇到相似的项目就不用重复发明轮子了,也节省了开发效率.今天把demo贴出来一是方便以后自己查询,二是希望同时也能帮到大家. 底部菜单栏很重要,我看了一下很多应用软件都是用了底部菜单栏做.我这里使用了tabhost做了一种通用的(就是可以像微信那样显示未读消息数量的,虽然之前也做过但是layout下的xml写的太臃肿,这里去掉了很多不必要的层,个人看起来还是不错的,所以贴出来方便以后使用). 先看一下

Android 底部TabActivity(1)——FragmentActivity

先看看效果图: 第一篇Tab系列的文章首先实现这种风格的底部Tab:背景条颜色不变,我们是用了深灰的颜色,图标会发生相应的变化,当选中某个标签后该标签的背板会由正常的颜色变为不正常,哈哈,是变为加深的灰色,更加凸显当前页的效果,所以我比较这种类型.在这里文字的变化我没处理,如果变色使用个selector就解决了,这里不再赘述. 再看一下整个Project的结构,如下 下面逐一介绍一下实现过程,具体实现还是看注释吧,代码也不是很多,就不啰嗦了. step1:首先是主界面MainTabActivit

Android ViewPager+TabHost实现首页导航

今天发的是TabHost结合ViewPager实现首页底部导航的效果,虽然说网上有很多这样的Demo,不过呢,我还是要把自己练习写的发出来,没错!就是这么任性: 先上效果图,如下: 代码里面有注释,就不过多解释了,说几点需要注意的问题 1:TabHost .TabWidget.FrameLayout一定添加id这个属性,否则会报错 android:id="@android:id/tabhost" android:id="@android:id/tabcontent"

Android 底部TabActivity(2)——ActivityGroup

今天这篇文章记述一下页面顶部底部上下均有Tab标签页的特殊需求!使用了过时的ActivityGroup. 再看一下整个Project的结构,如下 下面逐一介绍一下实现过程,一贯风格,具体实现还是看注释吧,代码也不是很多,就不啰嗦了. step1:首先是主界面MainActivity.java package sun.geoffery.tabtopbottom; import android.app.ActivityGroup; import android.content.Intent; imp

BottomBar之Android底部菜单

BottomBar之Android底部菜单 前言:开源项目BottomBar,实现Android底部菜单(常用菜单,BottomBar实现动画(上下式)+消息菜单,BottomBar+ViewPager+Fragment实现炫酷的底部导航效果) 效果: 开发环境:AndroidStudio2.2.1+gradle-2.14.1 引入依赖: compile 'com.android.support:appcompat-v7:23.0.0' compile 'com.android.support:

Android L Camera2 API 使用实例程序汇总

在网上发现几个使用Camera API2开发的实例程序,总结一下方便后续参考: 1.Camera2 Basic : https://github.com/googlesamples/android-Camera2Basic This sample demonstrates how to use basic functionalities of Camera2 API. You can learn how to iterate through characteristics of all the

Android 和Java API的一个坑:SimpleDateFormat

今天上班遇到这么一个意料之外的异常: 出问题的代码是这样的(已去除上下文信息): Log.i(LOG_TAG, new SimpleDateFormat("YYYY-MM-dd HH:mm:ss", Locale.CHINA) .format(System.currentTimeMillis())); 反复检查,感觉没有问题,于是新建一个Java Project,直接输出同样的代码: public class Main{ public static void main(String[]

反射调用android系统级API函数

try { Class<?> mClass = Class.forName("com.android.server.wifi.WifiSettingsStore"); Constructor con=mClass.getDeclaredConstructor(Context.class); if(!con.isAccessible()){ con.setAccessible(true); } Object store = con.newInstance(this); Met