`
hp9016
  • 浏览: 20096 次
  • 性别: Icon_minigender_1
  • 来自: 大连
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

Andorid的bug?closeOptionsMenu问题研究

阅读更多
Activity.closeOptionsMenu()这个方法只能关闭第一层menu,对于二层以上的子菜单submenu,就无能为力。而且据我看到的,Android并没有提供关闭二级菜单的方法或者实现,SubMenu.close()并不能让弹出的submenu消失。目前来看只能通过用户交互,比如点击屏幕的其他部分来实现消失,而这是系统相关。
我个人的想法是,既然submenu建立在menu之上,closeOptionsMenu如果关闭menu,自然也应该把submenu关闭,不知道是我的理解有误还是Android的bug?

我再试试其他方法,看能不能让这个submenu自动消失。
工程代码在下面,有兴趣的可以研究。图片上画圈的是点击处。
package com.hp9016.android.test;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.SubMenu;

public class CloseOptionsMenuActivity extends Activity {

	/** Called when the activity is first created. */
	private final static String TAG = "++++CloseOptionsMenuActivity++++";

	@Override
	public void onCreate(Bundle savedInstanceState) {

		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		new Thread() {
			public void run() {
				try {
					Log.d(TAG, "++++run----sleep");
					sleep(30000);
					Log.d(TAG, "++++run----wake");
					closeOptionsMenu();
					Log.d(TAG, "++++closeOptionsMenu");
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}.start();
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {

		SubMenu sub = menu.addSubMenu(0, 0, 0, R.string.sub_menu).setIcon(
				this.getResources().getDrawable(R.drawable.icon));

		String name = "menuItem1";
		sub.add(0, 0, 0, name);
		name = "menuItem2";
		sub.add(0, 1, 1, name);

		menu.add(0, 1, 1, R.string.menu_item).setIcon(
				this.getResources().getDrawable(R.drawable.icon));

		return super.onCreateOptionsMenu(menu);
	}
}
  • 大小: 57.4 KB
  • 大小: 68 KB
  • 大小: 82.8 KB
分享到:
评论
1 楼 hp9016 2010-02-08  
原因整理如下。看来这个问题比较冷僻,没人鸟~~
1、先说一下二级菜单是个什么东西。看样子就是menu的一个子类,事实上它是一个Dialog。通过log,我们可以看出触发二级菜单的事件是在com.android.internal.policy.impl.PhoneWindow这个类的onSubMenuSelected方法中实现,在这个方法里面有MenuDialogHelper.show(),到MenuDialogHelper才发现二级菜单原来是个AlertDialog。
2、再说为什么closeOptionsMenu不能关闭,我们可以看到其实在二级菜单弹出的时候,option menu也就是按hard key出来的一级菜单已经关闭了,closeOptionsMenu有句注释:If the options menu is already closed, this method does nothing.所以执行这个方法是没有办法关闭二级菜单的。
3、为什么subMenu.close仍然不行呢?跟踪一下,在PhoneWindow的onCloseMenu方法里,它调用closePanel,里面就没有对MenuDialogHelper的处理!因此调用subMenu.close仍然不能关闭二级菜单。其实从onCloseMenu这个方法名我们就可以看出,它的可操作对象仅仅是menu而已。

所以如果想关闭option menu的二级菜单只有两种方法,一是用你的手指头点击屏幕的不相关部分,让系统隐了或者毁了它;还有就得修改android的framework,让它能被非交互型close,也就是调用某种方法让MenuDialogHelper,dismiss掉。这种改法当然影响比较大。
我个人认为这是android对二级菜单设计不合理之处,如果说bug,我也认为不为过。既然把它做成一个Dialog就应该提供或者封装相应的方法让程序员进行合理的操作。关闭仅仅是最基本的吧?

相关推荐

    android bugreport 分析

    Android bugreport是一个全面的系统日志文件,它包含了大量的系统信息,旨在帮助开发者诊断和解决Android设备上的问题。这个文件由一系列的子部分组成,每一部分都提供了关于系统不同方面的详细数据。接下来,我们将...

    Android分析Bugreport开源工具

    ChkBugReport是一个用于分析android的bugreport的开源工具,它可以把你得到的bugreprot导出成适合阅读的html。导出的html文件包含了根据bugreport数据得出的图表和分析结论,主要包括进程内存占用信息、程序ANR或...

    AndroidBug5497Workaround.java

    在开发中使用EditText时可能被软键盘遮挡布局,只需在布局中加入NestedScrollView 在对应的界面初始化 就可完美的解决.

    tip之bug?

    tip之bug 帐号对应信息显示出错

    Android-Buglife一个用于iOSApp的Bug报告SDK和Web平台

    **Android-Buglife SDK与Web平台** 在移动应用开发领域,尤其是iOS和Android平台,确保应用的稳定性和无误运行是至关重要的。开发者们经常面临的一个挑战就是如何快速有效地捕获、报告和解决应用程序中的错误,也...

    大家有没有发现VS2010——MFC的对话框有个BUG?

    大家有没有发现VS2010——MFC的对话框有个BUG?就是当对话框失去焦点后,外框的颜色没有变灰!

    android 串口测试demo 代码简单 无bug 完美运行

    android 串口测试demo 代码简单 无bug 完美运行 android 串口测试demo 代码简单 无bug 完美运行 android 串口测试demo 代码简单 无bug 完美运行 android 串口测试demo 代码简单 无bug 完美运行 android 串口测试demo...

    bugreport、logcat、kernel、anr以及tombstones的log抓取

    综上所述,`bugreport`、`logcat`、`kernel`、`anr`和`tombstones`是Android系统故障排查的关键工具,它们提供了丰富的信息,帮助开发者定位和解决各种问题。理解并熟练运用这些工具,是提升Android开发效率和维护...

    2016-2017Android Phone Bug Report.rar

    通过分析这些bug报告,我们可以深入理解Android系统在那个阶段遇到的技术问题以及如何解决它们。 1. **Android Bug报告结构**:通常,一个bug报告会包含以下几个关键部分:问题描述、复现步骤、影响的设备型号、...

    Android相机 解决三星bug版本

    Android Camera 三星BUG : 最近在Android项目中使用拍照功能 , 其它型号的手机运行成功了 唯独在三星的相机上遇到了bug . BUG具体体现为 : (1) 摄像头拍照后图片数据不一定能返回 ; onActivityResult的data为空 (2...

    Android 解决录音bug

    本文将详细讲解如何完美解决Android录音问题,以实现类似微信语音的效果。 首先,我们需要了解Android录音的基本原理。Android系统提供了`MediaRecorder`类来实现音频录制,它能处理音频源、编码格式以及输出文件等...

    android串口通讯无bug,供小伙伴们研究学习 android studio2.2以下版本

    网上下载的资源大多有各种各样的bug,本人也是为了公司业务做android开发板开发,下了网络的各种各样的Demo进行改,上传这一个改好的供大家研究学习吧。这个是网络上那个精简的android-serialport-api,我改了bug。 ...

    Bug发现提交报告

    在软件开发过程中,Bug发现和提交报告是一项至关重要的工作,它确保了开发团队能准确、高效地定位并修复问题,从而提升软件的质量和用户体验。以下是一份详细的关于如何编写有效的Bug提交报告的知识点: 1. **简洁...

    程序员新人怎样在复杂代码中找bug?

    Mentor说先从找code base中bug开始。但是我感觉我们的codebase好复杂,这几天突然没什么进展。uml之类的也画了不少。想问问前辈们有什么建议?  update:  感谢各位分享自己的经验。这段时间略有进展,来说说...

    BUG报告?提示与技巧.zip程序开发文档软件开发文技术档下载

    BUG报告?提示与技巧.zip程序开发文档软件开发文技术档下载BUG报告?提示与技巧.zip程序开发文档软件开发文技术档下载BUG报告?提示与技巧.zip程序开发文档软件开发文技术档下载BUG报告?提示与技巧.zip程序开发文档...

    Android 信息推送,史上最完美BUG! android 推送客户端

    本压缩包文件提供的内容是基于XMPP(Extensible Messaging and Presence Protocol)的Android信息推送客户端解决方案,针对原有代码中的BUG进行了修复,并允许开发者根据自己的业务需求进行定制。 XMPP是一种基于...

    Android-Beetle实现通过摇一摇手机就能够轻松地在GitHubGitLab和AzureDevOps上创建Bug报告

    标题中的“Android-Beetle实现通过摇一摇手机就能够轻松地在GitHubGitLab和AzureDevOps上创建Bug报告”揭示了一个独特的Android应用程序——Beetle。这个应用旨在简化开发者和用户向GitHub、GitLab以及Azure DevOps...

Global site tag (gtag.js) - Google Analytics