`
xiaoming123123
  • 浏览: 100328 次
  • 性别: Icon_minigender_1
  • 来自: 南昌
社区版块
存档分类
最新评论

TabHost与RadioGroup实现底部菜单

 
阅读更多

转自:http://www.iteye.com/topic/1116261

 

 

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

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

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

Submenu:子菜单。

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

 

 


首先看布局文件:

 

 

 

 

 

Xml代码   收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <TabHost android: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.    public void onContentChanged() {  
  3.        super.onContentChanged();  
  4.        mTabHost = (TabHost) findViewById(com.android.internal.R.id.tabhost);  
  5.   
  6.        if (mTabHost == null) {  
  7.            throw new RuntimeException(  
  8.                    "Your content must have a TabHost whose id attribute is " +  
  9.                    "'android.R.id.tabhost'");  
  10.        }  
  11.        mTabHost.setup(getLocalActivityManager());  
  12.    }  
  13.   
  14.    private void ensureTabHost() {  
  15.        if (mTabHost == null) {  
  16.            this.setContentView(com.android.internal.R.layout.tab_content);  
  17.        }  
  18.    }  

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

 

再看看TabHost这个类中,

 

Java代码   收藏代码
  1. public void setup() {  
  2.       mTabWidget = (TabWidget) findViewById(com.android.internal.R.id.tabs);  
  3.       if (mTabWidget == null) {  
  4.           throw new RuntimeException(  
  5.                   "Your TabHost must have a TabWidget whose id attribute is 'android.R.id.tabs'");  
  6.       }  
  7.   
  8.       // KeyListener to attach to all tabs. Detects non-navigation keys  
  9.       // and relays them to the tab content.  
  10.       mTabKeyListener = new OnKeyListener() {  
  11.           public boolean onKey(View v, int keyCode, KeyEvent event) {  
  12.               switch (keyCode) {  
  13.                   case KeyEvent.KEYCODE_DPAD_CENTER:  
  14.                   case KeyEvent.KEYCODE_DPAD_LEFT:  
  15.                   case KeyEvent.KEYCODE_DPAD_RIGHT:  
  16.                   case KeyEvent.KEYCODE_DPAD_UP:  
  17.                   case KeyEvent.KEYCODE_DPAD_DOWN:  
  18.                   case KeyEvent.KEYCODE_ENTER:  
  19.                       return false;  
  20.   
  21.               }  
  22.               mTabContent.requestFocus(View.FOCUS_FORWARD);  
  23.               return mTabContent.dispatchKeyEvent(event);  
  24.           }  
  25.   
  26.       };  
  27.   
  28.       mTabWidget.setTabSelectionListener(new TabWidget.OnTabSelectionChanged() {  
  29.           public void onTabSelectionChanged(int tabIndex, boolean clicked) {  
  30.               setCurrentTab(tabIndex);  
  31.               if (clicked) {  
  32.                   mTabContent.requestFocus(View.FOCUS_FORWARD);  
  33.               }  
  34.           }  
  35.       });  
  36.   
  37.       mTabContent = (FrameLayout) findViewById(com.android.internal.R.id.tabcontent);  
  38.       if (mTabContent == null) {  
  39.           throw new RuntimeException(  
  40.                   "Your TabHost must have a FrameLayout whose id attribute is "  
  41.                           + "'android.R.id.tabcontent'");  
  42.       }  
  43.   }  

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

 

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

 

看一下主要代码:

Java代码   收藏代码
  1. package com.iteye.androidtoast;  
  2.   
  3. import android.app.TabActivity;  
  4. import android.content.Intent;  
  5. import android.os.Bundle;  
  6. import android.widget.RadioGroup;  
  7. import android.widget.RadioGroup.OnCheckedChangeListener;  
  8. import android.widget.TabHost;  
  9.   
  10. public class MainActivity extends TabActivity implements OnCheckedChangeListener{  
  11.     /** Called when the activity is first created. */  
  12.     private TabHost mHost;  
  13.     private RadioGroup radioderGroup;  
  14.     @Override  
  15.     public void onCreate(Bundle savedInstanceState) {  
  16.         super.onCreate(savedInstanceState);  
  17.         setContentView(R.layout.maintabs);  
  18.         //实例化TabHost  
  19.         mHost=this.getTabHost();  
  20.           
  21.         //添加选项卡  
  22.         mHost.addTab(mHost.newTabSpec("ONE").setIndicator("ONE")  
  23.                     .setContent(new Intent(this,OneActivity.class)));  
  24.         mHost.addTab(mHost.newTabSpec("TWO").setIndicator("TWO")  
  25.                 .setContent(new Intent(this,TwoActivity.class)));  
  26.         mHost.addTab(mHost.newTabSpec("THREE").setIndicator("THREE")  
  27.                 .setContent(new Intent(this,ThreeActivity.class)));  
  28.         mHost.addTab(mHost.newTabSpec("FOUR").setIndicator("FOUR")  
  29.                 .setContent(new Intent(this,FourActivity.class)));  
  30.         mHost.addTab(mHost.newTabSpec("FIVE").setIndicator("FIVE")  
  31.                 .setContent(new Intent(this,FiveActivity.class)));  
  32.           
  33.         radioderGroup = (RadioGroup) findViewById(R.id.main_radio);  
  34.         radioderGroup.setOnCheckedChangeListener(this);  
  35.     }  
  36.     @Override  
  37.     public void onCheckedChanged(RadioGroup group, int checkedId) {  
  38.         switch(checkedId){  
  39.         case R.id.radio_button0:  
  40.             mHost.setCurrentTabByTag("ONE");  
  41.             break;  
  42.         case R.id.radio_button1:  
  43.             mHost.setCurrentTabByTag("TWO");  
  44.             break;  
  45.         case R.id.radio_button2:  
  46.             mHost.setCurrentTabByTag("THREE");  
  47.             break;  
  48.         case R.id.radio_button3:  
  49.             mHost.setCurrentTabByTag("FOUR");  
  50.             break;  
  51.         case R.id.radio_button4:  
  52.             mHost.setCurrentTabByTag("FIVE");  
  53.             break;  
  54.         }         
  55.     }  
  56. }  

源码下载:
分享到:
评论

相关推荐

    TabHost实现底部菜单

    TabHost实现底部菜单, 底部菜单选项卡主要是通过TabHost和RadioGroup实现

    Android 使用RadioGroup实现底部菜单栏

    以下是如何使用`RadioGroup`实现底部菜单栏的步骤: 1. **布局设计**:首先,在XML布局文件中创建`RadioGroup`,并为每个底部菜单项添加`RadioButton`。每个`RadioButton`应包含相应的图标和文本描述。例如: ```...

    使用 RadioGroup和TabHost 实现底部菜单栏

    本教程将详细介绍如何利用`RadioGroup`和`TabHost`来实现这样一个底部菜单栏。 `RadioGroup`是Android SDK中的一个布局容器,它允许你创建一组单选按钮(RadioButton)。在这个场景中,我们将使用`RadioGroup`作为...

    android开发之tabhost+radiogroup

    RadioGroup提供了监听器来监听选中状态的变化,这对于实现底部菜单栏的切换逻辑非常有用。 在Android应用中,TabHost和RadioGroup结合使用可以实现类似底部导航栏的效果。具体步骤如下: 1. 首先,在布局文件中...

    tabHost实现底部菜单

    总结一下,`TabHost`和`RadioGroup`结合`Fragment`可以灵活地创建底部菜单。`TabHost`适合于较旧的应用或者需要独立活动的情况,而使用`RadioGroup`和`Fragment`更符合现代Android开发的最佳实践,且能更好地管理...

    android 实现底部菜单

    本文将详细讲解如何使用TabHost和RadioButton来实现这样一个底部菜单UI界面。 首先,我们需要理解TabHost和RadioButton的基本概念。TabHost是Android提供的一种容器组件,它可以将多个Tab(标签)组合在一起,每个...

    android_radiogroup_switch_fragment_replace_tabhost-master.zip

    在这个项目中,开发者使用了RadioGroup、Switch、Fragment以及TabHost等组件来构建一个底部菜单栏。 1. **RadioGroup**: RadioGroup是Android中用于管理多个RadioButton的容器,它允许用户在多个选项中选择一个。在...

    Android开发登录及主页面底部菜单

    本文将深入探讨如何实现“Android开发登录及主页面底部菜单”这一主题,结合`RadioGroup`和`TabHost`等关键组件来创建高效且直观的用户交互。 首先,我们从登录界面开始。登录页面通常包括用户名和密码输入框,以及...

    Android底部菜单栏的两种实现方式demo 附完整源码.rar

    二、通过RadioGroup和RadioButton实现底部菜单栏 另一种实现方式是不使用TabWidget,而是使用RadioGroup配合RadioButton,这样更灵活,可以自定义更多的交互和动画效果。 1. **布局设计**:在XML布局文件中,创建...

    Android 使用FragmentTabHost实现底部菜单功能

    Android 底部菜单的实现方式有多种,包括使用 TabHost+Fragment、RadioGroup+Fragment、FragmentTabHost+Fragment 等。每种方式都有其优缺,开发者需要根据实际情况选择合适的实现方式。 在 Android 中, ...

    Android开发之微信底部菜单栏实现的几种方法汇总

    以上就是Android开发中实现微信底部菜单栏的几种常见方法。根据项目需求和个人喜好,可以选择适合的方案进行实现。在实际开发中,还可以结合其他组件或库,如BottomNavigationView,进一步优化用户体验。

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

    本篇文章将介绍如何利用TabHost实现一个具有类似微信底部菜单栏功能的组件,包括显示未读消息计数的功能。 首先,TabHost是Android SDK提供的一种用于创建带有选项卡的Activity的组件。它由两部分组成:TabWidget和...

    TabDemo.rar

    在Android开发中,TabHost是实现底部导航栏的经典组件,常与RadioGroup和PopupWindow结合使用,以创建功能丰富的交互式界面。本文将详细讲解如何使用这三个组件来构建一个动态、用户友好的应用。 首先,TabHost是...

    Android仿微信底部菜单栏功能显示未读消息数量

    通过以上步骤,我们可以实现一个与微信类似的底部菜单栏,不仅提供功能切换,还能实时显示未读消息数量,从而提供更好的交互体验。在实际开发中,可以根据项目需求进行进一步的定制和优化,比如增加动画效果,调整...

    Android实现底部导航栏功能(选项卡)

    - 如果使用`BottomNavigationView`,还需关注其与`NavController`的集成,以实现Jetpack导航组件的特性。 总结来说,虽然`TabHost`在当前的Android开发中已逐渐被取代,但它仍然是理解Android选项卡式界面历史的...

    android导航菜单集合

    RadioButton通常与RadioGroup配合使用,用户在多个选项间进行选择,每次只能选中一个,这种设计常见于切换不同的功能模块。 3. **Android实现导航菜单左右滑动效果**:这种效果是通过手势(左右滑动)来切换菜单项...

Global site tag (gtag.js) - Google Analytics