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快速搭建个人网站?

