`
445822357
  • 浏览: 741168 次
文章分类
社区版块
存档分类
最新评论

android底部菜单应用

 
阅读更多

在android中实现菜单功能有多种方法。

Options Menu:用户按下menu Button时显示的菜单。

Context Menu:用户长时间按下屏幕,所显示出来的菜单也称为上下文菜单。

Submenu:子菜单。

但是有时候这些内置的菜单并不能满足我们功能,这就需要自己自定义一种菜单。接下来我说的这种就是通过TabHost与RadioGroup结合完成的菜单。这也是很常用的一种底部菜单做法。先上图:



首先看布局文件:

Xml代码收藏代码
  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <TabHostandroid:id="@android:id/tabhost"android:layout_width="fill_parent"android:layout_height="fill_parent"
  3. xmlns:android="http://schemas.android.com/apk/res/android">
  4. <LinearLayout
  5. android:orientation="vertical"
  6. android:layout_width="fill_parent"
  7. android:layout_height="fill_parent">
  8. <FrameLayout
  9. android:id="@android:id/tabcontent"
  10. android:layout_width="fill_parent"
  11. android:layout_height="0.0dip"
  12. android:layout_weight="1.0"/>
  13. <TabWidget
  14. android:id="@android:id/tabs"
  15. android:visibility="gone"
  16. android:layout_width="fill_parent"
  17. android:layout_height="wrap_content"
  18. android:layout_weight="0.0"/>
  19. <RadioGroup
  20. android:gravity="center_vertical"
  21. android:layout_gravity="bottom"
  22. android:orientation="horizontal"
  23. android:id="@+id/main_radio"
  24. android:background="@drawable/maintab_toolbar_bg"
  25. android:layout_width="fill_parent"
  26. android:layout_height="wrap_content">
  27. <RadioButton
  28. android:id="@+id/radio_button0"
  29. android:tag="radio_button0"
  30. android:layout_marginTop="2.0dip"
  31. android:text="@string/alarm"
  32. android:drawableTop="@drawable/icon_1"
  33. style="@style/main_tab_bottom"/>
  34. <RadioButton
  35. android:id="@+id/radio_button1"
  36. android:tag="radio_button1"
  37. android:layout_marginTop="2.0dip"
  38. android:text="@string/message"
  39. android:drawableTop="@drawable/icon_2"
  40. style="@style/main_tab_bottom"/>
  41. <RadioButton
  42. android:id="@+id/radio_button2"
  43. android:tag="radio_button2"
  44. android:layout_marginTop="2.0dip"
  45. android:text="@string/photo"
  46. android:drawableTop="@drawable/icon_3"
  47. style="@style/main_tab_bottom"/>
  48. <RadioButton
  49. android:id="@+id/radio_button3"
  50. android:tag="radio_button3"
  51. android:layout_marginTop="2.0dip"
  52. android:text="@string/music"
  53. android:drawableTop="@drawable/icon_4"
  54. style="@style/main_tab_bottom"/>
  55. <RadioButton
  56. android:id="@+id/radio_button4"
  57. android:tag="radio_button4"
  58. android:layout_marginTop="2.0dip"
  59. android:text="@string/setting"
  60. android:drawableTop="@drawable/icon_5"
  61. style="@style/main_tab_bottom"/>
  62. </RadioGroup>
  63. </LinearLayout>
  64. </TabHost>

需要注意的是,如果用TabHost这个控件,其中有几个ID是必须这么写的,android:id="@android:id/tabhost ;android:id="@android:id/tabcontent" ;android:id="@android:id/tabs" ;之所以要这么写是因为在TabHost这个类中。需要实例化上述这个ID的控件。看源码:

在TabActivity中有么个方法:

Java代码收藏代码
  1. @Override
  2. publicvoidonContentChanged(){
  3. super.onContentChanged();
  4. mTabHost=(TabHost)findViewById(com.android.internal.R.id.tabhost);
  5. if(mTabHost==null){
  6. thrownewRuntimeException(
  7. "YourcontentmusthaveaTabHostwhoseidattributeis"+
  8. "'android.R.id.tabhost'");
  9. }
  10. mTabHost.setup(getLocalActivityManager());
  11. }
  12. privatevoidensureTabHost(){
  13. if(mTabHost==null){
  14. this.setContentView(com.android.internal.R.layout.tab_content);
  15. }
  16. }

当内容发生改变时它会调用这个方法,来更新列表或者其他视图,而这个方法中需要实例化TabHost,所以必须通过ID为tabhost实例化。

再看看TabHost这个类中,

Java代码收藏代码
  1. publicvoidsetup(){
  2. mTabWidget=(TabWidget)findViewById(com.android.internal.R.id.tabs);
  3. if(mTabWidget==null){
  4. thrownewRuntimeException(
  5. "YourTabHostmusthaveaTabWidgetwhoseidattributeis'android.R.id.tabs'");
  6. }
  7. //KeyListenertoattachtoalltabs.Detectsnon-navigationkeys
  8. //andrelaysthemtothetabcontent.
  9. mTabKeyListener=newOnKeyListener(){
  10. publicbooleanonKey(Viewv,intkeyCode,KeyEventevent){
  11. switch(keyCode){
  12. caseKeyEvent.KEYCODE_DPAD_CENTER:
  13. caseKeyEvent.KEYCODE_DPAD_LEFT:
  14. caseKeyEvent.KEYCODE_DPAD_RIGHT:
  15. caseKeyEvent.KEYCODE_DPAD_UP:
  16. caseKeyEvent.KEYCODE_DPAD_DOWN:
  17. caseKeyEvent.KEYCODE_ENTER:
  18. returnfalse;
  19. }
  20. mTabContent.requestFocus(View.FOCUS_FORWARD);
  21. returnmTabContent.dispatchKeyEvent(event);
  22. }
  23. };
  24. mTabWidget.setTabSelectionListener(newTabWidget.OnTabSelectionChanged(){
  25. publicvoidonTabSelectionChanged(inttabIndex,booleanclicked){
  26. setCurrentTab(tabIndex);
  27. if(clicked){
  28. mTabContent.requestFocus(View.FOCUS_FORWARD);
  29. }
  30. }
  31. });
  32. mTabContent=(FrameLayout)findViewById(com.android.internal.R.id.tabcontent);
  33. if(mTabContent==null){
  34. thrownewRuntimeException(
  35. "YourTabHostmusthaveaFrameLayoutwhoseidattributeis"
  36. +"'android.R.id.tabcontent'");
  37. }
  38. }

这个方法,是在增加选项卡之前由系统调用。在这个方法中需要通过tabs 这个ID实例化一个TabWidget,通过tabcontent这个ID实例化一个FrameLayout,用来放置选项卡内容。所以这两个ID也是固定的。

在上述布局文件中隐藏了系统默认的Widget,取而代之的是带有图片的Button。

看一下主要代码:

Java代码收藏代码
  1. packagecom.iteye.androidtoast;
  2. importandroid.app.TabActivity;
  3. importandroid.content.Intent;
  4. importandroid.os.Bundle;
  5. importandroid.widget.RadioGroup;
  6. importandroid.widget.RadioGroup.OnCheckedChangeListener;
  7. importandroid.widget.TabHost;
  8. publicclassMainActivityextendsTabActivityimplementsOnCheckedChangeListener{
  9. /**Calledwhentheactivityisfirstcreated.*/
  10. privateTabHostmHost;
  11. privateRadioGroupradioderGroup;
  12. @Override
  13. publicvoidonCreate(BundlesavedInstanceState){
  14. super.onCreate(savedInstanceState);
  15. setContentView(R.layout.maintabs);
  16. //实例化TabHost
  17. mHost=this.getTabHost();
  18. //添加选项卡
  19. mHost.addTab(mHost.newTabSpec("ONE").setIndicator("ONE")
  20. .setContent(newIntent(this,OneActivity.class)));
  21. mHost.addTab(mHost.newTabSpec("TWO").setIndicator("TWO")
  22. .setContent(newIntent(this,TwoActivity.class)));
  23. mHost.addTab(mHost.newTabSpec("THREE").setIndicator("THREE")
  24. .setContent(newIntent(this,ThreeActivity.class)));
  25. mHost.addTab(mHost.newTabSpec("FOUR").setIndicator("FOUR")
  26. .setContent(newIntent(this,FourActivity.class)));
  27. mHost.addTab(mHost.newTabSpec("FIVE").setIndicator("FIVE")
  28. .setContent(newIntent(this,FiveActivity.class)));
  29. radioderGroup=(RadioGroup)findViewById(R.id.main_radio);
  30. radioderGroup.setOnCheckedChangeListener(this);
  31. }
  32. @Override
  33. publicvoidonCheckedChanged(RadioGroupgroup,intcheckedId){
  34. switch(checkedId){
  35. caseR.id.radio_button0:
  36. mHost.setCurrentTabByTag("ONE");
  37. break;
  38. caseR.id.radio_button1:
  39. mHost.setCurrentTabByTag("TWO");
  40. break;
  41. caseR.id.radio_button2:
  42. mHost.setCurrentTabByTag("THREE");
  43. break;
  44. caseR.id.radio_button3:
  45. mHost.setCurrentTabByTag("FOUR");
  46. break;
  47. caseR.id.radio_button4:
  48. mHost.setCurrentTabByTag("FIVE");
  49. break;
  50. }
  51. }
  52. }

这个应该没有什么好难理解的。OK该睡了。有什么问题留言!

分享到:
评论

相关推荐

    Android底部菜单和侧滑菜单的综合应用

    里面有引导页和登录页面供大家参考。Android底部菜单和侧滑菜单的综合应用,大家不下载的可以去看源码http://blog.csdn.net/u012600997/article/details/50686472

    Android自定义底部菜单

    在Android的应用中,经常会见到底部菜单.而在企业级的Android应用中,也存在同样的需求,但与微信这些大众软件的区别在于企业级的Android应用由于UI页面很多,每个页面都需要有底部菜单,而且每个页面的底部菜单按钮...

    Android 底部菜单.zip项目安卓应用源码下载

    Android 底部菜单.zip项目安卓应用源码下载Android 底部菜单.zip项目安卓应用源码下载 1.适合学生毕业设计研究参考 2.适合个人学习研究参考 3.适合公司开发项目技术参考

    android 自定义仿微信底部菜单栏

    仿微信底部菜单栏 底部菜单字体显示隐藏 底部菜单缩放等等

    android 底部菜单栏

    android 应用 底部菜单栏的实现LinearLayout

    Android底部菜单简单应用

    在Android中实现菜单功能有多种方法。 Options Menu:用户按下menu ...这也是很常用的一种底部菜单做法。先上图: Xml代码 &lt;?xml version=1.0 encoding=UTF-8?&gt; &lt;TabHost android:id=@android:id/tabhost

    Android高级应用源码-QQ空间底部菜单.zip

    Android高级应用源码-QQ空间底部菜单.zip

    Android 底部菜单.rar

    Android 开发应用源码 参考学习使用

    Android 底部菜单.zip

    Android 应用项目开发源码 参考和学习使用

    Android 底部菜单-IT计算机-毕业设计.zip

    Android应用源码开发Demo,主要用于毕业设计学习。

    Android App 底部导航菜单栏demo_可自由滑动

    本实例完成了App底部导航菜单自由滑动,仿微信主界面,可直接应用于项目开发。

    android底部菜单栏实现原理与代码

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

    Android实现美团APP的底部滑动菜单

    在现在的APP的应用中,类似仿美团APP的底部滑动菜单,应用是挺多的,例如QQ,微信,支付宝都应用到。开发流程如下 1. 底部按钮 底部按钮使用RadioButton。 // 按钮布局 &lt;LinearLayout android:id=@+id/llradiogroup...

    Android应用源码安卓源码(172个合集).zip

    Android应用源码安卓源码(172个合集),可以做为你的学习参考。 365MobileSecretary v1.0.6(365手机助手AIDL) 888个经典 Logo.rar AdXmpp(Openfire+asmack+spark) .zip AidlDemo(简单aidl的例子) aidl跨进程调用....

    android 菜单导航栏

    这是国外大牛搞的底部卫星菜单,代码简洁易懂,适合比较活泼的应用。习惯了底部导航栏fragment切换的你是否想要换一下。

    Android平台手机UI应用开发——软件管理器

    功能: 在应用上分为:系统应用和用户应用 在界面上实现应用列表的两种视图:列表视图和网格视图 在功能上实现应用的启动...以及底部菜单的美化。 详情见博客http://blog.csdn.net/yalin18/article/details/7377729

    Android 主流侧滑菜单框架 源码

    android市面主流侧滑框架,本架构主要实现侧滑出现底部view和首页实现tabhost效果,并且...本项目主要底部TabFragment和左边侧滑DragLayout 以及CustomViewPager 实现,并且提供退出应用的一种关闭所有acitiviy的方式。

Global site tag (gtag.js) - Google Analytics