android2.x使用ActionBar的总结

好久没有在csdn上写博客了,最近闲来无事,决定仿微信界面做几个东西,原本以为挺简单的事情,结果折腾了好久才把第一步的ActionBar搞定,其中过程可谓坎坷之极,记录下来,以便给各位分享。

首先介绍一下我的手机,我的手机是android2.3.4的系统,要使用ActionBar,有两种选择,一个是使用大名鼎鼎的开源组件:ActionBarSherlock;一个是使用google自己出的android-support-v7包;ActionBarSherlock自从google推出android-support-v7包以后,基本上要退出历史舞台了,因此我决定使用android-support-v7一试。

首先下载android-support-v7-appcompat(包括jar包和资源项目),新建项目weixin(注意最低sdk版本要求),引入android-support-v7-appcompat.jar(把该jar包放到lib目录下,刷新工程),并把android-support-v7-appcompat资源项目作为类库引入到项目中,项目结果如下

新建MainActivity,继承类android.support.v7.app.ActionBarActivity,代码如下:

package com.example.weixin;import android.os.Bundle;import android.support.v7.app.ActionBarActivity;import android.view.Menu;public class MainActivity extends ActionBarActivity{@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.main, menu);return true;}}修改res\values\styles.xml,使用androi-support-v7的Theme.AppCompat.Light.DarkActionBar风格,如下<resources><!–Base application theme, dependent on API level. This theme is replacedby AppBaseTheme from res/values-vXX/styles.xml on newer devices.–><style name="AppBaseTheme" parent="Theme.AppCompat.Light.DarkActionBar"</span>><!–Theme customizations available in newer API levels can go inres/values-vXX/styles.xml, while customizations related tobackward-compatibility can go here.–></style><!– Application theme. –><style name="AppTheme" parent="AppBaseTheme"><!– All customizations that are NOT specific to a particular API-level can go here. –></style></resources>修改res\menu\main.xml,如下:<menu xmlns:android=""xmlns:alpha=""><!–android.widget.SearchView在api11之前不存在,需要使用 android.support.v7.widget.SearchView–><itemandroid:id="@+id/action_search"alpha:actionViewClass="android.support.v7.widget.SearchView"android:actionProviderClass=""android:icon="@drawable/actionbar_search_icon"alpha:showAsAction="ifRoom|collapseActionView"android:title="@string/action_search"/><itemandroid:id="@+id/action_groupchat"android:icon="@drawable/ofm_group_chat_icon"alpha:showAsAction="never"android:title="@string/action_groupchat"/><itemandroid:id="@+id/action_addfriend"android:icon="@drawable/ofm_add_icon"alpha:showAsAction="never"android:title="@string/action_addfriend"/><itemandroid:id="@+id/action_scanqrcode"android:icon="@drawable/ofm_qrcode_icon"alpha:showAsAction="never"android:title="@string/action_scanqrcode"/><itemandroid:id="@+id/action_feedback"android:icon="@drawable/ofm_feedback_icon"alpha:showAsAction="never"android:title="@string/action_feedback"/></menu>

解析一下,由于android3.0之前,并没有showAsAction、actionProviderClass和actionViewClass等属性,因此需要引入命名空间:xmlns:xxx="",使用android-support-v7-appcompat包的属性,因此后面的menuitem的统一使用xxx:showAsAction、xxx:actionProviderClass和xxx:actionViewClass而不是android:showAsAction、android:actionProviderClass和android:actionViewClass;另外搜索按钮的actionViewClass,在android3.0以后可以使用android.widget.SearchView,但在android3.0之前该类并不存在,需要使用android.support.v7.widget.SearchView

经过这样设置以后,按理来说就应该可以了,我们在android2.3环境下运行试试

android2.3运行效果:

发现ActionBar没有overflow按钮,点击物理menu键在下面出现了上下文菜单,这并不是我们想要的效果,查看android doc可知,overflow按钮的显示情况和手机的硬件情况是有关系的,如果手机没有物理Menu键的话,overflow按钮就可以显示,如果有物理Menu键的话,overflow按钮就不会显示出来,要改变这个默认行为,在ViewConfiguration这个类中,有一个叫做sHasPermanentMenuKey的静态变量,系统就是根据这个变量的值来判断手机有没有物理Menu键的。当然这是一个内部变量,我们无法直接访问它,但是可以通过反射的方式修改它的值,让它永远为false就可以了。在MainActivity中增加方法

private void setOverflowShowingAlway(){try{ViewConfiguration config = ViewConfiguration.get(this);Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey");menuKeyField.setAccessible(true);menuKeyField.setBoolean(config, false);}catch(Exception e){e.printStackTrace();}}并在onCreate(Bundle savedInstanceState)方法中调用@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);setOverflowShowingAlway();}重新运行,发现在android4.0环境下,出现了overflow按钮了,并且按物理menu键也显示正常,只是显示的菜单中只有文字,而没有显示图标,这是官方的默认效果,Google认为隐藏在overflow中的Action按钮都应该只显示文字,其实,overflow中的Action按钮应不应该显示图标,是由MenuBuilder这个类的setOptionalIconsVisible方法来决定的,如果我们在overflow被展开的时候给这个方法传入true,那么里面的每一个Action按钮对应的图标就都会显示出来了,继续在MainActivity中增加方法 private void setOptionalIconsVisible(Menu menu){if(menu == null) return;if(!menu.getClass().getSimpleName().equals("MenuBuilder")) return;try {Method m = menu.getClass().getDeclaredMethod("setOptionalIconsVisible", Boolean.TYPE);m.setAccessible(true);m.invoke(menu, true);} catch (Exception e) {} }@Overridepublic boolean onMenuOpened(int featureId, Menu menu) {if(featureId == Window.FEATURE_ACTION_BAR){setOptionalIconsVisible(menu);}return super.onMenuOpened(featureId, menu); }

重新运行,发现android4.0环境下已经运行正常了,运行效果如下:

现在睡觉的话,会做梦;而现在学习的话,会让梦实现。

android2.x使用ActionBar的总结

相关文章:

你感兴趣的文章:

标签云: