实现点击实体菜单按钮显示选项菜单在actionbar 下面的思想来源
来源:互联网 发布:python前景 知乎 编辑:程序博客网 时间:2024/04/29 20:26
对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
- 实现点击实体菜单按钮显示选项菜单在actionbar 下面的思想来源
- ActionBar 显示选项菜单
- boostrap按钮式下拉菜单动态添加选项并在按钮上显示点击选项
- 【Android】actionbar显示选项菜单
- 【Android】actionbar显示选项菜单
- 对于android 实体菜单按钮处理效果 与actionbar overflow显示效果相同的代码
- 实例:ActionBar显示操作选项 以及 点击菜单显示 操作项
- 智慧北京:菜单按钮点击的实现
- ActionBar详解(二)--->使用ActionBar显示选项菜单
- ActionBar之使用ActionBar显示选项菜单项
- android学习日记:actionbar中按钮的下拉菜单实现
- Unity创建按钮点击实现菜单显示和隐藏
- 在右键点击的菜单中添加选项的方法
- ActionBar屏蔽实体菜单键
- 点击按钮,显示多条子菜单(html)
- 横向滑动菜单Tablayout,点击选项给下面的viewpager中的fragment传值
- 对上下文菜单和PopopMenu 以及在ActionBar中显示菜单项的总结
- 菜单选项按钮(1)
- 常用的webservice接口
- Web服务器父与子 Apache和Tomcat区别
- CentOS Linux防火墙配置及关闭
- 后缀树 后缀数组
- 当浮动元素和绝对定位元素是并列关系的时候,在IE6下绝对定位元素会消失
- 实现点击实体菜单按钮显示选项菜单在actionbar 下面的思想来源
- Qunit Api
- R树
- Delphi之创建组件模板(Component Template)
- 自编码器及相关变种算法简介
- 在IE6,7下,子元素有相对定位的话,父级的overflow包不住子元素
- 励志故事
- JavaSE0003_Java数据类型
- SeedCoder2014热身题4:解答