Android : Activity 和 TabActivity 共用一个OptionMenu

在虚拟机上我可以用menu键打开OptionMenu,但是到了真机上没有menu键了。OptionMenu没有办法打开,所以只能采用google推荐到ActionBar。用右上角到三个点代替实体到menu按键。
确定了要采用这种显示形式后,考虑改如何实现。
首先介绍我这里项目当前结构:
MainActivity(TabActivity)管理3个Actity
实现TabHost 采用的是MainActivity继承TabActivity
首先我想到的就是让MainActivity继承ActionBarActivity。应为考虑到这样也可以使得程序可以向后兼容。然后实际在实现过程中我发现,MainActivity不继承TabActivity来实现TabHost的效果需要抛弃我现在项目结构中的3个Tab标签的Activity,取而代之的就是只用一个MainActivity,addTab添加的不再是Activity而是视图(应为TabActivity继承的是ActivityGroup存放的是Activity数组,所以MainActivity不继承ActivityGroup就无法再TabHost里添加Activity,只能在一个Activity实现)。如果这样的话那就改动太大,不合适。
这条路行不通,那么我们能不能仍然继承TabActivity也能实现ActionBar的效果。可以,只要我们在清单文件里将当前MainActivity的Theme改成Theme.AppCompat.Light。重写完OnCreateOptionMenu就会出现

当然这只是刚刚开始。我要真正实现的是孩子的Activity重写的menu能够显示到右上角的三个点上。
但是测试了一下,发现完全实现不了这个需求,应为每个Activity的OptionMenu都是属于自身的。而我在孩子Activity那里重写OnCreateOptionMenu完全没有任何用处。所以我想了一下能不能让孩子Activity去创建MainActivity的OptionMenu,所以我把MainActivity的实例拿到静态变量里去,孩子Activity去调用MainActivity的OnCreateOptionMenu,应为OnCreateOptionMenu只创建一次,所以我想我能不能在手动调用到时候,让它重写在绘制类似于自定义View的重绘。查询资料调用invalidateOptionsMenu();然后测试发现还报错。然后就放弃了这个办法。
后面我换个思路想想,我可以让MainActivity在创建OptionMenu的时候把3个孩子所需要到MenuItem全部创建出来。

在点开始重写onPrepareOptionsMenu方法通过选中不同的Tab,只显示当前的那个孩子的Activity的MenuItem。

解决MenuItem的显示问题之后,就是MenuItem的点击交互了,这个部分只能交给当前的孩子Activity进行处理。所以我们需要拿到所有孩子Acitivity的实例,在重写MainActivity的onOptionsItemSelected时根据选中的不同Tab获取当前的孩子Activity的实例。然后调用交由孩子的onOptionsItemSelect去处理点击事件。

此致就完美实现了我最上面所提出的需求。
当前使用我这种方法的前提是项目已经采用TabActvity来继承了,改动工程量太大无法采用更优的ViewPager+Fragment来处理。
过程艰辛,成长需要这个过程
Android : Activity 和 TabActivity 共用一个OptionMenu的更多相关文章
- Android 4学习(6):概述 - 深入了解Android Activity
参考:<Professional Android 4 Application Development> 深入了解Android Activity 每一个Android Activity都对 ...
- android activity改变另一个activity ui
android开发之在activity中控制另一个activity的UI更新 转自:http://www.cnblogs.com/ycxyyzw/p/3875544.html 第一种方法: 遇到一 ...
- 认识Activity,创建第一个android应用-Hello Word
2016-04-05 配置好Java.eclipse和Android环境就花费了一天时间.下载SDK真是费了不少时间.现在终于找到解决SDK更新的好方法了(更新自己电脑上的hosts文件,就可以使用G ...
- android开发之在activity中控制另一个activity的UI更新
转自:http://blog.csdn.net/jason0539/article/details/18075293 第一种方法: 遇到一个问题,需要在一个activity中控制另一个acitivit ...
- 【Android】12.3 在当前Activity中获取另一个Activity的返回值
分类:C#.Android.VS2015: 创建日期:2016-02-23 一.简介 在上一节的示例中,通过StartActivity(Intent)方法启动另一个Activity后,这两个Activ ...
- 【转】android之在activity中控制另一个activity的UI更新_如何在activity之间传递handler
来自:http://blog.csdn.net/jason0539/article/details/18055259 遇到一个问题,需要在一个activity中控制另一个acitivity做一些更新, ...
- android开发中一个activity如何调用另一个xml中的控件
有时候,我们需要在一个activity中使用另一个activity中的控件,这时候就不能直接findViewById,不然会报错指向空对象,这时就需要像下面这样做. LayoutInflater fa ...
- Android Activity launchMode研究
Android Activity launchMode研究 Activity的Launch mode一共有四种: standard, singleTop, singleTask, singleInst ...
- Android Activity生命周期详讲
管理 Activity 生命周期 通过实现回调方法管理 Activity 的生命周期对开发强大而又灵活的应用至关重要. Activity 的生命周期会直接受到 Activity 与其他 Activit ...
随机推荐
- ios ViewController present不同的方向
First ViewController CATransition *transition = [CATransition animation]; transition.duration = 0.3; ...
- JAVA程序猿面试题汇总
(此话题将不断更新,请留意) 第一,谈谈final, finally, finalize的差别. final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承.finally是异常 ...
- 项目总结——SqlParameter的参数设置长度(size属性)
看到很多朋友在实例化SqlParameter时,通常都没有指定参数的长度就直接给参数赋值了.就像下面的写法: new SqlParameter("@address", SqlDbT ...
- 安装Linux系统到u盘
第一步:首先插入u盘到电脑主机usb接口处(建议插入到主机箱后置的usb接口).然后打开UltraISO软件,再打开选择须要写入u盘的Ubuntu 10.04或者其它版本号的Linux系统的iso镜像 ...
- NT kernel & System 占用占用80端口
问题: 1 运行'netstat -ano'发现80端口被pid=4的进程占用 2 打开任务管理器,发现pid=4的进程,其实是system进程,其对应的进程描述是NT kernel & sy ...
- php的SQL连接操作的方法
初学php,于是一开始就在sql(具体点说是mysql)里受挫严重.于是这里记下一些方法. 首先是基本方法.基本方法现在我不用了,所以我就附一下hustoj中的部分吧 基本方法的数据库连接操作: if ...
- self-introduction
2014.9被同桌kpm带入坑....虽然现在不同班了...(Orz搞分班程序坑了他自己...) 入OI之后就没什么其他兴趣了...偶尔看看番.. 是数据结构控..(算不上吧?) 指针党. 来自广东 ...
- 多个DLL合并,DLL合并到EXE
1:) 下载 http://download.microsoft.com/download/1/3/4/1347C99E-9DFB-4252-8F6D-A3129A069F79/ILMerge.msi ...
- 使用微信 SDK 上传图片到七牛
总体思路是:在微信下选好图片后将图片上传到微信服务器,在后端使用微信服务器返回的图片 serverId 加上调用接口的 ApiTicket 通过七牛的 fetch 接口向微信服务器下载多媒体文件的接口 ...
- LInux下安装jdk与环境配置与Webstorm的安装
个人比较喜欢Webstorm这款软件,但是毕设要做的网站打算在Linux下做,所以就想在Linux上装个Webstorm.刚开始下载好后运行提示没有装jdk,然后apt-get install来安装还 ...