Android ActionBar详解

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;
		}
	}
}


运行效果图






评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值