2016.12.14;
ActionBar的主要的作用就是保持整个app的页面的统一;
这里我们主要想说明一下就是如何让定制自己的ActionBar:
一般来说有两种方法:
1、通过setCustomView()来设置View来设置我们相应的ActionBar
2、通过继承系统的主题,来实现来自定义主题的形式,来实现ActionBar的定制
注意:
1、第一中方式我们需要将actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM); 设置为自定义模式,但是有一点要注意的就是,即使我们设置了自定义的模式,如果我们在ActionBar,上面如果我们设置了MenuItem的话,MenuItem是不会在我们的自定义的View里面的;
还有一点值得我们注意的就是,我们需要将title,icon,logo,homeAsUp的按钮我们需要让其隐藏,否则就会在我们的view之前显示,(当然如果有需要的话,是可以这样)
从上面的图我们可以看出来就是我们的通过setCustomView()来设置的View,即使我们在view里面的布局设置的是匹配父元素,这个view仍然不能填充满整个ActionBar这里的话,我们是解决的方案:
ActionBar.LayoutParams params = new ActionBar.LayoutParams(
ActionBar.LayoutParams.MATCH_PARENT,
ActionBar.LayoutParams.MATCH_PARENT);
actionBar.setCustomView(mView, params);
这样添加的方法就可以让我们的View填充满整个ActionBar了;
2、同样在第一种方式网上有很多人说左上角有一个左边距离,我们是没有办法消除的,这里的解决方案,比如下面:
我们给ImageView设置了一个状态选择器,但是,我们发现距离左边始终是有点距离的,我们可以将ImageView调大试一下,会发现仍然是存在这个边距的
解决方案:
在ImageView外层包裹一层LinearLayout就可以了,就会发现左边距就消失了
3、第二种方式修改样式:直接继承Theme.AppCompat.Light然后修改里面的主题的属性就可以了
<style name="ActionBarBaseTheme"parent="@style/Theme.AppCompat.Light">
//这里表示的意思就是:ActionBar下面的content内容的背景颜色
<item name="android:windowBackground">@color/window_background</item>
//这里表示就是我们点击菜单键的时候弹出的popupWindow的动画的样式,比如poputWindow里面的字体的颜色,popup背景颜色
<item name="android:popupMenuStyle">@style/PopupMenu.ListPopupWindow</item>
//这里表示ActionBar的样式,字体颜色,字体的种类,是否有icon之类的
<item name="actionBarStyle">@style/ActionBarBaseStyle</item>
//就是那三个点的样式,我们可以通过修改这个,来改变其显示
<item name="actionOverflowButtonStyle">@style/OverflowButton</item>
//menuItem的状态选择器
<item name="actionBarItemBackground">@drawable/socialize_titlebar_item_background_selector</item>
//Menu里面文字的颜色
<item name="android:actionMenuTextColor">@color/white</item>
<style>
4、上面两种方式是可以同时使用的,这样的话,我们ActionBar就会定制程度非常高;
当然在使用ActionBar的时候,有时候我们可能会发现有”三个点的图标“,在有的手机上是不会显示的,我们可以通过这样让其强制显示:
在onCreate里面调用:
private void getOverflowMenu() {
try {
ViewConfiguration config = ViewConfiguration.get(this);
Field menuKeyField = ViewConfiguration.class
.getDeclaredField("sHasPermanentMenuKey");
if (menuKeyField != null) {
menuKeyField.setAccessible(true);
menuKeyField.setBoolean(config, false);
}
} catch (Exception e) {
e.printStackTrace();
}
}
就可以让ActionBar的三个点完全显示;
安卓交流群 :232748032