对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. [Android]基于RxJava、RxAndroid的EventBus实现

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4578699.html  Github:https://gith ...

  2. git 删除远程源,新增加源

    git remote remove origin git remote add origin git@XXXX

  3. mysql innodb 奔溃问题

    ps -A | grep -i mysql kill 列出来的进程 service mysql start 我的问题就解决了 ------------------------------------- ...

  4. iOS解析数据时Error=3840

    1.解析JSon数据格式出错的问题 unescaped control character around character XXXX 和 The data couldn’t be read beca ...

  5. UI控件(复习一下)

    如何修改控件状态• 可见,确实需要经常修改控件状态• 那如何去修改控件的状态呢?方法很简单➢ 每一个UI控件都是一个对象➢ 修改UI控件的状态,其实就是修改控件对象的属性➢ 比如修改UILabel显示 ...

  6. .Net魔法堂:提取注释生成API文档

    一.前言 在多人协作的项目中,除了良好的代码规范外,完整的API文档也相当重要.通过文档我们快速了解系统各模块的实际接口,及其使用场景.使用示例,一定程度上降低沟通成本,和减少后期维护中知识遗失等风险 ...

  7. ArrayList

    各种原因,前两年做C语言去了,现在重新做JAVA, 感觉自己基础很不扎实,要好好学习啦, 先从简单的开始~ 以下内容基于jdk1.7.0_79源码: 什么是ArrayList 可以简单的认为是一个动态 ...

  8. 软件工程(C编码实践)学习总结及心得

    徐礼超  原创作品转载请注明出处:http://www.cnblogs.com/xulichao <软件工程(C编码实践篇)>MOOC课程http://mooc.study.163.com ...

  9. NuGet学习笔记3——搭建属于自己的NuGet服务器

    文章导读 创建NuGetServer Web站点 发布站点到IIS 添加本地站点到包包数据源 在上一篇NuGet学习笔记(2) 使用图形化界面打包自己的类库 中讲解了如何打包自己的类库,接下来进行最重 ...

  10. SQL Server(一)——数据库基础知识

    SQL:Structured Quety Language SQL SERVER是一个以客户/服务器(c/s)模式访问.使用Transact-SQL语言的关系型数据库管理子系统(RDBMS) DBMS ...