ActionBar活动条。位于传统标题栏的位置,也就是显示的屏幕的顶部。ActionBar可显示应用程序的图标和Activity标题。ActionBar的右边还可以显示活动项。

ActionBar提供了如下功能:

a显示选项菜单的菜单项(将菜单项显示成Action Item)。

b使用程序图标作为返回Home主屏或向上的导航操作。

c提供交互式View作为Action View.

d提供基于Tab的导航方式,可用户切换多个Fragment。

e提供基于下拉的导航方式。

1.启动ActionBar

Manifest.xml文件中,通过设置应用程序或者某个Activity的主题Theme来启用或者关闭ActionBar。或者Application的主题Theme

例如:

<application   
......
android:theme=”@android:style/Theme.Holo.NoActionBar”   //表示关闭ActionBar功能,一旦关闭,该Android应用中将不能使用ActionBar
......
>
</application>




使用代码来控制ActionBar的显示、隐藏。

show()  :显示ActionBar.

hide() :隐藏ActionBar

在Activity中通过调用getActionBar()方法获得ActionBar对象 

AtionBar actionBar = getActionBar();

2.使用ActionBar显示选项菜单

ActionBar可以将选项菜单显示成ActionItem

setShowAsAction(int actionEnum) : 设置是否将该菜单项显示在ActionBar上作为ActionItem

actionEnum可取的参数值:

SHOW_AS_ACTION_ALWAYS:总是将该MenuItem显示在ActionBar上.(v7包)(其他包下使用always)

SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW:将ActionView折叠成普通菜单项。(v7包)(其他包中使用collapse)

SHOW_AS_ACTION_IF_ROOM:当ActionBar位置足够时才显示MenuItem(v7包)(其他包使用ifRoom)

SHOW_AS_ACTION_NEVER:不将该MenuItem显示在ActionBar上(v7包)(其他包使用never)

SHOW_AS_ACTION_WITH_TEXT:将该MenuItem显示在ActionBar上,并显示菜单项的文本。(v7包)(其他包使用withText)

在菜单中menu.xml文件中<item./>标签中添加android:showAsAction属性

点击事件

onOptionsItemSelected(MenuItem item){
//利用switch分支处理每个item的点击事件
switch(item.getId()){
case R.id.item_1:  
 
......
break;
 
case R.id.item_2:
 
......
break;
 
case R.id.item_3:
 
......
break;
 
}
}







3.设置图标导航

为了将应用程序图标转变成可以点击的图标,可以调用ActionBar的一些方法:

setDisplayHomeAsUpEnabled(boolean showHomeAsUp) :设置是否将应用程序图标转变成可点击的图标,并在图标上添加一个向左的箭头。

setDisplayOptions(int options):通过传入int类型常量来控制该ActionBar的显示选项。

setDisplayShowHomeEnabled(boolean showHome):设置是否显示应用程序的图标。

setHomeButtonEnabled(boolean enabled): 设置是否将应用程序图标转变成可点击的按钮。

4.在ActionBar中添加ActionView 视图 有两种方式 

定义Action Item时使用android:actionViewClass属性指定ActionView的实现类,给定实现类的全路径,包名+类名。

定义Action Item时使用android:actionLayout属性指定Action View对应的视图资源。

在代码中处理ActionBar:找到ActionView 

通过MenuItem item = menu.findItem(int resId)。  //得到菜单项。。。

‚通过 item.getActionView();获得ActionView

可以对ActionView设置各种点击事件。

还可以设置ActionView的展开折叠监听事件。  

两种方式:  

I为每个Item设置监听器 

menuItem.setOnActionExpandListener(new OnActionExpandListener() {
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
// TODO Auto-generated method stub
Toast.makeText(getApplicationContext(), "Expand", Toast.LENGTH_SHORT).show();
return true;  //返回值必须为true
}
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
// TODO Auto-generated method stub
Toast.makeText(getApplicationContext(), "Collapse", Toast.LENGTH_SHORT).show();
return true;	//返回值必须为true
}
});




II通过其他按钮点击事件来控制他的折叠与展开

public void onExpandClick(View v){
menu.findItem(R.id.progress).expandActionView();
}
public void onCollpseClick(View v){
menu.findItem(R.id.progress).collapseActionView();
}

5.使用ActionBar实现Tab导航

ActionBar在顶端生成多个Tab标签,当用户点击某个Tab标签时,系统根据用户点击事件导航指定Tab页面。

调用ActionBar的setNavigationMode(ActionBar.NAVIGATION_MODE_TABS)方法设置使用Tab导航方式。

‚调用ActionBar的addTab()方法添加多个Tab标签,并未每个Tab标签添加点击事件监听器。

一般使用:Tab导航加Fragment碎片

主Activity:TabMainActivity.java

import android.app.ActionBar;
import android.app.ActionBar.Tab;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.util.Log;
 
public class TabMainActivity extends Activity implements ActionBar.TabListener {
private static final String TAG = "TabMainActivity";
private static final String SELECTED_ITEM = "selected_item";
 
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tab_main);
Log.i(TAG, "onCreate()");
final ActionBar actionBar = getActionBar();
// 设置ActionBar的导航方式:Tab导航
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
// 依次添加三个Tab页,并为三个Tab标签添加事件监听器
actionBar
.addTab(actionBar.newTab().setText("第一页").setTabListener(this));
actionBar
.addTab(actionBar.newTab().setText("第二页").setTabListener(this));
actionBar
.addTab(actionBar.newTab().setText("第三页").setTabListener(this));
 
}
 
@Override
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();
Log.i(TAG, "onStart()");
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
Log.i(TAG, "onDestroy()");
}
@Override
protected void onRestart() {
// TODO Auto-generated method stub
super.onRestart();
Log.i(TAG, "onRestart()");
}
 
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
Log.i(TAG, "onResume");
}
 
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
Log.i(TAG, "onPause()");
}
 
@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
Log.i(TAG, "onStop()");
}
 
// onPause() onStop()之间调用  切换屏幕方向时
@Override
protected void onSaveInstanceState(Bundle outState) {
// TODO Auto-generated method stub
super.onSaveInstanceState(outState);
// 将当前选中的Fragment页的索引值保存在Bundle中
outState.putInt(SELECTED_ITEM, getActionBar()
.getSelectedNavigationIndex());
Log.i(TAG, "onSaveInstanceState()");
}
 
// onStart() onResume() 之间调用 屏幕方向稳定时
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onRestoreInstanceState(savedInstanceState);
if (savedInstanceState.containsKey(SELECTED_ITEM)) {
// 选中前面保存的索引对应的Fragment页面
getActionBar().setSelectedNavigationItem(savedInstanceState
.getInt(SELECTED_ITEM));
Log.i(TAG, "onRestoreInstanceState()");
}
}
 
// 指定Tab被选中时激发此方法
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
// TODO Auto-generated method stub
Log.i(TAG, "onTabSelected()");
// 创建一个新的Fragment对象
Fragment fragment = new TabFragment();
// 创建一个Bundle对象,用于向Fragment传入参数
Bundle args = new Bundle();
args.putInt(TabFragment.ARG_SECTION_NUMBER, tab.getPosition() + 1);
// 向fragment传入参数
fragment.setArguments(args);
// 获取FragmentTransaction对象
// ft = getFragmentManager().beginTransaction(); 方法提供一个ft对象,没必要再进行实例化
// 使用fragment代替该Activity中的container组件
ft.replace(R.id.container, fragment);
// 提交事物
//ft.commit();
}
 
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
Log.i(TAG, "onTabUnselected()");
}
 
@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
// TODO Auto-generated method stub
Log.i(TAG, "onTabReselected()");
}
 
}




布局文件:不需要布局文件,因为不在Activity内部。

Fragment处理:

import android.app.Fragment;
import android.os.Bundle;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
 
public class TabFragment extends Fragment {
public static final String ARG_SECTION_NUMBER = "section_number";
//该方法的返回值就是该Fragment显示的View组件
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
TextView textView = new TextView(getActivity());
textView.setGravity(Gravity.START);
//获取创建该Fragment时传入的参数Bundle
Bundle args = getArguments();
//设置TextView显示的文本
textView.setText(args.getInt(ARG_SECTION_NUMBER)+"");
textView.setTextSize(30);
return textView;
}
}




6.自定义ActionBar

在Menu/menu.xml布局文件中

<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<!--actionProviderClass指定ActionProvider实现类全路径-->
    <item
        android:id="@+id/action_custom"
        android:orderInCategory="100"
        android:showAsAction="ifRoom"
android:actionProviderClass="com.example.androidday26_actionprovidercustom.MyActionProvider"
    android:title="自定义ActionProvider"/>
 
</menu>

自定义类MyActionProvider继承ActionProvider:  使用自定义布局action_provider_layout.xml文件

import android.content.Context;
import android.view.ActionProvider;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
import android.widget.Toast;
import com.example.androidday26_actionprovidercustom.R;
public class MyActionProvider extends ActionProvider {
private Context mContext;
public MyActionProvider(Context context) {
super(context);
// TODO Auto-generated constructor stub
mContext = context;
}
 
@Override
public View onCreateActionView() {
// TODO Auto-generated method stub
//加载视图
View view = LayoutInflater.from(mContext).inflate(R.layout.action_provider_layout, null);
ImageButton ibtn = (ImageButton) view.findViewById(R.id.icon);
//设置按钮的点击事件
ibtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Toast.makeText(mContext, "人生得意须尽欢", Toast.LENGTH_SHORT).show();
}
});
//记得返回视图view
return view;
}
}
action_provider_layout.xml布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <ImageButton 
        android:id="@+id/icon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_launcher"
        android:background="@android:color/transparent"
        />
</LinearLayout>