ActionBar(活动栏)替代了显示在屏幕顶端的标题栏。主要负责显示菜单,widget,导航等功能,主要包括:
- 显示选项菜单中的菜单项到活动栏;
- 添加可交互的视图到活动栏作为活动视图;
- 使用应用的图标作为活动项,代表返回home或者向上等重要操作;
- 提供标签导航,方便不同的Fragment之间切换;
- 提供下拉导航功能。
一、添加Option Menu到活动栏
1、利用menu目录下的xml布局文件
1.1、xml布局文件:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/action_search"
android:actionViewClass="android.widget.SearchView"
android:icon="@android:drawable/ic_menu_search"
android:showAsAction="ifRoom"
android:title="@string/menu_search"/>
<item
android:id="@+id/menu_edit"
android:icon="@android:drawable/ic_menu_edit"
android:showAsAction="ifRoom"
android:title="@string/menu_edit"/>
<item
android:id="@+id/menu_save"
android:icon="@android:drawable/ic_menu_save"
android:showAsAction="ifRoom"
android:title="@string/menu_save"/>
<item
android:id="@+id/menu_delete"
android:icon="@android:drawable/ic_menu_delete"
android:showAsAction="ifRoom"
android:title="@string/menu_delete"/>
<item
android:id="@+id/action_share"
android:icon="@android:drawable/ic_menu_share"
android:showAsAction="ifRoom"
android:title="@string/menu_share"/>
</menu>
1.2、在Activity或Fragment的onCreateOptionsMenu里进行填充
public class MenuNavActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.menu_layout);
ActionBar mActionBar = getActionBar();
// 将 Home 按钮显示为向上, 提示用户点击这个按钮可以返回应用程序的上一级。
mActionBar.setDisplayHomeAsUpEnabled(true);
}
/**
* 利用xml布局文件
*/
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.opt_menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
// app icon in action bar clicked; go home
Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
return true;
default:
return super.onOptionsItemSelected(item);
}
}
}
2、直接在Activity或Fragment的onCreateOptionsMenu里实现
public class MenuNavActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.menu_layout);
ActionBar mActionBar = getActionBar();
// 将 Home 按钮显示为向上, 提示用户点击这个按钮可以返回应用程序的上一级。
mActionBar.setDisplayHomeAsUpEnabled(true);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuItem actionItem = menu.add("Edit");
actionItem.setIcon(android.R.drawable.ic_menu_edit);
actionItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
MenuItem actionItem2 = menu.add("Delete");
actionItem2.setIcon(android.R.drawable.ic_menu_delete);
actionItem2.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
// app icon in action bar clicked; go home
Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
return true;
default:
return super.onOptionsItemSelected(item);
}
}
}
二、提供导航标签
TabNavActivity.java
public class TabNavActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.tab_layout);
// 设置 ActionBar
ActionBar mActionBar = getActionBar();
// 将 Home 设置为向上
mActionBar.setDisplayHomeAsUpEnabled(true);
// 设置 ActionBar 的导航模式为TAB
mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
mActionBar.setDisplayOptions(0,ActionBar.DISPLAY_SHOW_TITLE);
Tab t1 = mActionBar.newTab();
t1.setText("首页ABC");
t1.setTabListener(new MyTabListener<HomeFragment>(this, "home", HomeFragment.class));
mActionBar.addTab(t1);
Tab t2 = mActionBar.newTab();
t2.setText("好友ABC");
t2.setTabListener(new MyTabListener<FriendFragment>(this, "friend", FriendFragment.class));
mActionBar.addTab(t2);
Tab t3 = mActionBar.newTab();
t3.setText("消息ABC");
t3.setTabListener(new MyTabListener<MessageFragment>(this, "message", MessageFragment.class));
mActionBar.addTab(t3);
Tab t4 = mActionBar.newTab();
t4.setText("设置ABC");
t4.setTabListener(new MyTabListener<SettingFragment>(this, "setting", SettingFragment.class));
mActionBar.addTab(t4);
if (savedInstanceState != null) { //默认打开上次推出时候的Fragment
mActionBar.setSelectedNavigationItem(savedInstanceState.getInt("tab", 0));
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt("tab", getActionBar().getSelectedNavigationIndex());
}
public static class MyTabListener<T extends Fragment> implements ActionBar.TabListener {
private final Activity mActivity;
private final String mTag;
private final Class<T> mClass;
private final Bundle mArgs;
private Fragment mFragment;
public MyTabListener(Activity activity, String tag, Class<T> clz) {
this(activity, tag, clz, null);
}
public MyTabListener(Activity activity, String tag, Class<T> clz, Bundle args) {
mActivity = activity;
mTag = tag;
mClass = clz;
mArgs = args;
// Check to see if we already have a fragment for this tab, probably
// from a previously saved state. If so, deactivate it, because our
// initial state is that a tab isn't shown.
mFragment = mActivity.getFragmentManager().findFragmentByTag(mTag);
if (mFragment != null && !mFragment.isDetached()) {
FragmentTransaction ft = mActivity.getFragmentManager().beginTransaction();
ft.detach(mFragment);
ft.commit();
}
}
public void onTabSelected(Tab tab, FragmentTransaction ft) {
if (mFragment == null) {
mFragment = Fragment.instantiate(mActivity, mClass.getName(), mArgs);
ft.add(R.id.ll_content, mFragment, mTag);
} else {
ft.attach(mFragment);
}
}
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
if (mFragment != null) {
ft.detach(mFragment);
}
}
public void onTabReselected(Tab tab, FragmentTransaction ft) {
Toast.makeText(mActivity, "onTabReselected", 0).show();
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
// app icon in action bar clicked; go home
Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
return true;
default:
return super.onOptionsItemSelected(item);
}
}
}
HomeFragment.java
public class HomeFragment extends Fragment implements OnQueryTextListener {
private static final String TAG = null;
@Override
public void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.home, null);
return view;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
// We have a menu item to show in action bar.
setHasOptionsMenu(true);
super.onActivityCreated(savedInstanceState);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
// Place an action bar item for searching.
MenuItem item = menu.add("Search");
item.setIcon(android.R.drawable.ic_menu_search);
item.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
SearchView sv = new SearchView(getActivity());
sv.setOnQueryTextListener(this);
item.setActionView(sv);
}
@Override
public void onPause() {
// TODO Auto-generated method stub
super.onPause();
}
@Override
public boolean onQueryTextChange(String newText) {
Log.e(TAG, "newText="+newText);
return true;
}
@Override
public boolean onQueryTextSubmit(String query) {
Log.e(TAG, "newText="+query);
return true;
}
}
余下Fragment类似
运行效果图
三、提供向上导航
使用应用的图标作为活动项,代表返回home或者向上等重要操作。
package com.yulore.nav;
import android.app.ActionBar;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.MenuItem;
public class NavUpActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.nav_up_layout);
ActionBar mActionBar = getActionBar();
// 将 Home 按钮显示为向上, 提示用户点击这个按钮可以返回应用程序的上一级。
mActionBar.setDisplayHomeAsUpEnabled(true);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
// app icon in action bar clicked; go home
Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
return true;
default:
return super.onOptionsItemSelected(item);
}
}
}
运行效果图
四、提供下拉导航功能
package com.yulore.nav;
import android.app.ActionBar;
import android.app.ActionBar.OnNavigationListener;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.MenuItem;
import android.widget.ArrayAdapter;
import android.widget.Toast;
/**
* 下拉列表导航
* @author feng bingbing
*
*/
public class SpinnerNavActivity extends Activity {
private String[] titles = { "首页", "好友", "消息", "广场", "设置" };
private ArrayAdapter<String> adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.spin_layout);
// 设置 ActionBar
ActionBar mActionBar = getActionBar();
// 将 Home 设置为向上
mActionBar.setDisplayHomeAsUpEnabled(true);
// 设置 ActionBar 的导航模式为下拉列表
mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
// 第二步:为下拉列表定义一个适配器
adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_item, titles);
// 第三步:为适配器设置下拉列表下拉时的菜单样式。
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
// 选中的事件监听
OnNavigationListener callback = new MyOnNavigationListener();
// 设置列表导航的回调参数
mActionBar.setListNavigationCallbacks(adapter, callback);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
// app icon in action bar clicked; go home
Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
return true;
default:
return super.onOptionsItemSelected(item);
}
}
private class MyOnNavigationListener implements OnNavigationListener {
@Override
public boolean onNavigationItemSelected(int itemPosition, long itemId) {
Toast.makeText(getApplicationContext(),
"当前选择了:" + titles[itemPosition], 0).show();
return false;
}
}
}
运行效果图