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

来源:互联网 发布:逆战刷nz点软件 编辑:程序博客网 时间:2024/05/01 12:38

上一个项目已经做完了,这周基本上没事,所以整理了下以前的项目,想把一些通用的部分封装起来,这样以后遇到相似的项目就不用重复发明轮子了,也节省了开发效率。今天把demo贴出来一是方便以后自己查询,二是希望同时也能帮到大家。

           底部菜单栏很重要,我看了一下很多应用软件都是用了底部菜单栏做。我这里使用了tabhost做了一种通用的(就是可以像微信那样显示未读消息数量的,虽然之前也做过但是layout下的xml写的太臃肿,这里去掉了很多不必要的层,个人看起来还是不错的,所以贴出来方便以后使用)。

          先看一下做出来之后的效果:

 

       以后使用的时候就可以换成自己项目的图片和字体了,主框架不用变哈哈,

     首先是要布局layout下xml文件 main.xml:

 

[html] view plaincopy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <TabHost xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:id="@android:id/tabhost"  
  4.     android:layout_width="fill_parent"  
  5.     android:layout_height="fill_parent" >  
  6.   
  7.     <LinearLayout  
  8.         android:layout_width="fill_parent"  
  9.         android:layout_height="fill_parent"  
  10.         android:background="@color/bg_gray"  
  11.         android:orientation="vertical" >  
  12.   
  13.         <FrameLayout  
  14.             android:id="@android:id/tabcontent"  
  15.             android:layout_width="fill_parent"  
  16.             android:layout_height="0.0dip"  
  17.             android:layout_weight="1.0" />  
  18.   
  19.         <TabWidget  
  20.             android:id="@android:id/tabs"  
  21.             android:layout_width="fill_parent"  
  22.             android:layout_height="wrap_content"  
  23.             android:layout_weight="0.0"  
  24.             android:visibility="gone" />  
  25.   
  26.         <FrameLayout  
  27.             android:layout_width="fill_parent"  
  28.             android:layout_height="wrap_content" >  
  29.   
  30.             <RadioGroup  
  31.                 android:id="@+id/main_tab_group"  
  32.                 android:layout_width="fill_parent"  
  33.                 android:layout_height="wrap_content"  
  34.                 android:layout_gravity="bottom"  
  35.                 android:background="@drawable/bottom1"  
  36.                 android:gravity="bottom"  
  37.                 android:orientation="horizontal"  
  38.                  >  
  39.   
  40.                 <RadioButton  
  41.                     android:id="@+id/main_tab_addExam"  
  42.                     style="@style/MMTabButton"  
  43.                     android:layout_weight="1.0"      
  44.                     android:drawableTop="@drawable/bg_checkbox_icon_menu_0"  
  45.                     android:text="添加考试" />  
  46.   
  47.                 <RadioButton  
  48.                     android:id="@+id/main_tab_myExam"  
  49.                     style="@style/MMTabButton"  
  50.                     android:layout_weight="1.0"  
  51.                     android:checked="true"  
  52.                     android:drawableTop="@drawable/bg_checkbox_icon_menu_1"  
  53.                     android:text="我的考试" />  
  54.   
  55.                 <RadioButton  
  56.                     android:id="@+id/main_tab_message"  
  57.                     style="@style/MMTabButton"  
  58.                     android:layout_weight="1.0"  
  59.                     android:drawableTop="@drawable/bg_checkbox_icon_menu_2"  
  60.                     android:text="我的通知" />  
  61.   
  62.                 <RadioButton  
  63.                     android:id="@+id/main_tab_settings"  
  64.                     style="@style/MMTabButton"  
  65.                     android:layout_weight="1.0"     
  66.                     android:drawableTop="@drawable/bg_checkbox_icon_menu_3"  
  67.                     android:text="设置" />  
  68.             </RadioGroup>  
  69.   
  70.             <TextView  
  71.                 android:id="@+id/main_tab_new_message"  
  72.                 android:layout_width="wrap_content"  
  73.                 android:layout_height="wrap_content"  
  74.                 android:layout_gravity="center_horizontal|top"  
  75.                 android:layout_marginLeft="60dip"  
  76.                 android:layout_marginTop="1dip"  
  77.                 android:background="@drawable/tips"  
  78.                 android:gravity="center"  
  79.                 android:text="1"  
  80.                 android:textColor="#ffffff"  
  81.                 android:textSize="10sp"  
  82.                 android:visibility="gone" />  
  83.         </FrameLayout>  
  84.     </LinearLayout>  
  85.   
  86. </TabHost>  

        在RadioGroup的外面加了一个FrameLayout,主要是为了使用TextView显示消息数量,这里是居中靠左60dip,可能你会问直接写死能支持多分辨率吗,这个我在320*480的手机上试过没问题的,因为dip是与设备无关的支持多分辨率,至于1280*800平板电脑这样的分辨率我就不能保证了,哈哈!

      接下来是样式布局:

[html] view plaincopy
  1. <style name="MMTabButton">  
  2.     <item name="android:textSize">12.0dip</item>  
  3.     <item name="android:gravity">center_horizontal</item>  
  4.     <item name="android:background">@drawable/bg_checkbox_menus</item>  
  5.     <item name="android:layout_width">fill_parent</item>  
  6.     <item name="android:layout_height">wrap_content</item>  
  7.     <item name="android:button">@null</item>  
  8.     <item name="android:textColor">@color/white</item>  
  9.     <item name="android:layout_weight">1.0</item>  
  10.     <item name="android:paddingBottom">2.0dip</item>  
  11.     <item name="android:paddingTop">2.0dip</item>  
  12. </style>  

       在drawable下bg_checkbox_menus.xml

   

[html] view plaincopy
  1. <?xml version="1.0" encoding="utf-8"?>   
  2. <selector xmlns:android="http://schemas.android.com/apk/res/android">   
  3.     <item   
  4.     android:state_checked="false"   
  5.     android:drawable="@drawable/mm_trans" />   
  6.     <item   
  7.     android:state_checked="true"   
  8.     android:drawable="@drawable/home_btn_bg" />   
  9. </selector>   

      其他的那四个都合这个一样点击后图片换成亮色的,所以就不一一贴出来了。

     最后看MainActivity这个类:

[html] view plaincopy
  1. package cn.com.karl.test;  
  2.   
  3.   
  4.   
  5. import android.app.TabActivity;  
  6. import android.content.Intent;  
  7. import android.os.Bundle;  
  8. import android.view.View;  
  9. import android.view.Window;  
  10. import android.widget.RadioGroup;  
  11. import android.widget.RadioGroup.OnCheckedChangeListener;  
  12. import android.widget.TabHost;  
  13. import android.widget.TextView;  
  14.   
  15. public class MainActivity extends TabActivity {  
  16.     /** Called when the activity is first created. */  
  17.     private TabHost tabHost;  
  18.     private TextView main_tab_new_message;  
  19.       
  20.     @Override  
  21.     public void onCreate(Bundle savedInstanceState) {  
  22.         super.onCreate(savedInstanceState);  
  23.         this.requestWindowFeature(Window.FEATURE_NO_TITLE);  
  24.         setContentView(R.layout.main);  
  25.           
  26.         main_tab_new_message=(TextView) findViewById(R.id.main_tab_new_message);  
  27.         main_tab_new_message.setVisibility(View.VISIBLE);  
  28.         main_tab_new_message.setText("10");  
  29.           
  30.         tabHost=this.getTabHost();  
  31.         TabHost.TabSpec spec;  
  32.         Intent intent;  
  33.   
  34.         intent=new Intent().setClass(this, AddExamActivity.class);  
  35.         spec=tabHost.newTabSpec("添加考试").setIndicator("添加考试").setContent(intent);  
  36.         tabHost.addTab(spec);  
  37.           
  38.         intent=new Intent().setClass(this,MyExamActivity.class);  
  39.         spec=tabHost.newTabSpec("我的考试").setIndicator("我的考试").setContent(intent);  
  40.         tabHost.addTab(spec);  
  41.           
  42.         intent=new Intent().setClass(this, MyMessageActivity.class);  
  43.         spec=tabHost.newTabSpec("我的通知").setIndicator("我的通知").setContent(intent);  
  44.         tabHost.addTab(spec);  
  45.           
  46.        
  47.         intent=new Intent().setClass(this, SettingActivity.class);  
  48.         spec=tabHost.newTabSpec("设置").setIndicator("设置").setContent(intent);  
  49.         tabHost.addTab(spec);  
  50.         tabHost.setCurrentTab(1);  
  51.           
  52.         RadioGroup radioGroup=(RadioGroup) this.findViewById(R.id.main_tab_group);  
  53.         radioGroup.setOnCheckedChangeListener(new OnCheckedChangeListener() {  
  54.               
  55.             @Override  
  56.             public void onCheckedChanged(RadioGroup group, int checkedId) {  
  57.                 // TODO Auto-generated method stub  
  58.                 switch (checkedId) {  
  59.                 case R.id.main_tab_addExam://添加考试  
  60.                     tabHost.setCurrentTabByTag("添加考试");  
  61.                     break;  
  62.                 case R.id.main_tab_myExam://我的考试  
  63.                     tabHost.setCurrentTabByTag("我的考试");  
  64.                     break;  
  65.                 case R.id.main_tab_message://我的通知  
  66.                     tabHost.setCurrentTabByTag("我的通知");  
  67.                     break;  
  68.                 case R.id.main_tab_settings://设置  
  69.                     tabHost.setCurrentTabByTag("设置");  
  70.                     break;  
  71.                 default:  
  72.                     //tabHost.setCurrentTabByTag("我的考试");  
  73.                     break;  
  74.                 }  
  75.             }  
  76.         });  
  77.     }  
  78.       
  79.      
  80. }  

        这样就完成了,主要还是使用了tabhost完成,tabhost有缓存机制这四个界面都会缓存到内存中,这样即有利也有弊,有利是因为切换的时候不用在重新加载了,有弊是因为缓存四个界面会耗费内存较多一些。如果只想缓存一个界面以后下一篇我会使用ActivityGroup实现顶部滑动栏,就像网易新闻的顶部滑动栏我相信也是只缓存了一个界面,切换的时候是从数据库加载的,所以第二次滑动加载会比较快。

        最后奉上下载地址,如果有需要的希望大家自己去下载吧,有些代码存在本地时间长了我也会弄丢。[rar文件] android底部菜单栏demo

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 学业水平考试有d怎么办 买了水果碰见领导怎么办 高一孩子不愿意上学怎么办 专家解答 孩子不愿意上学怎么办 冬天脚冷怎么办膝盖疼 拉拉裤大了怎么办小妙招 孕37周翻身困难怎么办 晚上睡不好白天犯困怎么办 抑郁症又不想起床了怎么办 儿童憋尿功能太差怎么办 一个月的宝宝睡眠不好怎么办 被商场要求撤场怎么办 上班没法接孩子放学怎么办 幼儿下午放学与上班错开怎么办 宝宝早上醒的早怎么办 晚卜睡不着尿多怎么办 要求正常休息公司不准怎么办 我早起被室友说怎么办? 小孩晚上睡的晚怎么办 初中一年级学不扎实怎么办 一年级学生上课爱说话怎么办 孩子不按时完成作业怎么办 高三理科基础不好怎么办 字写快了就难看怎么办 高一文科280分怎么办 高三了学不进去怎么办 副职兼任法人不够条件怎么办 正职和上级不和副职怎么办 中层正职和上级不和副职怎么办 陆军军官年龄大了怎么办 ps选区选多了怎么办 香港货物被海关扣了怎么办 羽绒服棉填充物不均匀了怎么办 蛀牙到牙神经了怎么办 t恤袖子长了怎么办 t恤袖子短了怎么办 ofo突然要交押金余款怎么办 裙子的腰小了怎么办 白衬衣棉质变软怎么办? 车被自行车刮了怎么办 刮花别人的车门怎么办