ActionBar

                               本文参考 Android Developers和网上同学的一些技术博客,总结成符合自己学习的思路。


Action Bar

应用程序只支持Android的3.0或更高版本 。如果支持的API级别低于11:                        接口android.support.v7.app.ActionBar
                                                                            如果只支持API级别11和更高版本:             接口android.app.ActionBar

包含4个部分如下所示:

           

1. 应用图标    提供给你的应用程序的身份和表明在应用程序的用户的位置的专用空间。
2. 视图控制    支持应用程序内一致的导航和视图切换,切换的控件有 下拉式菜单选项卡控件
3.操 作按钮    使得重要的行动和突出的访问可预测的方式(如搜索)。
4.操 作溢出   多项动作可以在这个功能模块中查看

当我们布局的时候可以考虑拆分Action Bar



当分割跨多个动作条的内容,您通常有动作条内容三个可能的位置:
1. Main action bar
2. Top bar
3. Bottom bar

图标数目布局建议


smaller than 360 dp = 2 icons
360-499 dp = 3 icons
500-599 dp = 4 icons
600 dp and larger = 5 icons

上下文Action Bars




详细地址请看:、、、、、、

添加/隐藏ActionBar的方法

	
		/**
		 * 添加ActionBar的方法   隐藏的为
		 * 	actionBar.hide();
		 * ***/
		ActionBar actionBar=getActionBar();
		actionBar.show();

添加ActionBar 的Item

在menu文件夹下添加main.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android" >


    <item
        android:id="@+id/action_search"
        android:actionLayout="@layout/collapsibleview"
        android:icon="@drawable/ic_common_title_bar_search"
        android:orderInCategory="100"
        android:showAsAction="collapseActionView"
        android:title="搜索"/>
    <item
        android:id="@+id/action_share"
        android:icon="@drawable/ic_context_menu_share"
        android:orderInCategory="100"
        android:showAsAction="ifRoom|withText"
        android:title="分享"/>
    <item
        android:id="@+id/action_camera"
        android:icon="@drawable/ic_context_menu_camera"
        android:orderInCategory="100"
        android:showAsAction="ifRoom|collapseActionView"
        android:title="相机"/>
    <item
        android:id="@+id/action_remove"
        android:icon="@drawable/ic_context_menu_remove"
        android:showAsAction="ifRoom|collapseActionView"
        android:title="删除"/>


</menu>
引入布局
@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}
PS:
注意搜索里面多了一句android:actionLayout="@layout/collapsibleview"下面有用到

对ActionBar 的Item的事件处理

@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		
		switch (item.getItemId()) {
		case R.id.action_camera:
			Toast.makeText(MainActivity.this, "你点击了"+item.getTitle(), 0).show();
			return true;
		case R.id.action_remove:
			Toast.makeText(MainActivity.this, "你点击了"+item.getTitle(), 0).show();
			return true;
		case R.id.action_search:
			Toast.makeText(MainActivity.this, "你点击了"+item.getTitle(), 0).show();
			return true;
		case R.id.action_share:
			Toast.makeText(MainActivity.this, "你点击了"+item.getTitle(), 0).show();
			return true;
		case android.R.id.home:
			// 当Action Bar的图标被单击时执行下面的Intent
			startActivity(new Intent(this, MainActivity.class));
			return true;
		default:
			break;
		}
		
		return super.onOptionsItemSelected(item);
	}

使用分割式ActionBar的方法

                    /***
		    * NAVIGATION_MODE_TABS
		    *  设置Actionbar的模式为分割Tab模式
		    * ***/
		   
		   actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
			// 新建3个Tab
			ActionBar.Tab tabA = actionBar.newTab().setText("选项一").setIcon(R.drawable.ic_context_menu_camera);
			ActionBar.Tab tabB = actionBar.newTab().setText("选项二").setIcon(R.drawable.ic_context_menu_share);
			ActionBar.Tab tabC = actionBar.newTab().setText("选项三").setIcon(R.drawable.ic_context_menu_remove);
			// 绑定到Fragment
			Fragment fragmentA = new AFragmentTab();
			Fragment fragmentB = new BFragmentTab();
			Fragment fragmentC = new CFragmentTab();
			
			tabA.setTabListener(new MyTabsListener(fragmentA));
			tabB.setTabListener(new MyTabsListener(fragmentB));
			tabC.setTabListener(new MyTabsListener(fragmentC));
			
			actionBar.addTab(tabA);
			actionBar.addTab(tabB);
			actionBar.addTab(tabC);

对每个Tab设置事件处理

tabA.setTabListener(new MyTabsListener(fragmentA));
自定义事件类
protected class MyTabsListener implements ActionBar.TabListener {
		private Fragment fragment;

		public MyTabsListener(Fragment fragment) {
			this.fragment = fragment;
		}

		@Override
		public void onTabSelected(Tab tab, FragmentTransaction ft) {
		}

		@Override
		public void onTabReselected(Tab arg0, FragmentTransaction arg1) {
			// TODO Auto-generated method stub

		}

		@Override
		public void onTabUnselected(Tab arg0, FragmentTransaction arg1) {
			// TODO Auto-generated method stub

		}
	}

实现的效果如下:




添加一个动作视图,比如自定义搜索框和按钮


注意搜索里面多了一句 android:actionLayout="@layout/collapsibleview"

当点击收索时候会出现一个点击动作的布局如下:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >

    <ImageView
        android:id="@+id/search"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:paddingRight="5dip"
        android:src="@drawable/ic_common_title_bar_search" />

    <EditText
        android:id="@+id/colla_edit"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_toLeftOf="@id/search" />


</RelativeLayout>

点击收索时候会出现以下界面

可折叠的动作视图

这个没有看懂什么意思,官方文档翻译如下:

       操作视窗让你在不改变Activity或Fragment的情况下,就可以给用户提供快捷的访问和丰富的操作。但是,默认情况下让操作视窗可见可能不太合适。要保证操作栏的空间(尤其是在小屏幕设备上运行时),你能够把操作视窗折叠进一个操作项按钮中。当用户选择这个按钮时,操作视窗就在操作栏中显示。被折叠的时候,如果你定义了android:showAsAction=”ifRoom”属性,那么系统可能会把这个项目放到溢出菜单中,但是当用户选项了这个菜单项,它依然会显示在操作栏中。通过给android:showAsAction属性添加“collapseActionView”属性值,你能够让操作视窗可以折叠起来。
因为在用户选择这个项目时,系统会展开这个操作视窗,所以你不必要在onOptionsItemSelected()回调方法中响应这个菜单项。在用户选择这个菜单项时,系统会依然调用onOptionsItemSelected()方法,但是除非你在方法中返回了true(指示你已经替代系统处理了这个事件),否则系统会始终展开这个操作视窗。
              当用户选择了操作栏中的“向上”图标或按下了回退按钮时,系统也会把操作视窗折叠起来。
             如果需要,你能够在代码中通过在expandActionView()和collapseActionView()方法来展开或折叠操作视窗。
注意:尽管把操作视窗折叠起来是可选的,但是,如果包含了SearchView对象,我们推荐你始终把这个视窗折叠起来,只有在需要的时候,由用户选择后才把它给展开。在提供了专用的“搜索”按钮的设备上也要小心了,如果用户按下了“搜索”按钮,那么也应该把这个搜索视窗给展开,简单的重写Activity的onKeyUp()回调方法,监听KEYCODE_SEARCH类型的按键事件,然后调用expandActionView()方法,就可以把操作视窗给展开。
如果你需要根据操作视窗的可见性来更新你的Activity,那么你可以定义一个OnActionExpandListener事件,并且用setOnActionExpandListener()方法来注册这个事件,然后就能够在操作视窗展开和折叠时接受这个回调方法了,如:


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.options, menu);
    MenuItem menuItem = menu.findItem(R.id.actionItem);
    ...

    // When using the support library, the setOnActionExpandListener() method is
    // static and accepts the MenuItem object as an argument
    MenuItemCompat.setOnActionExpandListener(menuItem, new OnActionExpandListener() {
        @Override
        public boolean onMenuItemActionCollapse(MenuItem item) {
            // Do something when collapsed
            return true;  // Return true to collapse action view
        }

        @Override
        public boolean onMenuItemActionExpand(MenuItem item) {
            // Do something when expanded
            return true;  // Return true to expand action view
        }
    });
}

添加一个操作提供器

比如分享功能的实现:

这个没有官方API中的那个好,只实现基本分享的功能,调用手机中的app
                      Intent intent=new Intent(Intent.ACTION_SEND);
		      intent.setType("text/plain");
		      intent.putExtra(Intent.EXTRA_SUBJECT, "分享");
		      intent.putExtra(Intent.EXTRA_TEXT, "每日一笑,好东西要分享哦~~");
		      startActivity(Intent.createChooser(intent, getTitle()));
			

Actionbar下拉列表模式


                setContentView(R.layout.activity_main);
		ActionBar actionBar = getActionBar();


		// 生成一个SpinnerAdapter
		SpinnerAdapter adapter = ArrayAdapter.createFromResource(this,
				R.array.people, android.R.layout.simple_spinner_dropdown_item);
		// 将ActionBar的操作模型设置为NAVIGATION_MODE_LIST
		actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
		// 为ActionBar设置下拉菜单和监听器
		actionBar.setListNavigationCallbacks(adapter,
				new OnNavigationListener() {
					// 得到和SpinnerAdapter里一致的字符数组
					String[] listNames = getResources().getStringArray(
							R.array.people);


					/* 当选择下拉菜单项的时候,将Activity中的内容置换为对应的Fragment */
					@Override
					public boolean onNavigationItemSelected(int itemPosition,
							long itemId) {
						// 生成自定的Fragment
						Ftest student = new Ftest();
						FragmentManager manager = getFragmentManager();
						FragmentTransaction transaction = manager
								.beginTransaction();
						// 将Activity中的内容替换成对应选择的Fragment
						// transaction.replace(android.R.id.content, student,
						// listNames[itemPosition]);
						Toast.makeText(MainActivity.this,
								listNames[itemPosition], 0).show();
						transaction.commit();
						return true;
					}
				});

用的的Ftest类如下:

package com.example.actionbartab;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class Ftest extends Fragment {
	// Fragment对应的标签,当Fragment依附于Activity时得到

	private String tag;

	@Override
	public void onAttach(Activity activity) {
		super.onAttach(activity);
		tag = getTag();
	}

	@SuppressLint("ResourceAsColor")
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		TextView textView = new TextView(getActivity());
		textView.setText(tag);
		return textView;

	}
}

效果如下:



其中用到的一个样式

android:theme="@android:style/Theme.Holo.Light"

       <activity
            android:name="com.example.actionbartab.MainActivity"
             android:theme="@android:style/Theme.Holo.Light"
            android:label="@string/app_name" >


代码下载地址:


这里非常感谢这个博主,在他的博客中学了好多,地址http://blog.csdn.net/eclipsexys/article/details/8688538


posted @ 2014-01-10 10:56  程序员Android的博客  阅读(95)  评论(0编辑  收藏  举报