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 ...
随机推荐
- Adding Pagination 添加分页
本文来自: http://www.bbsmvc.com/MVC3Framework/thread-206-1-1.html You can see from Figure 7-16 that all ...
- js 推断 当页面无法回退时(history.go(-1)),关闭网页
在做一个Web项目时遇到一个需求,当页面没有前驱历史记录时(就是当前为新弹出的页面,没法做goback操作即history.go(-1)),点击返回button时直接关闭页面,否则就退回到前一页. 遇 ...
- C++中函数的默认参数
使用方法: (1)在函数声明或定义时,直接对参数赋值,该参数就是默认参数. (2)在函数调用时,省略部分或全部参数,这时就会使用默认参数进行代替. 注意事项: (1)一般在声明函数是设置默认参数. 如 ...
- 实用CSS3属性之 :target伪类实现Tab切换效果
CSS3 :target伪类用来改变页面中锚链接URL所指向的ID样式,例如你要改变描链接指向#tab的元素字体颜色为蓝色,哪么你可以这样写成#tab:target {color:blue} 浏览器支 ...
- HTML5新特性学习-2
本文在于巩固基础 HTML5绘图基础 <canvas>画布元素的使用 <div> <canvas id="can" width="200px ...
- win10系统安装 VS 2015 安装包下载
这个VS2015安装包 我找了好久才找到 能在WIN 10系统下安装 下面分享链接地址给大家: http://www.ithome.com/html/win10/215213.htm
- 内存泄漏工具VLD1.0_要点分析
0X01 关闭FPO优化 // Frame pointer omission (FPO) optimization should be turned off for this // entire fi ...
- C++中数字与字符串之间的转换,别人的,
C++中数字与字符串之间的转换 1.字符串数字之间的转换 (1)string --> char * string str("OK"); char * p = st ...
- fragment之间的信息交互——onActivityResult()不经过Activity
1.本文讲述如何fragment与fragment之间互传信息,不用使用Activity的onActivityResult()方法 核心思想:FirstFragment获取到SecondFragmen ...
- 用Cookie和Session实现用户登录 函数
由于网页是一种无状态的连接程序,你无法得知用户的浏览状态,必须通过Cookie或Session记录用户的有关信息. Cookie: 是一种在远程浏览器端储存数据并以此来跟踪和识别用户的机制. PHP透 ...