【Android 应用开发】 ActionBar 基础

作者 : 万境绝尘 ([email protected])

转载请注明出处http://blog.csdn.net/shulianghan/article/details/39204393

示例代码下载 : 

-- GitHub : https://github.com/han1202012/Octopus_ActionBar.git

-- CSDN : http://download.csdn.net/detail/han1202012/7913297

一. ActionBar 基本操作

1. ActionBar 简介

ActionBar 位置 : 位于老版本的标题栏位置;

ActionBar 功能简介 :

-- 菜单显示 : 显示选项菜单;

-- 回退键 : 程序图标可以作为回退键使用;

-- 交互式 : 提供交互式 View;

-- 导航 : 类似与 Tab 导航, 可以进行 Fragment 切换;

-- 下拉导航 : 在导航的基础上 提供下拉功能;

2. 配置文件 配置 ActionBar 启用 和 关闭

配置文件中指定 targetSdkVersion : 在创建应用的时候, 指定的 targetSdkVersion 大于 3.0 版本, 就会默认启用 ActionBar, 现有手机大部分都是 4.0 以上, 就不使用 supportV4 兼容了, 直接使用高版本 sdk;

-- 创建工程示例 : 注意 Theme 选择 None, 选择其它主题会出错;

-- 配置文件 :

    <uses-sdk
        android:minSdkVersion="15"
        android:targetSdkVersion="19" />

关闭 ActionBar : 在 AndroidMainifest.xml 配置文件中, 为 <application /> 节点, 配置 android:theme 属性;

-- 默认配置android:theme="@style/AppTheme" ;

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme">

-- 取消 ActionBar 配置android:theme="@android:style/Theme.Holo.Dialog.NoActionBar" ;

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@android:style/Theme.Holo.Dialog.NoActionBar">

3. 使用代码控制 ActionBar 显示 隐藏

(1) ActionBar 相关方法

ActionBar 相关方法解析 :

-- Activity 中获取 ActionBar 对象 : 使用 getActionBar() 方法, 即可获取;

-- 设置 ActionBar 显示 : ActionBar.show() 方法;

-- 设置 ActionBar 隐藏 : ActionBar.hide() 方法;

(2) Activity 代码示例

package cn.org.octopus.action_bar;

import android.app.ActionBar;
import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;

public class MainActivity extends Activity {

	private ActionBar actionBar;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		if (savedInstanceState == null) {
			/* 获取 Fragment 管理器, 开始 Fragment 事务, 向 R.id.contaner 组件中添加一个 Fragment */
			getFragmentManager().beginTransaction()
					.add(R.id.container, new PlaceholderFragment()).commit();
		}
		actionBar = getActionBar();
	}

	/**
	 * 自定义一个 Fragment, 该 Fragment 主要存放主界面布局
	 */
	public static class PlaceholderFragment extends Fragment {

		public PlaceholderFragment() {
		}

		@Override
		public View onCreateView(LayoutInflater inflater, ViewGroup container,
				Bundle savedInstanceState) {
			/* 加载布局文件, 初始化组件, 并返回 */
			View rootView = inflater.inflate(R.layout.fragment_main, container,
					false);
			return rootView;
		}
	}

	public void onClick(View view) {
		int id = view.getId();
		switch (id) {
		case R.id.actionbar_show:
			actionBar.show();
			Toast.makeText(getApplicationContext(), "显示 ActionBar", Toast.LENGTH_LONG).show();;
			break;

		case R.id.actionbar_hide:
			actionBar.hide();
			Toast.makeText(getApplicationContext(), "隐藏 ActionBar", Toast.LENGTH_LONG).show();
			break;

		default:
			break;
		}
	}
}

(3) 布局文件代码示例

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="cn.org.octopus.action_bar.MainActivity$PlaceholderFragment" >

	<LinearLayout
	    android:id="@+id/actionbar_visible"
	    android:layout_width="match_parent"
	    android:layout_height="wrap_content"
	    android:background="#00FF00"
	    android:orientation="vertical">
	    <TextView
	        android:layout_width="wrap_content"
	        android:layout_height="wrap_content"
	        android:layout_gravity="center_horizontal"
	        android:text="控制 ActionBar 显示 和 隐藏"
	        android:textStyle="bold"
	        android:textSize="20dp"
	        android:layout_margin="10dp"/>

	    <LinearLayout
		    android:layout_width="match_parent"
		    android:layout_height="wrap_content"
		    android:orientation="horizontal">
			<Button
			    android:id="@+id/actionbar_show"
			    android:layout_width="0dp"
			    android:layout_weight="1"
			    android:layout_height="wrap_content"
			    android:gravity="center"
			    android:layout_margin="10dp"
			    android:textStyle="bold"
			    android:text="显示 ActionBar"
			    android:onClick="onClick"/>

			<Button
			    android:id="@+id/actionbar_hide"
			    android:layout_width="0dp"
			    android:layout_weight="1"
			    android:layout_height="wrap_content"
			    android:gravity="center"
			    android:layout_margin="10dp"
			    android:textStyle="bold"
			    android:text="隐藏 ActionBar"
			    android:onClick="onClick"/>
		</LinearLayout>

	</LinearLayout>

</RelativeLayout>

(4) 执行结果

二. ActionBar 选项菜单

ActionItem 简介 :

-- 之前的手机 : 在老版本的手机中, 手机需要提供 MENU 按键, 有了 ActionBar 之后, 可以将 MENU 集成到 ActionBar 上, 就不强制手机集成 MENU 按键了;

-- ActionItem 实现方式 : 有两种方式可以实现, 一种是纯代码形式, 在代码中生成, 一种是在配置文件中配置菜单项;

1. 使用代码控制选项菜单

MenuItem.setShowAsAction()方法 : 设备选项菜单是否显示在 ActionBar 上;

-- SHOW_AS_ACTION_ALWAYS 参数 : 总是显示 Menu 菜单;

-- SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW 参数 : ActionView 折叠成普通菜单;

-- SHOW_AS_ACTION_NEVER 参数 : 不显示 Menu 菜单;

-- SHOW_AS_ACTION_IF_ROOM 参数 : 位置足够时显示 菜单;

-- SHOW_AS_ACTION_WITH_TEXT 参数 : 显示 Menu 在 ActionBar 上, 并显示菜单项文本;

2. 配置文件控制选项菜单

(1) 配置文件解析

<item /> 标签解析 :

-- 所处位置 : 在 menu.xml 配置文件中的 第一层, 或者 最里层;

-- <item /> 包含 <menu /> : <menu /> 表示一个菜单, 一个 <item /> 中可以有多个菜单;

-- 最里层 <item /> : 具体的每个菜单也是由 <item /> 表示的, 此时只需要指定 android:id 和 android:tittle 两个属性;

<menu /> 标签解析 : 代表一个菜单选项;

-- 所处位置 : <item /> 标签之下, 处于配置文件第三层;

-- 子标签 : <menu /> 标签下 有 <group /> 子标签;

<group /> 标签解析 : 在 <menu /> 标签下, 代表一组带单选项;

(2) 配置文件示例

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context="cn.org.octopus.action_bar.MainActivity" >

    <item
        android:id="@+id/action_settings"
        android:orderInCategory="100"
        android:showAsAction="never"
        android:title="@string/action_settings"/>

    <!--
    	android:title 属性 : 显示名称
    	android:icon 属性 : 显示图标
    	android:showAsAction 属性 : 设置是否在 ActionBar 中显示
    -->
    <item
        android:title="单选菜单"
        android:showAsAction="always|withText|collapseActionView"
        android:icon="@drawable/ic_launcher">
        <menu>
            <!-- android:checkableBehavior 属性 : 设置点击事件 -->
            <group android:checkableBehavior="single">
                <!--
                	android:id 属性 : 用于标识 id
                	android:title 属性 : 菜单显示的 标题
                 -->
                <item android:id="@+id/menu1_item1"
                    android:title="menu1_item1"/>
                <item android:id="@+id/menu1_item2"
                    android:title="menu1_item2"/>
                <item android:id="@+id/menu1_item3"
                    android:title="menu1_item3"/>
            </group>
        </menu>
    </item>

    <item
        android:id="@+id/menu3"
        android:title="普通菜单"
        android:showAsAction="always|withText"/>

    <item
        android:title="默认菜单"
        android:showAsAction="always|withText|collapseActionView">
        <menu>
            <group>
                <item android:id="@+id/menu2_item1"
                    android:title="menu2_item1"/>
                <item android:id="@+id/menu2_item2"
                    android:title="menu2_item2"/>
                <item android:id="@+id/menu2_item3"
                    android:title="menu2_item3"/>
            </group>
        </menu>
    </item>

</menu>

(3) Activity 中加载菜单

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		/* 加载 main.xml 菜单, 在 ActionBar 中显示配置文件中定义的菜单内容 */
		getMenuInflater().inflate(R.menu.main, menu);
		return super.onCreateOptionsMenu(menu);
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		/*
		 * 点击 menu 菜单中选项回调事件
		 * id 在 menu.xml 中的 <item /> 标签中的 android:id 属性中定义
		 */
		int id = item.getItemId();
		switch (id) {
		case R.id.menu1_item1:
			toast("menu1_item1");
			break;
		case R.id.menu1_item2:
			toast("menu1_item2");
			break;
		case R.id.menu1_item3:
			toast("menu1_item3");
			break;
		case R.id.menu2_item1:
			toast("menu2_item1");
			break;
		case R.id.menu2_item2:
			toast("menu2_item2");
			break;
		case R.id.menu2_item3:
			toast("menu2_item3");
			break;
		case R.id.menu3:
			toast("menu3");
			break;
		default:
			break;
		}
		if (id == R.id.action_settings) {
			return true;
		}
		return super.onOptionsItemSelected(item);
	}

(4) 执行效果

三. 图标导航

1. ActionBar 方法介绍

ActionBar 相关方法简介 :

-- setDisplayHomeAsUpEnable(boolean) : 设置是否将左侧设置为可点击图标, 并在图标上添加左箭头;

-- setDisplayOption(int) : 设置 ActionBar 的显示选项;

-- setDisplayShowHomeEnable(boolean) : 设置是否显示应用程序图标;

-- setHomeButtonEnable(boolean) : 设置是否将应用程序图表转换为可点击按钮;

2. 相关代码

设置不显示应用图标并添加左箭头 :

		actionBar = getActionBar();

		/* 设置将左侧图标设置成可点击图标, 并添加一个左箭头 */
		actionBar.setDisplayHomeAsUpEnabled(true);

		/* 不显示应用程序图标 */
		actionBar.setDisplayShowHomeEnabled(false);

设置点击图表回调事件 : ActionBar 中的图表代表的组件 id 为 android.R.id.home ;

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		/*
		 * 点击 menu 菜单中选项回调事件
		 * id 在 menu.xml 中的 <item /> 标签中的 android:id 属性中定义
		 */
		int id = item.getItemId();
		switch (id) {
		case android.R.id.home:
			toast("点击回退键");
			break;

3. 运行示例

四. ActionBar 上添加 ActionView

1. 代码解析

<item /> 标签在 xml 文件中配置 :

-- android:actionViewClass 属性 : 在 ActionBar 上显示一个已定义的组件, 设置类的全路径名称;

-- android:actionLayout 属性 : 设置在 ActionBar 上显示一个布局文件;

-- android:orderInCategory属性 : 表示菜单中的优先级, 用于 Action View 在 ActionBar 上进行排序;

代码示例 :

    <!--
    	android:orderInCategory 属性 : 表示优先级, 用于进行 item 排序
     -->
    <item
        android:id="@+id/search"
        android:title="搜索"
        android:orderInCategory="100"
        android:showAsAction="always"
        android:actionViewClass="android.widget.SearchView"/>

    <item
        android:id="@+id/layout"
        android:title="layout"
        android:showAsAction="always"
        android:orderInCategory="100"
 	    android:actionLayout="@layout/layout"/>

2. 执行结果

五. ActionBar Tab 导航

1. ActionBar 相关代码解析

(1) ActionBar 开启导航相关方法

开启 Tab 导航 : actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

-- ActionBar 有三种导航方式 :  ActionBar.NAVIGATION_MODE_TABS  Tab 导航, ActionBar.NAVIGATION_MODE_LIST  List 导航, ActionBar.NAVIGATION_MODE_STANDARD  普通导航;

-- 代码示例 :

		/* 获取 ActionBar */
		ActionBar actionBar = getActionBar();

		/* 设置 ActionBar 的导航方式
		 * 	-- ActionBar.NAVIGATION_MODE_TABS : Tab 导航
		 *  -- ActionBar.NAVIGATION_MODE_LIST : List 导航
		 *  -- ActionBar.NAVIGATION_MODE_STANDARD : 普通导航 */
		actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

(2) ActionBar 添加标签方法

创建标签并设置 :

-- 创建标签方法 : Tab tab = actionBar.newTab();

-- 设置标签 : tab.setText(tabName);

-- 设置 Tab 监听器 : tab.setTabListener(listener), 监听哪个标签被选中, 取消选中, 释放 动作;

-- 为 ActionBar 设置标签 : actionBar.setTab(tab);

-- 示例代码 :

		Tab tab1 = actionBar.newTab().setText("第一页").setTabListener(this);
		Tab tab2 = actionBar.newTab().setText("第二页").setTabListener(this);
		Tab tab3 = actionBar.newTab().setText("第三页").setTabListener(this);

		actionBar.addTab(tab1);
		actionBar.addTab(tab2);
		actionBar.addTab(tab3);

(3) Tab 事件监听器

实现 TabListener 接口 : 一般是 Activity 实现该接口;

-- onTabReselected() 抽象方法 : 在 标签被选中时回调;

-- onTabUnselected() 抽象方法 : 在 标签取消选中时回调;

-- onTabSelected() 抽象方法 : 在标签选中时回调;

代码示例 :

public class TabNavigationActivity extends Activity implements TabListener {
	@Override
	public void onTabSelected(Tab tab, FragmentTransaction ft) {
		Fragment fragment = new TabFragment();

		/* 设置参数传递 */
		Bundle bundle = new Bundle();
		bundle.putInt(TabFragment.key, tab.getPosition() + 1);
		fragment.setArguments(bundle);

		/* 创建 Fragment 管理器 */
		FragmentManager manager = getFragmentManager();
		/* 开启事务 */
		FragmentTransaction transaction = manager.beginTransaction();
		transaction.replace(R.id.holder, fragment);
		transaction.commit();
	}

	/**
	 * Tab 取消选中时回调
	 */
	@Override
	public void onTabUnselected(Tab tab, FragmentTransaction ft) {
	}
	/**
	 * Tab 释放时回调
	 */
	@Override
	public void onTabReselected(Tab tab, FragmentTransaction ft) {
	}

}

2. Fragement 创建相关代码解析

(1) Fragment 参数传递

a. 创建 Fragement 对象

创建自定义的 Fragment : Fragment fragment = new TabFragment();

b. 创建 Bundle 并设置参数

创建 Bundle : Bundle bundle = new Bundle();

设置参数 : bundle.putInt();

像 Fragement 设置参数 : fragment.setArguments(bundle);

(2) Fragement 事务开启并提交

获取事务管理器 : FragmentManager manager = getFragmentManager();

开启事务 : FragmentTransaction transaction = manager.beginTransaction();

执行事务 : transaction.replace(R.id.holder, fragment);

-- R.id.Holder 参数 : 这个是 布局文件 的根标签的 id;

-- Fragment 参数 : 要显示的 Fragement, 将这个 Fragement 设置到 上面 id 的 ViewGroup 布局中;

提交事务 : transaction.commit();

(3) 代码示例

代码示例 :

	@Override
	public void onTabSelected(Tab tab, FragmentTransaction ft) {
		Fragment fragment = new TabFragment();

		/* 设置参数传递 */
		Bundle bundle = new Bundle();
		bundle.putInt(TabFragment.key, tab.getPosition() + 1);
		fragment.setArguments(bundle);

		/* 创建 Fragment 管理器 */
		FragmentManager manager = getFragmentManager();
		/* 开启事务 */
		FragmentTransaction transaction = manager.beginTransaction();
		transaction.replace(R.id.holder, fragment);
		transaction.commit();
	}

3. 自定义 Fragement 相关解析

(1) 获取 Activity 对象

获取方法 : Activity activity = getActivity(), 直接调用 getActivity() 即可获取;

用处 : 该 Activity 对象在 创建布局文件时使用;

(2) 获取参数

参数获取 : 在创建 Fragement 时通过 Bundle 对象传入了参数, 可以通过调用 getBundle() 方法, 获取 Bundle 对象;

-- 代码示例 :

			/* 获取从 Activity 传入的数据 */
			Bundle bundle = getArguments();
			int tab = bundle.getInt(key);

(3) 创建 ImagView 组件

创建组件并设置参数 :

-- 创建组件 : ImageView imageView = new ImageView(activity);

-- 设置参数 : 创建一个 LayoutParams 对象, 并设置参数进去, 宽 高 都设置为 match_parent;

-- 代码示例 :

			/* 设置一个充满全屏的图片 */
			ImageView imageView = new ImageView(activity);
			LayoutParams layoutParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
			imageView.setLayoutParams(layoutParams);
			switch (tab) {
			case 1:
				imageView.setImageResource(R.drawable.a);
				break;
			case 2:
				imageView.setImageResource(R.drawable.b);
				break;
			case 3:
				imageView.setImageResource(R.drawable.c);
				break;

			default:
				break;
			}

4. 代码示例

(1) Activity 示例代码

TabNavigationActivity.java 代码 :

package cn.org.octopus.action_bar;

import android.app.ActionBar;
import android.app.ActionBar.Tab;
import android.app.ActionBar.TabListener;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.ImageView;

public class TabNavigationActivity extends Activity implements TabListener {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_tab);

		/* 获取 ActionBar */
		ActionBar actionBar = getActionBar();

		/* 设置 ActionBar 的导航方式
		 * 	-- ActionBar.NAVIGATION_MODE_TABS : Tab 导航
		 *  -- ActionBar.NAVIGATION_MODE_LIST : List 导航
		 *  -- ActionBar.NAVIGATION_MODE_STANDARD : 普通导航 */
		actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

		/* 设置 ActionBar 左侧图标可点击, 添加箭头 */
		actionBar.setDisplayHomeAsUpEnabled(true);

		Tab tab1 = actionBar.newTab().setText("第一页").setTabListener(this);
		Tab tab2 = actionBar.newTab().setText("第二页").setTabListener(this);
		Tab tab3 = actionBar.newTab().setText("第三页").setTabListener(this);

		actionBar.addTab(tab1);
		actionBar.addTab(tab2);
		actionBar.addTab(tab3);

	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		int id = item.getItemId();
		switch (id) {
		/* 设置的点击图标按钮回退 */
		case android.R.id.home:
			finish();
			break;

		default:
			break;
		}

		return super.onOptionsItemSelected(item);
	}

	@Override
	public void onTabSelected(Tab tab, FragmentTransaction ft) {
		Fragment fragment = new TabFragment();

		/* 设置参数传递 */
		Bundle bundle = new Bundle();
		bundle.putInt(TabFragment.key, tab.getPosition() + 1);
		fragment.setArguments(bundle);

		/* 创建 Fragment 管理器 */
		FragmentManager manager = getFragmentManager();
		/* 开启事务 */
		FragmentTransaction transaction = manager.beginTransaction();
		transaction.replace(R.id.holder, fragment);
		transaction.commit();
	}

	/**
	 * Tab 取消选中时回调
	 */
	@Override
	public void onTabUnselected(Tab tab, FragmentTransaction ft) {
	}
	/**
	 * Tab 释放时回调
	 */
	@Override
	public void onTabReselected(Tab tab, FragmentTransaction ft) {
	}

	public static class TabFragment extends Fragment{
		public static final String key = "key";

		@Override
		public View onCreateView(LayoutInflater inflater, ViewGroup container,
				Bundle savedInstanceState) {
			/* 获取该 Fragment 被嵌入的 上下文对象 */
			Activity activity = getActivity();

			/* 获取从 Activity 传入的数据 */
			Bundle bundle = getArguments();
			int tab = bundle.getInt(key);

			/* 设置一个充满全屏的图片 */
			ImageView imageView = new ImageView(activity);
			LayoutParams layoutParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
			imageView.setLayoutParams(layoutParams);
			switch (tab) {
			case 1:
				imageView.setImageResource(R.drawable.a);
				break;
			case 2:
				imageView.setImageResource(R.drawable.b);
				break;
			case 3:
				imageView.setImageResource(R.drawable.c);
				break;

			default:
				break;
			}

			return imageView;
		}

	}

}

(2) 布局文件代码

activity_tab.xml 代码 :

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/holder"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

(3) 执行效果

六. ActionBar 实现下拉式导航

1. ActionBar 相关方法

a .设置 List 导航方式

设置方法 : actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);

代码示例 :

		/* 设置 ActionBar 的导航方式
		 * 	-- ActionBar.NAVIGATION_MODE_TABS : Tab 导航
		 *  -- ActionBar.NAVIGATION_MODE_LIST : List 导航
		 *  -- ActionBar.NAVIGATION_MODE_STANDARD : 普通导航 */
		actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);

b. 创建一个 SpinnerAdapter

适配器创建 : 使用 ArrayAdapter 适配器, 传入 上下文对象, 适配器条目布局, 文字显示组件id, String数组;

代码示例 :

		/* 设置标题 */
		String[] strs = new String[]{"第一页", "第二页", "第三页"};
		/* 设置 List导航 适配器 */
		SpinnerAdapter adapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_list_item_1, android.R.id.text1, strs);

c. 设置 List 回调接口

接口作用 : 当选中一个条目之后, 回调接口中的方法;

-- 接口名称 : ActionBar.OnNavigationListener;

-- 抽象方法 : public boolean onNavigationItemSelected(int itemPosition, long itemId);

-- 代码示例 :

public class ListNavigationActivity extends Activity implements ActionBar.OnNavigationListener {

	@Override
	public boolean onNavigationItemSelected(int itemPosition, long itemId) {
		/* 创建 Fragement */
		Fragment fragment = new TabFragment();

		/* 设置 Fragement 参数 */
		Bundle bundle = new Bundle();
		bundle.putInt(TabFragment.key, itemPosition + 1);
		fragment.setArguments(bundle);

		/* 置换 Fragement */
		FragmentManager manager = getFragmentManager();
		FragmentTransaction transaction = manager.beginTransaction();
		transaction.replace(R.id.list_holder, fragment);
		transaction.commit();

		return true;
	}

}

d. 将适配器和回调接口设置给 ActionBar

		/* 为 ActionBar 设置适配器和回调接口 */
		actionBar.setListNavigationCallbacks(adapter, this);

2. 代码示例

(1) Activity 示例

ListNavigationActivity.java 代码示例 :

package cn.org.octopus.action_bar;

import android.app.ActionBar;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.view.MenuItem;
import android.widget.ArrayAdapter;
import android.widget.SpinnerAdapter;

public class ListNavigationActivity extends Activity implements ActionBar.OnNavigationListener {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_list);

		/* 获取 ActionBar */
		ActionBar actionBar = getActionBar();

		/* 设置 ActionBar 的导航方式
		 * 	-- ActionBar.NAVIGATION_MODE_TABS : Tab 导航
		 *  -- ActionBar.NAVIGATION_MODE_LIST : List 导航
		 *  -- ActionBar.NAVIGATION_MODE_STANDARD : 普通导航 */
		actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);

		/* 设置 ActionBar 左侧图标可点击, 添加箭头 */
		actionBar.setDisplayHomeAsUpEnabled(true);

		/* 设置标题 */
		String[] strs = new String[]{"第一页", "第二页", "第三页"};
		/* 设置 List导航 适配器 */
		SpinnerAdapter adapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_list_item_1, android.R.id.text1, strs);
		/* 为 ActionBar 设置适配器和回调接口 */
		actionBar.setListNavigationCallbacks(adapter, this);
	}

	@Override
	public boolean onNavigationItemSelected(int itemPosition, long itemId) {
		/* 创建 Fragement */
		Fragment fragment = new TabFragment();

		/* 设置 Fragement 参数 */
		Bundle bundle = new Bundle();
		bundle.putInt(TabFragment.key, itemPosition + 1);
		fragment.setArguments(bundle);

		/* 置换 Fragement */
		FragmentManager manager = getFragmentManager();
		FragmentTransaction transaction = manager.beginTransaction();
		transaction.replace(R.id.list_holder, fragment);
		transaction.commit();

		return true;
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		int id = item.getItemId();
		switch (id) {
		/* 设置的点击图标按钮回退 */
		case android.R.id.home:
			finish();
			break;

		default:
			break;
		}

		return super.onOptionsItemSelected(item);
	}
}

(2) 执行效果

作者 : 万境绝尘 ([email protected])

转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/39204393

示例代码下载 : 

-- GitHub : https://github.com/han1202012/Octopus_ActionBar.git

-- CSDN : http://download.csdn.net/detail/han1202012/7913297

时间: 2024-10-28 14:28:52

【Android 应用开发】 ActionBar 基础的相关文章

Android Camera开发之基础知识篇

概述 Android框架支持设备的相机拍照和录像功能,你的应用可以直接调用系统的Camera应用来拍照或者录像(比如微信拍照),当然也可以利用Android系统提供的API开发一个Camera应用来实现相机拍照和录像功能(比如市面上流行的360相机).此篇文章主要记录相机开发有关的基础知识,以及带着自己的理解翻译Camera官方文档,如有翻译不恰当支出,还请指出改正.当然我会开一个有关相机开发的一个系列,该系列主要内容包括如下: 相机基本预览拍照功能. 实现相机的Flash,Hdr,滤镜,前后摄

Android程序开发0基础教程(一)

程序猿学英语就上视觉英语网 Android程序开发0基础教程(一) 平台简单介绍 令人激动的Google手机操作系统平台-Android在2007年11月13日正式公布了,这是一个开放源码的操作系统,内核为Linux. 作为开发人员,我们所关心的是这个平台的架构以及所支持的开发语言.以下是这个平台的架构模型: 这个平台有下面功能: + Application framework: 可重用的和可替换的组件部分,在这个层面上,全部的软件都是平等的. + Dalvik virtul machine:

Android图片开发内幕--基础篇

前言:本来我是做电视应用的,但是因为公司要出手机,人员紧张,所以就抽调我去支援一下,谁叫俺是雷锋呢!我做的一个功能就是处理手机中的应用ICON,处理无非就是美化一下,重新与底板进行合成和裁剪,用到了很多Bitmap的知识.本来之前一直想写一些关于Bitmap的博客,正好这是个机会,因此Bitmap那些事系列博客诞生了.这个系列我会把学习Bitmap的一些知识发布出来供大家参考和交流. 在手机中图片一般都是指Bitmap图片,为什么要说Bitmap呢?因为大家在开发应用的时候,都会使用一些图片来表

Android NDK开发(六)——使用开源LAME转码mp3

转载请注明出处:http://blog.csdn.net/allen315410/article/details/42456661 在本专栏的前面几篇博客中讲述了一些Android NDK开发的基础,从环境搭建一直到利用JNI进行Java端和C端代码的互相调用,并且的讲解的Demo也是很简单易懂的,相信掌握前面博客的大部分内容,就可以着手在实际项目中利用JNI进行NDK开发了,那么既然基础过了,接下来我在这里尝试去使用真实项目中去.我们知道,C语言因为高效,而且又是最早期的高级编程之一,一直存活

一起学Google Daydream VR开发,快速入门开发基础教程一:Android端开发环境配置一

原文因涉及翻墙信息,被强制删除,此文为补发! 准备工作 进入Google Daydream开发者官网,开启准备工作,官网地址:https://vr.google.com/daydream/developers/ -------------------------------------------------------------------------------------------------------------------- Google Daydream开发者网址: https

Android零基础入门第16节:Android用户界面开发概述

相信通过前面15期的学习,Android的开发环境已经基本掌握了,如果仍有问题,欢迎到Android零基础入门技术讨论微信群交流,从本期开始正式来一步一步踏入Android开发之路. Android应用开发的一项内容就是用户界面的开发.Android提供了非常丰富的用户界面组件,借助于这些用户界面组件,开发者可以非常方便地进行用户界面开发,而且可以开发出非常优秀的用户界面. 一.界面UI元素介绍 Android应用是运行于手机系统上的程序,这种程序给用户的第一印象就是用户界面.接下来从以下几个方

《Android Studio开发实战 从零基础到App上线》资源下载和内容勘误

http://blog.csdn.net/aqi00/article/details/72907534 http://blog.csdn.net/aqi00/article/details/73065392 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 资源下载 下面是<Android Studio开发实战 从零基础到App上线>一书用到的工具和代码资源:1.本书使用的Android Studio版本为2.2.3,因为Android官网现在不提供该版本的下载,所以博主

零基础Android嵌入式开发视频教程

零基础Android手机嵌入式开发实战课程(网吧计费系统.多功能播放器.驱动开发) 适合人群:初级 课时数量:176课时 用到技术:Bootloader开发.裸板开发 涉及项目:网吧计费系统.多功能播放器.驱动开发等 咨询qq:1840215592 零基础Android嵌入式开发教程总共分为八部分,零基础起步,由浅入深,全面系统的介绍了Android系统从应用开发.系统移植.再到设备驱动开发的全过程,总课时预计174讲! 课程内容简介: 本套Android嵌入式开发教程从最础的C语言和数据结构起

Android音频开发(1):基础知识

先来点闲言碎语,前段时间我有一段感悟:Android开发,本身并不是一个可以走得多远的方向,它只是一个平台,提供了许多封装好的API,让大家能够快速开发出针对特定业务的应用. 真正有价值的地方就在于Android与具体的业务方向结合,比如:Android与音视频技术,Android与智能硬件交互,Android与前端技术的融合与探索,Android信息安全,Android源码深度定制等等. 我一直比较看好音视频/多媒体方向,希望在此能够深入积累和探索,前段时间我发布了一款Android VoIP