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 ...
随机推荐
- #include <boost/thread.hpp>
在这个库最重要的一个类就是boost::thread,它是在boost/thread.hpp里定义的,用来创建一个新线程.它已经被纳入C++标准库中. 小结:新一代C++标准将线程库引入后,将简化多线 ...
- 网站被百度和google封了,怎么办?
很多站长总是抱着侥幸的心里,通过作弊的方式在搜索引擎上获得一定排名,以致于网站被百度和google封了,也就是所谓的被K站. 那么,要是网站被百度和Google封了,怎么办? 首先要确定你的网站已经被 ...
- 关于各种排列(dfs)
代码一:数字有重复: #include <cstdio> ],arr[]={,,,}; void dfs(int v){ if(v >= n){ ;i<n;i++) print ...
- zabbix client安装配置执行
1 创建zabbix 用户 groupadd zabbix; useradd -g zabbix zabbix; passwd zabbix; 两次输入password 2 下载获得zabbix的包, ...
- Java面试题之八
四十一.面向对象的特征有哪些方面 四大特征大家都知道:抽象.继承.封装.多态.这是个理解性表述题,每个人的表述方式可能都不一样.下面仅选择一种作为参考: 1.抽象: 抽象——就是忽略一个主题中与当前目 ...
- 【拆点费用流】【HDU1853】【 Cyclic Tour】
题意: 有N个城市,M条单向路,Tom想环游全部城市,每次至少环游2个城市,每个城市只能被环游一次.由于每条单向路都有长度,要求游遍全部城市的最小长度. // 给定一个有向图,必须用若干个环来覆盖整个 ...
- C#关于事件的几个好例子
#region // 定义BoiledEventArgs类,传递给Observer所感兴趣的信息 public class BoiledEventArgs : EventArgs { public r ...
- 枚举基类Enum详解
本文主要是对枚举类型的基类Enum类做一个介绍: 首先,Enum类位于java.lang包下,根据类的介绍可以发现,Enum类是Java中所有枚举类的父类,将枚举作为一个set或者Map的keys来使 ...
- 百度地图SDk 使用
第一步: 获取密钥 应用名称可以随便填写 发布版SHA1 的获取要在 keytool -v -list -keystore: C:\Users\admin\.android\debug.keysto ...
- 蜗牛爱课- iOS中plist的创建,数据写入与读取
iOS中plist的创建,数据写入与读取功能创建一个test.plist文件-(void)triggerStorage{ NSArray *paths=NSSearchPathForDirect ...