Android菜单

Android TV按键事件Framework层分发处理流程解析 前言 最近项目中遇到一个问题,在客户的launcher上按下 menu 键之后按上下左右键都没有响应,虽然最后通过修改文件 PhoneWindow.java 解决了问题,但是感觉对TV按键事件的分发流程还不是很明白,这里就带着问题来跟踪源码去探索TV 按键事件在 Framework 到底是怎么传递下来的。本篇博客分析的源码是Amlogic平台 Android 5.1 的代码,其它高版本也是适用的。... 阅读详情
Android一共有三种形式的菜单:
            1.选项菜单(optinosMenu)
            2.上下文菜单(ContextMenu)
            3.子菜单(subMenu)

其中最常用的就是选项菜单(optionsMenu), 该菜单在点击 menu 按键 后会在对应的Activity底部显示出来。



1.Activity菜单机制 (与dialog类似)
Activity有一套机制来实现对菜单的管理,方法如下:
   1.public boolean onCreateOptionsMenu(Menu menu)
             此方法用于初始化菜单,其中menu参数就是即将要显示的Menu实例。
              返回true则显示该menu,false 则不显示;
              
(只会在第一次初始化菜单时调用)

           2.public boolean 
onPrepareOptionsMenu(Menu menu)
             在
onCreateOptionsMenu执行后,菜单被显示前调用;如果菜单已经被创建,则在菜单显示前被调用。
              同样的, 返回true则显示该menu,false 则不显示;
             
(可以通过此方法动态的改变菜单的状态,比如加载不同的菜单等)

           3.public void onOptionsMenuClosed(Menu menu)
              每次菜单被关闭时调用.
              (
菜单被关闭有三种情形,menu按钮被再次点击、back按钮被点击或者用户选择了某一个菜单项)
              
            4.public boolean onOptionsItemSelected(MenuItem item)
               菜单项被点击时调用,也就是菜单项的监听方法。
              
          通过这几个方法,可以得知,对于Activity,同一时间只能显示和监听一个Menu 对象。


  2. 添加菜单:

      可以在onCreateOptionsMenu或者onPrepareOptionsMenu方法中来添加菜单

      2.1代码添加:
        menu.add((int groupId, int itemId, int order, charsequence title) .setIcon(drawable ID)

       add()方法的四个参数,依次是: 

      1、组别,如果不分组的话就写Menu.NONE, 

      2、Id,这个很重要,Android根据这个Id来确定不同的菜单 

      3、顺序,哪个菜单项在前面由这个参数的大小决定 

      4、文本,菜单项的显示文本

       add()方法返回的是MenuItem对象,调用其setIcon()方法,为相应MenuItem设置Icon

     示例:
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);
        menu.add(Menu.NONE, Menu.First+1, 0, "设置").setIcon(R.drawable.setting);
        return true;
    }
      
      2.2布局文件添加:
         
       getMenuInflater().inflate(R.menu.options_menu, menu);

      调用Activity的getMenuInflater()得到一个MenuInflater, 
       使用inflate方法来把布局文件中的定义的菜单 加载给 第二个参数所对应的menu对象

       示例:
     @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);
        getMenuInflater().inflate(R.menu.options_menu, menu);
        return true;
    }

    布局文件:
      在res目录下建立一个menu文件夹,并创建布局文件: options_menu.xml 
    <?xml version="1.0" encoding="utf-8"?>
    <menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/menu_setting" android:title="设置" android:icon="@drawable/setting"></item>
    </menu>


   3.菜单项监听:
    只要菜单中的菜单项被点击,都会触发onOptionsItemSelected(MenuItem item)
    item参数即为被点击的菜单项,那么需要在此方法内判断哪个Item被点击了,从而实现不同的操作。
    对于两种不同的添加菜单方法,判断的方法有一点区别,但本质是一样的。

    3.1代码添加菜单的判断方法
     @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        super.onOptionsItemSelected(item);
        switch(item.getItemId())//得到被点击的item的itemId
        {
        case Menu.First+1: //对应的ID就是在add方法中所设定的Id
            break;
        case Menu.First+2:
            break;
        }
        return true;
    }

  3.2布局文件添加菜单的判断方法:
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        super.onOptionsItemSelected(item);
        switch(item.getItemId())//得到被点击的item的itemId
        {
        case R.id.menu_setting://这里的Id就是布局文件中定义的Id,在用R.id.XXX的方法获取出来
            break;
        case R.id.menu_info:
            break;
        }
        return true;

    }

-----------------------------------------------------------------------------------------------------

以下转自eoe:http://www.eoeandroid.com/forum.php?mod=viewthread&tid=73675&page=1#pid776756

onCreateOptionsMenu是如何被调用的?

PhoneWindow的onKeyDown方法和onKeyUp方法作用如下:A key was pressed down and not handled by anything else in the window,即当某个键按下且没被其它的东西处理它时,就会在这里处理。
当按下菜单键时,会走到onKeyDownPanel,onKeyDownPanel中会产生一个PanelFeatureState对象,然后调用preparePanel函数,该函数的主要作用就是给PanelFeatureState对象调用回调对象(该回调对象为一个接口,其中一个回调函数就是onCreateOptionsMenu,我们用的Activity实现了它。),然后调用initializePanelMenu为PanelFeatureState对象设置一个Menu对象,该Menu对象即我们以后重载的时候添加的Menu。这个键按下的过程就结束了。
当松开的时候,会走到onKeyUpPanel,该函数调用openPanel来显示菜单。代码:
wm.addView(st.decorView, lp); //st为PanelFeatureState对象。wm为WindowManager.

安卓学习:菜单 1、知道三种菜单使用场景 2、能够正确使用三种菜单 阅读详情

相关推荐

安卓学习笔记26:常用控件 - 菜单

文章目录零、学习目标一、菜单概述二、选项菜单案例演示(一)运行效果(二)实现步骤1、创建安卓应用【OptionsMenuDemo】2、将背景图片拷贝到drawable目录3、主布局资源文件activity_main.xml4、字符串资源文件strings.xml5、主界面类 - MainActivity6、启动应用,查看效果 零、学习目标 能说出安卓三种常用菜单 能利用菜单编写简单安卓应用 一、菜单概述 本次课我们准备讲解菜单,菜单在安卓应用程序中占有比较重要的位置。原生安卓提供了三种类型的菜单:选项菜

howard2005的专栏 1846

Android4.1 Open Menu的过程

1. PhoneWindow.onKeyDown()       1. onKeyDownPanel.       当Menu键按下去之后,会产生一个KeyEvent,是keyDown事件,如果Activity没有处理这个Menu Down事件,就会由PhonwWindow默认onKeyDown处理。 在onKeyDown中只要就是调用了onKeyDownPanel把事件传递给对应的pane

Siobhan的专栏 5140

别再盲调PID了!手把手教你用VOFA+实时可视化电机速度曲线(附STM32F4源码)

本文详细介绍了如何使用VOFA+工具实现PID参数的可视化调试,帮助开发者从盲调转向精准调优。通过实时可视化电机速度曲线,结合STM32F4源码示例,展示了如何高效调试Kp、Ki、Kd参数,解决响应慢、超调等常见问题,大幅提升电机控制系统的性能。

weixin_28366475的博客 127

Android强行进阶—按键事件&焦点事件攻略,Android程序员最大的悲哀是什么

handled = TextKeyListener.getInstance().onKeyDown( null, mDefaultKeySsb, keyCode, event); if (handled && mDefaultKeySsb.length() > 0) { final String str = mDefaultKeySsb.toString(); clearSpannable = true; switch (mDefaultKeyMode) { case DEFAULT_

m0_66264134的博客 5215

华硕主板UEFI模式下安装Ubuntu与Windows双系统全攻略

本文详细讲解了在华硕主板UEFI模式下安装Ubuntu与Windows双系统的完整流程。从安装前的BIOS关键设置(如处理安全启动与CSM)、使用GPT分区表,到在Windows中安全分配空间、手动创建Ubuntu分区,最后完成引导配置,提供了避免常见错误的实用技巧,确保双系统稳定共存。

weixin_29199873的博客 345

STM32H743 ADC多通道采样实战:CubeMX配置+DMA传输避坑指南

本文详细介绍了STM32H743 ADC多通道采样的实战配置,包括CubeMX参数设置、DMA传输优化及常见问题解决方案。重点解析了ADC模块的核心特性、多通道采样序列配置、Cache一致性处理等关键技术,帮助开发者高效实现稳定可靠的模拟信号采集系统。

weixin_29175469的博客 611

Android按键事件处理流程 KeyEvent

刚接触Android开发的时候,对touch、key事件的处理总是一知半解,一会是Activity里的方法,一会是各种View 中的,自己始终不清楚到底哪个在先哪个在后,总之对整个处理流程没能很好的把握。每次写这部分代码的时候都有些心虚, 因为我不是很清楚什么时候、以什么样的顺序被调用,大都是打下log看看,没问题就算ok了。但随着时间流逝,这种感觉一直 折磨着我。期间也在网上搜

pengjin1985的专栏 6538

手把手教你用VMware虚拟机搭建PCAN开发环境:从Ubuntu安装到CAN通讯实战

本文详细指导如何在VMware虚拟机中搭建PCAN开发环境,涵盖从Ubuntu系统安装、VMware精细配置、PCAN-USB设备直通,到Linux驱动编译、can-utils工具集使用及完整CAN通讯测试的全过程。通过实战步骤与故障排查技巧,帮助开发者快速构建稳定高效的CAN总线开发与测试沙盒,特别适合车载诊断与嵌入式通讯应用。

weixin_29216353的博客 221

android去掉菜单键,大部分安卓手机为何取消菜单键

现在越来越多的安卓手机都取消了菜单键,并将返回键改到了左边。那安卓的按键设计到底经历过什么呢?今天小编就跟大家聊一聊。一、安卓手机按键的进化史在最早的安卓系统中,谷歌为安卓设计了4个按键而不是现在的3键,依次为Home键、菜单键、返回键、搜索键。然后到了安卓2.3时代,搜索键开始遇到麻烦了。因为众所周知的原因,国产手机用不了谷歌的搜索,所以搜索键也就慢慢的淘汰了。从那时候开始,只搭载菜单键、Hom...

weixin_42174176的博客 1453

使用 Python 和可视化编程控制树莓派机械臂myCobot

这些模块包括逻辑、循环、数学、文本、列表、颜色、变量、函数以及控制机械臂的函数等等,所以用户可以轻松入门编程,只需单击右上角的运行就可以启动程序,做一些有趣的应用。可以搭配任意摄像头进行图像识别,具有4个 USB 端口,可以通过 Raspberry Pi 的微型 HDMI 端口连接到显示器. 最后,40 个GPIO 接头可以进行更多扩展应用,机械臂每个接口都有清晰的标记,面板上还有一个电源开关和一个直流电源插孔。您现在可以将机器人放在地板或桌子上,并用力拧紧吸盘,以确保机械臂的底座在操作过程中不会移动。

m0_62456998的博客 3965

Origin绘制带差异显著性标记的分组均值条形图|科研论文图表教程(附数据格式模板)

传统柱状图虽能呈现组间均值差异,却隐藏个体数据分布;散点图虽能展示原始数据,却难以直观凸显统计显著性。带差异显著性(*)的分组均值条形图——它以“双层叙事”的创新设计,同时呈现群体特征与个体差异。

weixin_50236590的博客 1492

android全局悬浮菜单,安卓悬浮菜单全解锁

安卓悬浮菜单全解锁是一款十分好用的安卓桌面快捷操作整理工具,这款软件可以让你手机拥有一个和iPhone一样的手势悬浮球,一键打开各种应用以及操作,需要的小伙伴赶紧来下载这款安卓悬浮菜单全解锁吧~软件介绍悬浮菜单这是一款悬浮在手机主桌面上的便捷菜单,可以进行展开或者缩进,更加方便手机用户对手机的操作,用户还可以根据自己的习惯自定义菜单。值得一 说的是这款应用的作者是一位大三的学生,值得鼓励,小编给点...

weixin_31998371的博客 1215

Matlab TreeBagger实战:用随机森林预测房价的5个关键步骤(附完整代码)

本文详细介绍了使用Matlab的TreeBagger工具包构建随机森林模型预测房价的完整流程。通过波士顿房价数据集实战,涵盖数据预处理、模型构建、参数调优、特征重要性分析及高级应用(如分位数回归)等5个关键步骤,并附有完整代码,帮助读者快速掌握这一强大的回归分析工具。

ol789012的博客 444

安卓Android菜单

1、创建安卓应用

weixin_63975980的博客 112

把 ABAP Unit 测试放进本地类:让重构更安全、让测试更好找的组织方式

ABAP测试代码组织策略:单元测试与集成测试的合理存放位置 本文针对ABAP开发中测试代码组织混乱的问题,提出了一套系统化的解决方案: 单元测试应存放在被测类的本地测试include中(...CCAU或...T99),确保测试与代码同步演进且易于发现 跨对象测试(组件/集成/系统测试)应创建单独的全局测试类,并通过FOR TESTING和ABSTRACT进行防护 使用! @testing注释建立测试关系,使测试与被测对象明确关联,提高可发现性 针对不同技术栈(RAP/CAP/OData)提供了具体落地建议,

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1729

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

安卓编程基础——菜单

菜单在安卓应用程序中占有比较重要的位置。原生安卓提供了三种类型的菜单:选项菜单(OptionsMenu)、上下文菜单(ContextMenu)和子菜单(SubMenu)。有兴趣的同学可以玩一玩Navigation Drawer(导航抽屉),类似于滑动菜单。

lovepanyuxiao的博客 1064

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

android添加菜单选项,安卓菜单的实现,各种添加菜单的方法。

(一)选项菜单1、简单的创建菜单:1 @Override2 public booleanonCreateOptionsMenu(Menu menu) {3 super.onCreateOptionsMenu(menu);45 //添加菜单6 menu.add("菜单选项1");7 /*8 * pram1:组号 pram2:唯一...

weixin_33253741的博客 2108

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

android英文菜单,安卓recovery菜单中英文对照

安卓爱好者们必然都了解recovery的强大作用,recovery你可以把它当做是一个底层的回复系统模式,用于Android无法正常启动的情况下修复用的。当然,现在主要用途是用来刷第三方的ROM。如今比较好就是CM的recovery,recovery模式一般都是全英文的,大家看起来很麻烦,可能就是一头雾水,下面安卓后院(www.top139.com)就带来了recovery菜单的中英文对照翻译。希...

weixin_36472625的博客 1885

android 侧滑菜单_安卓实现菜单侧滑

Android 侧滑菜单的实现,参考网上的代码,实现侧滑菜单。最重要的是这个动画类UgcAnimations,如何使用动画类来侧滑的封装FlipperLayout。1、实现效果2、动画类UgcAnimationspackage com.mmsx.base; import android.content.Context; import android.view.View; import androi...

weixin_39716088的博客 273

android三个点菜单,安卓添加应用栏的菜单键(三个点)

前言当新建android工程后,发现原来使用的ActionBar的屏幕右上角的三个点不再出现了(如图中3),它是因为什么原因不在出现了呢?如果不是我自己的原因,那怎么才能搞出来。这个问题通过下面的方式已经得到了解决。 1. 为什么这个菜单键(三点)会不见了?大概意思也就是说安卓也在不断地进化中,有些东西可能被慢慢替代掉,从 Android 3.0(API 级别 11)开始,采用 Android 技...

weixin_35426913的博客 2125

android中创建菜单,Android中为activity创建菜单

安卓中为activity创建菜单,供大家参考,具体内容如下1.在res上面右键 > new > Android xml file .2.在弹出对话框中,找到 resourse type 点开右边的下拉框 选为Menu,file中写上资源名字(随意)3.之后将下面代码粘到xml中,自己根据需求进行修改android:id="@+id/add_item"android:title="add...

weixin_42647395的博客 478

android 溢出菜单宽度,安卓:溢出菜单的变化幅度

所以我也一直在寻找相同的答案,并一直在寻找的同时,所有的#2的问题是没有答案。最后,我不得不挖掘developer.google.com找出一种方法。你会找到一个方法setContentWidth(int width)将它实际上做我们的工作。下面是答案//.......... Something on toppopupMenu.show();// Try to force some horizon...

weixin_39693101的博客 162

安卓下三种菜单

Android的菜单分为三种类型:选项菜单(Option Menu)、上下文菜单(Context Menu)、子菜单(Sub Menu) 一.选项菜单 当用户单击设备上的菜单按钮(Menu),触发事件弹出的菜单就是选项菜单。选项菜单最多只有六个,超过六个第六个就会自动显示 更多 选项来展示显示。 创建方法: 1、覆盖Activity的onCreateOptionsMenu(Menu m

Android探索之路 895
上一篇: java记录
下一篇: Android杂谈--网络状态判断(3G/WIFI)
androidboy365
博客等级 码龄16年 35粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值