在虚拟机上我可以用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. 安装Discuz!论坛时提示“mysqli_connect() 不支持 advice_mysqli_connect”

    安装Discuz!论坛时提示“不支持Mysql数据库,无法安装论坛”的解决方法1,在系统的 system32(C:\windows\system32)目录下缺少libmysql.dll文件,解决方法是 ...

  2. 关于Oracle数据库字符集的选择

    如果数据库只在中国地区使用,数据库字符集选择ZHS16GBK或者常用中文字符集,如果不确定,就推荐使用AL32UTF8 国家字符集就选择: AL16UTF16 字符集一旦设定,不允许修改,修改可能出现 ...

  3. 通过WebService跨平台上传大文件到服务器

    好长时间没写博客了,对最近工作中遇到的大文件上传和下载的代码贴出来和大家分享一下. 大文件的上传的和下载是C++的平台通过调用WebService实现文件上传和下载到服务器 /// <summa ...

  4. C# @字符用法

    1.用 @ 符号加在字符串前面表示其中的转义字符“不”被处理. 如果我们写一个文件的路径,例如"D:/文本文件"路径下的text.txt文件,不加@符号的话写法如下: string ...

  5. 对 PInvoke 函数“WinVideo!WinVideo.webcam::SendMessage”的调用导致堆栈不对称

    从.NET1.1升级到.NET2.0时出现的PInvokeStackImbalance错误微软官方的解释 (http://msdn2.microsoft.com/zh-cn/library/0htdy ...

  6. HTML3层叠样式表

    层叠样式表:CSS Cascading Style Sheet.V2.1  控制页面样式外观.   一.样式表分三类: 1.内联样式表.--放在元素的开始标记中.--只对当前元素起作用. <in ...

  7. 关闭编译器FPO优化

    // The release libs don't include FPO debug information, so FPO// optimization will interfere with s ...

  8. MySql 优化 网上资料

    1.选取最适用的字段属性 MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快.因此,在创建表的时候,为了获得更好的性能,我们可以将表中字段的宽度设得尽 ...

  9. Linux的用户和用户组管理

      Linux是个多用户多任务的分时操作系统,所有一个要使用系统资源的用户都必须先向系统管理员申请一个账号,然后以这个账号的身份进入系统.用户的账号一方面能帮助系统管理员对使用系统的用户进行跟踪,并控 ...

  10. USB 3.1 Type-C

    [時報記者任珮云台北報導]微軟.英特爾.蘋果今年將新款PC介面升級至USB 3.1規格,Wintel陣營今年新款PC產品亦將全面採用USB 3.1介面,里昂證出具最新的報告指出,在新趨勢帶動下,台廠的 ...