ActionBar 替换3.0以前的tittle bar和menu。
目的是用来替换掉菜单按键功能,长按操作功能,提供一种全新的操作体验
ActionBar 是在Android 3.0(API 11)中加入到SK中的,想在低版本中使用ActionBar有两种选择:使用http://actionbarsherlock.com 或使用Support Library v7。
1 导入Android Support V7 library
2 将Activity 继承 ActionBarActivity
3 给Activity 设置theme,主题需要是v7下的@style/Theme.AppComp.XXX or descendant with this Activity
ActionBar的组成
1 应用的图标标题部分:包含了 图标,主标题,副标题,回退部分
2 导航模式部分:这里显示的是导航模式中的List(导航模式有三种,标准,list,tab)
3 Action button 部分: 用来响应用户的点击事件
4 溢出菜单部分:如果Action button拜访不下去了,会在此处显示
用来显示标题和回退的
// 设置actionbar的标题部分
actionBar.setTitle("主标题");
actionBar.setSubtitle("副标题");
actionBar.setDisplayShowTitleEnabled(true);// 设置菜单 标题是否可见 默认可见.
actionBar.setIcon(R.mipmap.ic_launcher);
actionBar.setDisplayShowHomeEnabled(true);// 设置应用图标是否可见 默认不可见
// logo和icon的区别: AndroidManifest 里也有
// 默认 logo优先显示于icon
actionBar.setLogo(R.mipmap.bg_photo);
actionBar.setDisplayUseLogoEnabled(true);// 设置是否显示Logo优先,也可以理解为显示logo 默认不可见
actionBar.setDisplayHomeAsUpEnabled(true);// 设置back按钮是否可见
public abstract void setNavigationMode(@NavigationMode int mode);
* @param mode The new mode to set.
* @see #NAVIGATION_MODE_STANDARD 就是没有导航
* @see #NAVIGATION_MODE_LIST
* @see #NAVIGATION_MODE_TABS
//设置actionBar的导航模式
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
List<String> al = new ArrayList<String>();
al.add("第一个导航,一进入就选中");
al.add("第二个导航");
al.add("第二个导航");
ArrayAdapter MyAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, al);
//通过搜索adapter找到
/* public abstract void setListNavigationCallbacks(SpinnerAdapter adapter, OnNavigationListener callback);
@param SpinnerAdapter是BaseAdapter的父类, 对于纯String类, 我们直接使用ArrayAdapter @param OnNavigationListener 没有实现类, 需要自己实现*/
actionBar.setListNavigationCallbacks(MyAdapter, new ActionBar.OnNavigationListener() {
@Override
public boolean onNavigationItemSelected(int itemPosition, long itemId) {
Toast.makeText(MainActivity.this, "itemPosition+" + itemPosition + ",itemId" + itemId, Toast.LENGTH_SHORT).show();
return false;//Returns True if the event was handled, false otherwise
}
});
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
ActionBar.Tab tab = null;
for (int i = 0; i < 3; i++) {
//1.创建tab
tab = actionBar.newTab();
tab.setText("tab" + i);
tab.setIcon(R.mipmap.bg_photo);
// 设置Tab的监听 Action Bar Tab must have a Callback 不写会报错
tab.setTabListener(new ActionBar.TabListener() {
@Override
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
Toast.makeText(getApplicationContext(), tab.getText() + "选中了", Toast.LENGTH_SHORT).show();//默认第一个tab选中
}
@Override
public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft) {
Toast.makeText(getApplicationContext(), tab.getText() + "取消选中了", Toast.LENGTH_SHORT).show();
}
@Override
public void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft) {
Toast.makeText(getApplicationContext(), tab.getText() + "重新选中了", Toast.LENGTH_SHORT).show();
}
});
//将tab添加到actionBar中
actionBar.addTab(tab);
}
android 5.0 ToolBar
引用ActionBar常见问题
请问,当project的minSdkVersion 和 targetSdkVersion都为10的时候,这种针对2.3.3.的工程,是否可以引用android-support-v7-appcompat这个包来使用ActionBar呢?
回复summer_yang:可以使用
回复xyz_lmn:请问在2.3.3工程中引用了android-support-v7-appcompat后,工程会报出很多类似错误如下:
G:\workspace\android-support-v7-appcompat\res\values-v14\themes_base.xml:94: error: Error: No resource found that matches the given name: attr ‘android:actionBarWidgetTheme’.
是什么导致的呢?如何修正?
回复summer_yang:修改编译用的SDK版本
AndroidActionbar标题栏ActionbarSherlock
这东西Android官方文档是有的,这里顺便说下使用ActionbarSherlock时的设置。
For Android 3.0 and higher only(对于不需要兼容2.x时可以直接如下设置)
When supporting Android 3.0 and higher only, you can define the action bar’s background like this:
res/values/themes.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- the theme applied to the application or activity -->
<style name="CustomActionBarTheme" parent="@style/Theme.Holo.Light.DarkActionBar"> <item name="android:actionBarStyle">@style/MyActionBar</item> </style>
<!-- ActionBar styles 背景主要就是这里设置了-->
<style name="MyActionBar" parent="@style/Widget.Holo.Light.ActionBar.Solid.Inverse"> <item name="android:background">@drawable/actionbar_background</item> </style>
</resources>
actionbar_background背景资源如下:
<?xml version="1.0" encoding="utf-8"?>
<color xmlns:android="http://schemas.android.com/apk/res/android" android:color="#7EC0EE">
</color>
When using the Support Library, the same theme as above must instead look like this:
res/values/themes.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- the theme applied to the application or activity -->
<style name="CustomActionBarTheme" parent="@style/Theme.AppCompat.Light.DarkActionBar"> <item name="android:actionBarStyle">@style/MyActionBar</item> <!-- Support library compatibility --> <item name="actionBarStyle">@style/MyActionBar</item> </style>
<!-- ActionBar styles -->
<style name="MyActionBar" parent="@style/Widget.AppCompat.Light.ActionBar.Solid.Inverse"> <item name="android:background">@drawable/actionbar_background</item> <!-- Support library compatibility --> <item name="background">@drawable/actionbar_background</item> </style>
</resources>
ActionbarSherlock也类似这样做,
Theme.AppCompat.Light.DarkActionBar换成Theme.Sherlock.Light;
Widget.AppCompat.Light.ActionBar.Solid.Inverse换成
Widget.Sherlock.Light.ActionBar.Solid.Inverse 就行了
很多的Android应用左上角都有返回按钮
在Android的网站上 发现了2种可以更改的方法
1.在java代码环境中设置
actionBar = getActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeAsUpIndicator(R.drawable.back);
如果有错误提示 Call requires API level 18 (current min is 14): android.app.ActionBar#setHomeAsUpIndicator
说明当前的最小API等级低于18 那么就参考第二种方法了
2.在styles.xml中新增一种style
<style name="style_titlebar_normal" parent="Theme.AppCompat.Light"> <item name="android:homeAsUpIndicator">@drawable/back</item> <!--返回icon--> </style>
然后在AndroidManifest.xml中 在其Activity 的theme中设置成该style
<activity android:name="com.logic.activity.Activity1" android:theme="@style/style_titlebar_normal" >
</activity>
这种方法对API level没有要求 就是略复杂些