对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. mac(linux) 上如何安装ant

    1.从http://ant.apache.org/srcdownload.cgi下载ant (用ant src编译后装) 2.解压下载下来的内容到一个文件夹,打开终端先进入到刚才解压后的文件夹如:cd ...

  2. iOS通讯录开发

    场景一:直接选择一个联系人的电话号码 这里不需要先获取所有的联系人自己做联系人列表,直接使用系统自带的AddressBookUI/ABPeoplePickerNavigationController. ...

  3. WPF学习之路(十二)控件(Content控件)

    Label Label相比TextBlock功能并不强大,但是支持键盘快捷键的方式获得焦点 <StackPanel> <Label Target="{Binding Ele ...

  4. CocoaPods安装以及相关问题解决

    Mac OS X上安装 Ruby环境 安装RVM $ curl -L https://get.rvm.io | bash -s stable 关闭终端,新开另外一个终端(新打开的终端会自动载入RVM环 ...

  5. Java成员的访问权限控制

    Java中的访问权限控制包含两个部分: 类的访问权限控制 类成员的访问权限控制 对类来说,访问权限控制修饰符可以是public或者无修饰符(默认的包访问权限): 对于类成员来说,访问权限控制修饰符可以 ...

  6. 每日Scrum(4)

    今天是冲刺第4天,小组也没有做什么,大家都忙着找大二的学弟学妹来点评来支持我们的软件. 遇到的问题主要是如何劝说学弟学妹选择我们的软件然后继续往下做.

  7. Tomcat指定特定JDK版本

    我们知道在Linux服务器上,可以安装多个版本的JDK,那么当有多个JDK时,是否可以为Tomcat这类应用程序指定对应的JDK版本呢?答案是可以,指定tomcat使用特定的JDK版本.今天正好碰到这 ...

  8. Composer管理PHP包

    安装 Composer包含两大逻辑部分:一个是用来存储包,另一个是命令行应用程序,帮助你发现.下载.更新和分享代码. $ cd/path/to/my/project $ curl -s http:// ...

  9. 【密码】Oracle用户密码系列

    [密码]Oracle用户密码系列 1.1  BLOG文档结构图 1.2  前言部分 1.2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识, ...

  10. SQL Server 分隔字符串函数实现

    在SQL Server中有时候也会遇到字符串进行分隔的需求.平时工作中常常遇到这样的需求,例如:人员数据表和人员爱好数据表,一条人员记录可以多多人员爱好记录,而往往人员和人员爱好在界面展示层要一并提交 ...