对Android开发一致性有一定考虑的程序员应当或多或少对Actionbarsherlock这个库有一定的了解。Actionbarsherlock的产生是因为Android在3.0(API 11)之后推出了actionbar功能,而对于3.0之前的系统来说,就没有actionbar支持,Actionbarsherlock主要就是为了在3.0之前的系统中也能方便地使用actionbar而产生的。

为了对之前的系统进行更好地支持,Google在也提供了类似的库android.support.v7,2013年7月有所更新,使用这个库也可以实现对API level 7到API level 11之间的系统的actionbar的支持,stackoverflow上面有专门针对它和actionbarsherlock的对比http://stackoverflow.com/questions/7844517/difference-between-actionbarsherlock-and-actionbar-compatibility,总体来看最初发布的支持情况没有actionbarsherlock那么全,不过后续随着google的更新,相应支持的功能也在增多。不过由于之前程序用的是actionbarsherlock,并且actionbarsherlock也在不断更新中,所以目前仍考虑使用actionbarsherlock,之后有时间的话会考虑一下程序中使用的功能actionbar_compat是否都有,确认都有之后可能会考虑进行切换。

  最近使用actionbarsherlock遇到问题如下:

如何在各种类型的手机的actionbarsherlock中都显示overflow menu?

具体地,对于原生的actionbar来说,有一个overflow menu,在没有手机没有硬件菜单按钮的情况下,会显示在actionbar的最右侧,点击后弹出的是在oncreateOptionMenu函数中设置的菜单内容。对于有硬件菜单按钮的情况,overflow menu就不会显示出来。对于这样一种菜单栏的设计,虽然google说是考虑了一致性之后的结果,但是我还是觉得对于用户来说,如果在不同终端中使用同一个软件显示不同的界面是一项体验不好的设计,这里也有更详细的说明,因此希望能够通过其他的办法将overfow menu在有硬件菜单栏的手机中也显示出来。

针对actionbarsherlcok,在4.1.2版本中是有forceOverflow的选项可以进行设置的,但是到了4.2.0之后就没有了。

  针对这个问题的解决办法:

  这里的两个回答分别给出了两个相应的解决办法。一个解决办法是使用4.1.2版本的actionbarsherlock,这个办法也容易想到,但是存在的问题就是没有办法随着actionbarsherlock的更新做相应的升级,从而有可能没有办法获得actionbarsherlock的新功能或者对于旧的bug的修复。一个办法是对actionbarsherlock的源码进行修改,并且在程序中强制显示overflow menu。这个办法我发现在大部分手机中都是有效的,不过会使得actionbarsherlock的库被改变,增加维护成本。并且经过测试在某些少数类型的手机中仍无法显示overflow menu。

因此便产生了使用新办法来实现overflow menu的想法。

使用dialog和菜单按钮来实现overflow menu效果

  如果将menu文件中的item属性设置为android:showAsAction="always",则该菜单条目就会作为一个单独的按钮显示在actionbar上,背景设置为overflow图片。在单击该按钮的回调函数中使用弹出dialog的方式弹出popmenu,dialog可以设置成和overflow下拉菜单效果一样,并且通过设置dialog的坐标将dialog恰好显示在界面的右上角,actionbar的下方。

1)设置菜单条目

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/more"
android:icon="@drawable/overflow"
android:showAsAction="always"
/>
</menu>

2)相应菜单点击事件

    private Dialog popupDialog;
private Boolean popupState=false;
    public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
this.finish();
return true;
case R.id.more:
if (!popupState) {
showPop();
}else {
popupDialog.dismiss();
}
default:
return super.onOptionsItemSelected(item);
}
}
    private void showPop(){
LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(ResID, null);
ListView listView = (ListView) view
.findViewById(ResID);
listView.setAdapter(yourOwnAdapter);
popupDialog = new Dialog(WifiAuthWireActivity.this);
popupDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
popupDialog.getWindow().setBackgroundDrawable(
new ColorDrawable(Color.WHITE));
popupDialog.getWindow().clearFlags(
WindowManager.LayoutParams.FLAG_DIM_BEHIND);
popupDialog.setContentView(view);
// Calculate ActionBar height
TypedValue tv = new TypedValue();
ActionBar maActionBar=getSupportActionBar();
int actionBarHeight=maActionBar.getHeight();
if (getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true))
{
actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics());
}
WindowManager.LayoutParams wmlp = popupDialog.getWindow()
.getAttributes();
wmlp.gravity = Gravity.TOP | Gravity.RIGHT;
wmlp.x+=12;
wmlp.y+=actionBarHeight;
popupDialog.getWindow().setAttributes(wmlp);
popupDialog.show();
}

参考:

设置dialog在界面的任意位置:http://stackoverflow.com/questions/15618537/how-to-put-overlay-view-over-action-bar-sherlock

获取Actionbar的高度:http://stackoverflow.com/questions/12301510/how-to-get-the-actionbar-height

查看和修该actionButtonStyle的默认风格:http://stackoverflow.com/questions/14167794/using-actionbarsherlock-without-the-default-android-theme

如何在Actionbarsherlock中一直显示overflow效果?的更多相关文章

  1. 如何在pyqt中实现win10亚克力效果

    亚克力效果的实现思路 上一篇博客<如何在pyqt中实现窗口磨砂效果> 中实现了win7中的Aero效果,但是和win10的亚克力效果相比,Aero还是差了点内味.所以今天早上又在网上搜了一 ...

  2. 【转】【已解决】Android中ActionBar中不显示overflow(就是三个点的那个按钮)--不错

    原文网址:http://www.crifan.com/android_actionbar_three_dot_overflow_not_show/ [问题] 折腾: [记录]继续尝试给Android程 ...

  3. 如何在pyqt中实现窗口磨砂效果

    磨砂效果的实现思路 这两周一直在思考怎么在pyqt上实现窗口磨砂效果,网上搜了一圈,全都是 C++ 的实现方法.正好今天查python的官方文档的时候看到了 ctypes 里面的 HWND,想想倒不如 ...

  4. 如何在pyqt中实现亚克力磨砂效果的QLabel

    前言 Windows10 在 UWP 应用中支持亚克力画刷,可以在部件的底部绘制亚克力效果的背景图.下面我们使用 QLabel 来模拟这个磨砂过程. 实现方法 MSDN 文档中介绍了亚克力材料的配方, ...

  5. 如何在pyqt中通过调用 SetWindowCompositionAttribute 实现Win10亚克力效果

    亚克力效果 在<如何在pyqt中实现窗口磨砂效果>和<如何在pyqt中实现win10亚克力效果>中,我们调用C++ dll来实现窗口效果,这种方法要求电脑上必须装有MSVC.V ...

  6. 如何在pyqt中自定义无边框窗口

    前言 之前写过很多关于无边框窗口并给窗口添加特效的博客,按照时间线罗列如下: 如何在pyqt中实现窗口磨砂效果 如何在pyqt中实现win10亚克力效果 如何在pyqt中通过调用SetWindowCo ...

  7. 如何在pyqt中实现带动画的动态QMenu

    弹出菜单的视觉效果 QLineEdit 原生的菜单弹出效果十分生硬,而且样式很丑.所以照着Groove中单行输入框弹出菜单的样式和动画效果写了一个可以实现动态变化Item的弹出菜单,根据剪贴板的内容是 ...

  8. 如何在JIRA中有效使用关注和@提及 我正在关注的问题 提及我的问题 在仪表板上显示

    如何在JIRA中有效使用关注和@提及http://bbs.51testing.com/forum.php?mod=viewthread&tid=1157043&fromuid=1530 ...

  9. 使用jQuery 中的显示与隐藏动画效果实现折叠下拉菜单的收缩和展开,在页面的列表中有若干项,列表的每项中有一个二级列表,二级列表默认为隐藏状态。点击列表的项,切换二级列表的显示或隐藏状态

    查看本章节 查看作业目录 需求说明: 使用jQuery 中的显示与隐藏动画效果实现折叠下拉菜单的收缩和展开,在页面的列表中有若干项,列表的每项中有一个二级列表,二级列表默认为隐藏状态.点击列表的项,切 ...

随机推荐

  1. Large-file-chunk-size 设置最大文件上传值

    Large-file-chunk-size: Stsadm property (Office SharePoint Server) SharePoint 2007   0 out of 1 rated ...

  2. java使用动态代理来实现AOP(日志记录)

    以下内容为原创,转载时请注明链接地址:http://www.cnblogs.com/tiantianbyconan/p/3336627.html AOP(面向方面)的思想,就是把项目共同的那部分功能分 ...

  3. HandlerThread

    一.概念     1.Android中Handler的使用,一般都在UI主线程中执行,因此在Handler接收消息后,处理消息时,不能做一些很耗时的操作,否则将出现ANR错误. 2.HandlerTh ...

  4. UITableView详细注释

    style //普通 UITableViewStylePlain, //分组 UITableViewStyleGrouped //表格视图 UITableView * tableView = [[UI ...

  5. Nodejs的模块实现

    在Node中引入模块,需要经历如下3个步骤:(1)路径分析(2)文件定位(3)编译执行 Node中模块分为两类: 一是Node提供的模块——核心模块.这部分在Node源代码的编译过程中,编译进了二进制 ...

  6. JavaScript Patterns 6.7 Borrowing Methods

    Scenario You want to use just the methods you like, without inheriting all the other methods that yo ...

  7. 十五天精通WCF——第四天 你一定要明白的通信单元Message

    转眼你已经学了三天的wcf了,是不是很好奇wcf在传输层上面到底传递的是个什么鸟毛东西呢???应该有人知道是soap,那soap这叼毛长得是什么 样呢?这一篇我们来揭开答案... 一:soap到底长成 ...

  8. pom.xml 样例

    <project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven ...

  9. java的finalize()函数

    在说明finalize()的用法之前要树立有关于java垃圾回收器几个观点: "对象可以不被垃圾回收" : java的垃圾回收遵循一个特点, 就是能不回收就不会回收.只要程序的内存 ...

  10. 多元线性回归 ——模型、估计、检验与预测

    一.模型假设 传统多元线性回归模型 最重要的假设的原理为: 1. 自变量和因变量之间存在多元线性关系,因变量y能够被x1,x2-.x{k}完全地线性解释:2.不能被解释的部分则为纯粹的无法观测到的误差 ...