对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. Understanding the Uncertain Geographic Context Problem

    "The areal units (zonal objects) used in many geographical studies are arbitrary, modifiable, a ...

  2. spring理解

    Struts与Hibernate可以做什么事? Struts,Mvc中控制层解决方案,可以进行请求数据自动封装.类型转换.文件上传.效验… Hibernate,持久层的解决方案:可以做到,把对象保存到 ...

  3. 退出多个activity的方法

    1.使用List集合方式 用list保存activity实例,然后逐一干掉 import java.util.LinkedList; import java.util.List; import and ...

  4. Android-Using DDMS

    原文:http://developer.android.com/tools/debugging/ddms.html#how-ddms-works Android提供了一个debug工具叫做:DDMS, ...

  5. DropDownList 添加一个"请选择"或"全部"之类的项

    DropDownList在从数据库中得到数据源绑定后,添加一个"请选择"或"全部"之类的项 1:直接添加:<asp:ListItem Value=&quo ...

  6. Phonegap之ios对iPhone6和Plus的闪屏适配 -- xmTan

    故事的发生起于,由于老板强烈要求app在iPhone6和5有一样的工具栏,然后前端妹子用@media为iPhone6和Plus做了样式适配.然后问题来了,竟然奇葩的发现@media样式只对iPhone ...

  7. iOS设置文字过长时的显示格式

    以label为例: //设置文字过长时的显示格式 aLabel.lineBreakMode = UILineBreakModeMiddleTruncation; //截去中间 aLabel.lineB ...

  8. Android 常用数据适配器ArrayAdapter

    接着上篇文章<Android 采用Layout Inflater创建一个View对象>,本文采用常用数据适配器ArrayAdapter 新建项目后,在layout文件夹下新建list_it ...

  9. nav布局 在线演示 DIVCSS5

    <!doctype html> nav布局 在线演示 DIVCSS5 传统 div ul li布局导航条效果 网站首页 HTML教程 HTML入门 HTML5教程 CSS教程 CSS入门 ...

  10. Entity Framework在Asp.net MVC中的实现One Context Per Request(附源码)

    上篇中"Entity Framework中的Identity map和Unit of Work模式", 由于EF中的Identity map和Unit of Work模式,EF体现 ...