在虚拟机上我可以用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的更多相关文章

  1. Android 4学习(6):概述 - 深入了解Android Activity

    参考:<Professional Android 4 Application Development> 深入了解Android Activity 每一个Android Activity都对 ...

  2. android activity改变另一个activity ui

    android开发之在activity中控制另一个activity的UI更新   转自:http://www.cnblogs.com/ycxyyzw/p/3875544.html 第一种方法: 遇到一 ...

  3. 认识Activity,创建第一个android应用-Hello Word

    2016-04-05 配置好Java.eclipse和Android环境就花费了一天时间.下载SDK真是费了不少时间.现在终于找到解决SDK更新的好方法了(更新自己电脑上的hosts文件,就可以使用G ...

  4. android开发之在activity中控制另一个activity的UI更新

    转自:http://blog.csdn.net/jason0539/article/details/18075293 第一种方法: 遇到一个问题,需要在一个activity中控制另一个acitivit ...

  5. 【Android】12.3 在当前Activity中获取另一个Activity的返回值

    分类:C#.Android.VS2015: 创建日期:2016-02-23 一.简介 在上一节的示例中,通过StartActivity(Intent)方法启动另一个Activity后,这两个Activ ...

  6. 【转】android之在activity中控制另一个activity的UI更新_如何在activity之间传递handler

    来自:http://blog.csdn.net/jason0539/article/details/18055259 遇到一个问题,需要在一个activity中控制另一个acitivity做一些更新, ...

  7. android开发中一个activity如何调用另一个xml中的控件

    有时候,我们需要在一个activity中使用另一个activity中的控件,这时候就不能直接findViewById,不然会报错指向空对象,这时就需要像下面这样做. LayoutInflater fa ...

  8. Android Activity launchMode研究

    Android Activity launchMode研究 Activity的Launch mode一共有四种: standard, singleTop, singleTask, singleInst ...

  9. Android Activity生命周期详讲

    管理 Activity 生命周期 通过实现回调方法管理 Activity 的生命周期对开发强大而又灵活的应用至关重要. Activity 的生命周期会直接受到 Activity 与其他 Activit ...

随机推荐

  1. iOS 创建推送证书

    1.首先你想创建推送证书和以前你做真机测试证书一样,需要实现准备一个99$的付费账号.然后登陆苹果开发者网站.http://developer.apple.com/ 2.登陆以后你能看到这个界面然后选 ...

  2. 《面试题精选》15.O(logn)求Fibonacci数列

    题目:定义Fibonacci数列例如以下: /    0                      n=0 f(n)=      1                      n=1          ...

  3. C#整理2——C#的输入输出及基本类型

    //输出 Console.WriteLine("摩西摩西"); Console.Write("hollo");不带回车的 注意: 1.注意大小写敏感.(快捷键操 ...

  4. 理解js异步的概念

    js引擎在执行的时候是单线程的,这是大家都知道的.我们先来看一段代码: <html> <head> <meta http-equiv="Content-Type ...

  5. 什么是 CSS 预处理器?

    什么是 CSS 预处理器?  就CSS本身而言,对于大多数Web前端从业人员来说就不是问题.学过CSS的人都知道,它不是一种编程语言.你可以用它开发网页样式,但是没法用它编程.换句话说,CSS基本上是 ...

  6. 读书笔记一 Java程序员的基本修养(数组及其内存管理)

    1.1 数组初始化 1.1.1 java数组是静态的 java数组被初始化之后,该数组所占的内存空间.数组长度都是不可变的. java程序中的数组必须经过初始化才可使用. 数组的初始化有两种方式: 1 ...

  7. C语言中的数据类型

    基本数据类型: int float double char void 派生数据类型: 数据类型修饰符 + 基本数据类型 = 派生数据类型 signed  和 unsigned 类型 unsigned ...

  8. 判断是否联网_检测网络的类型为3G、2G、wap、wifi

    判断是否联网_检测网络的类型为3G.2G.wap.wifi  判断是否联网: /*** * judge Internet is available * * @author wei-spring * @ ...

  9. 嵌入式程序员应知道的0x10个基本问题

     来源:网络 嵌入式程序员应知道的0x10个基本问题 1 . 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)#define SECONDS_PER_YEAR (60 ...

  10. CSS自学笔记(13):CSS3 2D/3D转换

    CSS3中新增了对元素进行2D和3D的转换效果,这样可以是开发人员很方便的做出视觉效果更好的网页来. 通过CSS3中属性的定义,我们可以对元素进行移动.缩放.拉伸.旋转等等,可以通过定义transfo ...