Android底部菜单简单应用

发布时间 - 2026-01-10 22:54:59    点击率:

在Android中实现菜单功能有多种方法。
Options Menu:用户按下menu Button时显示的菜单。
Context Menu:用户长时间按下屏幕,所显示出来的菜单也称为上下文菜单。
Submenu:子菜单。
但是有时候这些内置的菜单并不能满足我们功能,这就需要自己自定义一种菜单。接下来我说的这种就是通过TabHost与RadioGroup结合完成的菜单。这也是很常用的一种底部菜单做法。先上图:

Xml代码

<?xml version="1.0" encoding="UTF-8"?> 
<TabHost android:id="@android:id/tabhost" android:layout_width="fill_parent" android:layout_height="fill_parent" 
 xmlns:android="http://schemas.android.com/apk/res/android"> 
  <LinearLayout  
    android:orientation="vertical"  
    android:layout_width="fill_parent"  
    android:layout_height="fill_parent"> 
    <FrameLayout  
      android:id="@android:id/tabcontent"  
      android:layout_width="fill_parent"  
      android:layout_height="0.0dip"  
      android:layout_weight="1.0" /> 
    <TabWidget  
      android:id="@android:id/tabs"  
      android:visibility="gone"  
      android:layout_width="fill_parent"  
      android:layout_height="wrap_content"  
      android:layout_weight="0.0" /> 
    <RadioGroup  
      android:gravity="center_vertical"  
      android:layout_gravity="bottom"  
      android:orientation="horizontal"  
      android:id="@+id/main_radio"  
      android:background="@drawable/maintab_toolbar_bg"  
      android:layout_width="fill_parent"  
      android:layout_height="wrap_content"> 
      <RadioButton  
        android:id="@+id/radio_button0"  
        android:tag="radio_button0"  
        android:layout_marginTop="2.0dip"  
        android:text="@string/alarm"  
        android:drawableTop="@drawable/icon_1"  
        style="@style/main_tab_bottom" /> 
      <RadioButton  
        android:id="@+id/radio_button1"  
        android:tag="radio_button1"  
        android:layout_marginTop="2.0dip"  
        android:text="@string/message"  
        android:drawableTop="@drawable/icon_2"  
        style="@style/main_tab_bottom" /> 
      <RadioButton  
        android:id="@+id/radio_button2"  
        android:tag="radio_button2"  
        android:layout_marginTop="2.0dip"  
        android:text="@string/photo"  
        android:drawableTop="@drawable/icon_3"  
        style="@style/main_tab_bottom" /> 
      <RadioButton  
        android:id="@+id/radio_button3"  
        android:tag="radio_button3"  
        android:layout_marginTop="2.0dip"  
        android:text="@string/music"  
        android:drawableTop="@drawable/icon_4"  
        style="@style/main_tab_bottom" /> 
      <RadioButton  
        android:id="@+id/radio_button4"  
        android:tag="radio_button4"  
        android:layout_marginTop="2.0dip"  
        android:text="@string/setting"  
        android:drawableTop="@drawable/icon_5"  
        style="@style/main_tab_bottom" /> 
    </RadioGroup> 
  </LinearLayout> 
</TabHost> 

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

在TabActivity中有么个方法:

@Override 
  public void onContentChanged() { 
    super.onContentChanged(); 
    mTabHost = (TabHost) findViewById(com.android.internal.R.id.tabhost); 

    if (mTabHost == null) { 
      throw new RuntimeException( 
          "Your content must have a TabHost whose id attribute is " + 
          "'android.R.id.tabhost'"); 
    } 
    mTabHost.setup(getLocalActivityManager()); 
  } 

  private void ensureTabHost() { 
    if (mTabHost == null) { 
      this.setContentView(com.android.internal.R.layout.tab_content); 
    } 
  } 

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

再看看TabHost这个类中

public void setup() { 
   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'"); 
   } 

   // KeyListener to attach to all tabs. Detects non-navigation keys 
   // and relays them to the tab content. 
   mTabKeyListener = new OnKeyListener() { 
     public boolean onKey(View v, int keyCode, KeyEvent event) { 
       switch (keyCode) { 
         case KeyEvent.KEYCODE_DPAD_CENTER: 
         case KeyEvent.KEYCODE_DPAD_LEFT: 
         case KeyEvent.KEYCODE_DPAD_RIGHT: 
         case KeyEvent.KEYCODE_DPAD_UP: 
         case KeyEvent.KEYCODE_DPAD_DOWN: 
         case KeyEvent.KEYCODE_ENTER: 
           return false; 

       } 
       mTabContent.requestFocus(View.FOCUS_FORWARD); 
       return mTabContent.dispatchKeyEvent(event); 
     } 

   }; 

   mTabWidget.setTabSelectionListener(new TabWidget.OnTabSelectionChanged() { 
     public void onTabSelectionChanged(int tabIndex, boolean clicked) { 
       setCurrentTab(tabIndex); 
       if (clicked) { 
         mTabContent.requestFocus(View.FOCUS_FORWARD); 
       } 
     } 
   }); 

   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'"); 
   } 
 } 

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

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

看一下主要代码:

package com.iteye.androidtoast; 

import android.app.TabActivity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.widget.RadioGroup; 
import android.widget.RadioGroup.OnCheckedChangeListener; 
import android.widget.TabHost; 

public class MainActivity extends TabActivity implements OnCheckedChangeListener{ 
  /** Called when the activity is first created. */ 
  private TabHost mHost; 
  private RadioGroup radioderGroup; 
  @Override 
  public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.maintabs); 
    //实例化TabHost 
    mHost=this.getTabHost(); 

    //添加选项卡 
    mHost.addTab(mHost.newTabSpec("ONE").setIndicator("ONE") 
          .setContent(new Intent(this,OneActivity.class))); 
    mHost.addTab(mHost.newTabSpec("TWO").setIndicator("TWO") 
        .setContent(new Intent(this,TwoActivity.class))); 
    mHost.addTab(mHost.newTabSpec("THREE").setIndicator("THREE") 
        .setContent(new Intent(this,ThreeActivity.class))); 
    mHost.addTab(mHost.newTabSpec("FOUR").setIndicator("FOUR") 
        .setContent(new Intent(this,FourActivity.class))); 
    mHost.addTab(mHost.newTabSpec("FIVE").setIndicator("FIVE") 
        .setContent(new Intent(this,FiveActivity.class))); 

    radioderGroup = (RadioGroup) findViewById(R.id.main_radio); 
    radioderGroup.setOnCheckedChangeListener(this); 
  } 
  @Override 
  public void onCheckedChanged(RadioGroup group, int checkedId) { 
    switch(checkedId){ 
    case R.id.radio_button0: 
      mHost.setCurrentTabByTag("ONE"); 
      break; 
    case R.id.radio_button1: 
      mHost.setCurrentTabByTag("TWO"); 
      break; 
    case R.id.radio_button2: 
      mHost.setCurrentTabByTag("THREE"); 
      break; 
    case R.id.radio_button3: 
      mHost.setCurrentTabByTag("FOUR"); 
      break; 
    case R.id.radio_button4: 
      mHost.setCurrentTabByTag("FIVE"); 
      break; 
    }     
  } 
} 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# Android  # 底部菜单  # android底部菜单栏实现原理与代码  # Android左右滑出菜单实例分析  # android popwindow实现左侧弹出菜单层及PopupWindow主要方法介绍  # 基于Android实现点击某个按钮让菜单选项从按钮周围指定位置弹出  # Android ListView长按弹出菜单二种实现方式示例  # Android界面设计(APP设计趋势 左侧隐藏菜单右边显示content)  # Android开发技巧之我的菜单我做主(自定义菜单)  # Android仿QQ空间底部菜单示例代码  # Android底部菜单栏实现的实例代码  # 的是  # 选项卡  # 按下  # 类中  # 是在  # 是因为  # 在这个  # 我说  # 中有  # 长时间  # 这就  # 这两个  # 有多  # 有几个  # 自定义  # 种方法  # 看一下  # 它会  # 取而代之  # 或者其他 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】  Bootstrap整体框架之CSS12栅格系统  网站制作软件有哪些,制图软件有哪些?  laravel怎么通过契约(Contracts)编程_laravel契约(Contracts)编程方法  高端企业智能建站程序:SEO优化与响应式模板定制开发  如何确认建站备案号应放置的具体位置?  Laravel Eloquent性能优化技巧_Laravel N+1查询问题解决  如何在阿里云购买域名并搭建网站?  Laravel中的Facade(门面)到底是什么原理  制作电商网页,电商供应链怎么做?  php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】  VIVO手机上del键无效OnKeyListener不响应的原因及解决方法  浅谈redis在项目中的应用  如何自定义建站之星网站的导航菜单样式?  如何快速上传建站程序避免常见错误?  Laravel怎么使用Blade模板引擎_Laravel模板继承与Component组件复用【手册】  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  原生JS获取元素集合的子元素宽度实例  东莞市网站制作公司有哪些,东莞找工作用什么网站好?  EditPlus中的正则表达式 实战(2)  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  Python正则表达式进阶教程_复杂匹配与分组替换解析  html如何与html链接_实现多个HTML页面互相链接【互相】  Laravel如何正确地在控制器和模型之间分配逻辑_Laravel代码职责分离与架构建议  Laravel如何实现密码重置功能_Laravel密码找回与重置流程  教学论文网站制作软件有哪些,写论文用什么软件 ?  微信推文制作网站有哪些,怎么做微信推文,急?  Windows10如何更改计算机工作组_Win10系统属性修改Workgroup  Google浏览器为什么这么卡 Google浏览器提速优化设置步骤【方法】  laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程  Python高阶函数应用_函数作为参数说明【指导】  如何在景安云服务器上绑定域名并配置虚拟主机?  如何有效防御Web建站篡改攻击?  Python自动化办公教程_ExcelWordPDF批量处理案例  Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门  JavaScript如何实现音频处理_Web Audio API如何工作?  如何在阿里云虚拟主机上快速搭建个人网站?  uc浏览器二维码扫描入口_uc浏览器扫码功能使用地址  详解Android中Activity的四大启动模式实验简述  如何用景安虚拟主机手机版绑定域名建站?  Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  Laravel队列由Redis驱动怎么配置_Laravel Redis队列使用教程  Midjourney怎么调整光影效果_Midjourney光影调整方法【指南】  Java类加载基本过程详细介绍  Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑  Laravel怎么实现验证码(Captcha)功能  如何在阿里云虚拟服务器快速搭建网站?  利用python获取某年中每个月的第一天和最后一天  如何用搬瓦工VPS快速搭建个人网站?