天天看点

自定义Actionbar的相关说明

工作中我们经常会自定义ActionBar才能满足自己的需求,这不,小编就到了该自定义actoinbar的时刻,可是在实现过程中并非一帆风顺(黑人无辜脸^-^)…… 写这篇博客就是为了记录下自己曾经遇到的坑,以便日后重蹈覆辙。

要自定义ActionBar其实是有三个思路的:

1.当前Activity的主题设置为NoTitleBar,然后将自定义的actionbar布局作为activity的布局文件中的一个普通布局即可;

2.当前Activity的主题设置为有ActionBar的模式,然后调用系统ActionBar的hide()方法隐藏起来,再将自定义的actionbar布局作为activity的布局文件中的一个普通布局即可;

3.当前Activity的主题设置为有ActionBar的模式,然后调用setCustomView(View view)api为系统的ActionBar设置一个inflate出来的自定义布局替换原来系统的actionbar布局;

因为前面2种方式比较简单,这里主要讲述第三种方法:

设置当前Activity的theme为ActionBar的NokiaAppTheme2。其中NokiaAppTheme2的parent是AppBaseTheme。(因为开发时使用的是诺基亚一款智能手机)即

<style name="NokiaAppTheme2" parent="AppBaseTheme">

</style>
           

做这个说明是为了告诉你们:这个主题是会显示系统的ActionBar的。

因为是跟短信相关的应用,因此当前的Activity命名为MessageListActivity。在MessageListActivity的onCreate()方法中调用了initActionBar():

private void initActionBar() {    
        mCustomActionBar = (ViewGroup)getLayoutInflater().inflate(
                             R.layout.layout_webview_custom_action_bar,null);
        getActionBar().setCustomView(mCustomActionBar);
        getActionBar().setDisplayShowCustomEnabled(true);
        getActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
        }
           

如果不调用getActionBar().setDisplayShowCustomEnabled(true)的显示结果为:

自定义Actionbar的相关说明

即自定义的ActionBar并没有生效。

如果不调用getActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM)显示结果为:

自定义Actionbar的相关说明

即还有一个icon显示在左边。

这时即使调用了getActionBar().setDisplayShowHomeEnabled(false)最多只能隐藏左边的icon 图标,并不能隐藏最左边黑色的那一小块:

自定义Actionbar的相关说明

因此这里一定要同时调用

getActionBar().setDisplayShowCustomEnabled(true); getActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);

这2个api才能达到最终我们要的效果:

自定义Actionbar的相关说明

此时会发现在上图的最右侧出现了2个menu的图标。这是在你的Activity的 onCreateOptionsMenu(Menu menu)方法设置了menu菜单,所以就在自定义的actionbar的右侧又显示了系统的menu菜单图标的原因了,导致画面特别尴尬@#¥¥¥¥:

自定义Actionbar的相关说明

此时将onCreateOptionsMenu(Menu menu)里面自己实现的代码删掉,直接使用父类的代码即可解决上述问题:

自定义Actionbar的相关说明