作者 : 万境绝尘 (octopus_truth@163.com)

转载请注明出处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, 选择其它主题会出错;

-- 配置文件 :

  1. <uses-sdk
  2. android:minSdkVersion="15"
  3. android:targetSdkVersion="19" />

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

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

  1. <application
  2. android:allowBackup="true"
  3. android:icon="@drawable/ic_launcher"
  4. android:label="@string/app_name"
  5. android:theme="@style/AppTheme">

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

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

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

(1) ActionBar 相关方法

ActionBar 相关方法解析 :

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

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

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

(2) Activity 代码示例

  1. package cn.org.octopus.action_bar;
  2.  
  3. import android.app.ActionBar;
  4. import android.app.Activity;
  5. import android.app.Fragment;
  6. import android.os.Bundle;
  7. import android.view.LayoutInflater;
  8. import android.view.Menu;
  9. import android.view.MenuItem;
  10. import android.view.View;
  11. import android.view.ViewGroup;
  12. import android.widget.Toast;
  13.  
  14. public class MainActivity extends Activity {
  15.  
  16. private ActionBar actionBar;
  17.  
  18. @Override
  19. protected void onCreate(Bundle savedInstanceState) {
  20. super.onCreate(savedInstanceState);
  21. setContentView(R.layout.activity_main);
  22.  
  23. if (savedInstanceState == null) {
  24. /* 获取 Fragment 管理器, 开始 Fragment 事务, 向 R.id.contaner 组件中添加一个 Fragment */
  25. getFragmentManager().beginTransaction()
  26. .add(R.id.container, new PlaceholderFragment()).commit();
  27. }
  28. actionBar = getActionBar();
  29. }
  30.  
  31. /**
  32. * 自定义一个 Fragment, 该 Fragment 主要存放主界面布局
  33. */
  34. public static class PlaceholderFragment extends Fragment {
  35.  
  36. public PlaceholderFragment() {
  37. }
  38.  
  39. @Override
  40. public View onCreateView(LayoutInflater inflater, ViewGroup container,
  41. Bundle savedInstanceState) {
  42. /* 加载布局文件, 初始化组件, 并返回 */
  43. View rootView = inflater.inflate(R.layout.fragment_main, container,
  44. false);
  45. return rootView;
  46. }
  47. }
  48.  
  49. public void onClick(View view) {
  50. int id = view.getId();
  51. switch (id) {
  52. case R.id.actionbar_show:
  53. actionBar.show();
  54. Toast.makeText(getApplicationContext(), "显示 ActionBar", Toast.LENGTH_LONG).show();;
  55. break;
  56.  
  57. case R.id.actionbar_hide:
  58. actionBar.hide();
  59. Toast.makeText(getApplicationContext(), "隐藏 ActionBar", Toast.LENGTH_LONG).show();
  60. break;
  61.  
  62. default:
  63. break;
  64. }
  65. }
  66. }

(3) 布局文件代码示例

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:paddingBottom="@dimen/activity_vertical_margin"
  6. android:paddingLeft="@dimen/activity_horizontal_margin"
  7. android:paddingRight="@dimen/activity_horizontal_margin"
  8. android:paddingTop="@dimen/activity_vertical_margin"
  9. tools:context="cn.org.octopus.action_bar.MainActivity$PlaceholderFragment" >
  10.  
  11. <LinearLayout
  12. android:id="@+id/actionbar_visible"
  13. android:layout_width="match_parent"
  14. android:layout_height="wrap_content"
  15. android:background="#00FF00"
  16. android:orientation="vertical">
  17. <TextView
  18. android:layout_width="wrap_content"
  19. android:layout_height="wrap_content"
  20. android:layout_gravity="center_horizontal"
  21. android:text="控制 ActionBar 显示 和 隐藏"
  22. android:textStyle="bold"
  23. android:textSize="20dp"
  24. android:layout_margin="10dp"/>
  25.  
  26. <LinearLayout
  27. android:layout_width="match_parent"
  28. android:layout_height="wrap_content"
  29. android:orientation="horizontal">
  30. <Button
  31. android:id="@+id/actionbar_show"
  32. android:layout_width="0dp"
  33. android:layout_weight="1"
  34. android:layout_height="wrap_content"
  35. android:gravity="center"
  36. android:layout_margin="10dp"
  37. android:textStyle="bold"
  38. android:text="显示 ActionBar"
  39. android:onClick="onClick"/>
  40.  
  41. <Button
  42. android:id="@+id/actionbar_hide"
  43. android:layout_width="0dp"
  44. android:layout_weight="1"
  45. android:layout_height="wrap_content"
  46. android:gravity="center"
  47. android:layout_margin="10dp"
  48. android:textStyle="bold"
  49. android:text="隐藏 ActionBar"
  50. android:onClick="onClick"/>
  51. </LinearLayout>
  52.  
  53. </LinearLayout>
  54.  
  55. </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) 配置文件示例

  1. <menu xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. tools:context="cn.org.octopus.action_bar.MainActivity" >
  4.  
  5. <item
  6. android:id="@+id/action_settings"
  7. android:orderInCategory="100"
  8. android:showAsAction="never"
  9. android:title="@string/action_settings"/>
  10.  
  11. <!--
  12. android:title 属性 : 显示名称
  13. android:icon 属性 : 显示图标
  14. android:showAsAction 属性 : 设置是否在 ActionBar 中显示
  15. -->
  16. <item
  17. android:title="单选菜单"
  18. android:showAsAction="always|withText|collapseActionView"
  19. android:icon="@drawable/ic_launcher">
  20. <menu>
  21. <!-- android:checkableBehavior 属性 : 设置点击事件 -->
  22. <group android:checkableBehavior="single">
  23. <!--
  24. android:id 属性 : 用于标识 id
  25. android:title 属性 : 菜单显示的 标题
  26. -->
  27. <item android:id="@+id/menu1_item1"
  28. android:title="menu1_item1"/>
  29. <item android:id="@+id/menu1_item2"
  30. android:title="menu1_item2"/>
  31. <item android:id="@+id/menu1_item3"
  32. android:title="menu1_item3"/>
  33. </group>
  34. </menu>
  35. </item>
  36.  
  37. <item
  38. android:id="@+id/menu3"
  39. android:title="普通菜单"
  40. android:showAsAction="always|withText"/>
  41.  
  42. <item
  43. android:title="默认菜单"
  44. android:showAsAction="always|withText|collapseActionView">
  45. <menu>
  46. <group>
  47. <item android:id="@+id/menu2_item1"
  48. android:title="menu2_item1"/>
  49. <item android:id="@+id/menu2_item2"
  50. android:title="menu2_item2"/>
  51. <item android:id="@+id/menu2_item3"
  52. android:title="menu2_item3"/>
  53. </group>
  54. </menu>
  55. </item>
  56.  
  57. </menu>

(3) Activity 中加载菜单

  1. @Override
  2. public boolean onCreateOptionsMenu(Menu menu) {
  3. /* 加载 main.xml 菜单, 在 ActionBar 中显示配置文件中定义的菜单内容 */
  4. getMenuInflater().inflate(R.menu.main, menu);
  5. return super.onCreateOptionsMenu(menu);
  6. }
  7.  
  8. @Override
  9. public boolean onOptionsItemSelected(MenuItem item) {
  10. /*
  11. * 点击 menu 菜单中选项回调事件
  12. * id 在 menu.xml 中的 <item /> 标签中的 android:id 属性中定义
  13. */
  14. int id = item.getItemId();
  15. switch (id) {
  16. case R.id.menu1_item1:
  17. toast("menu1_item1");
  18. break;
  19. case R.id.menu1_item2:
  20. toast("menu1_item2");
  21. break;
  22. case R.id.menu1_item3:
  23. toast("menu1_item3");
  24. break;
  25. case R.id.menu2_item1:
  26. toast("menu2_item1");
  27. break;
  28. case R.id.menu2_item2:
  29. toast("menu2_item2");
  30. break;
  31. case R.id.menu2_item3:
  32. toast("menu2_item3");
  33. break;
  34. case R.id.menu3:
  35. toast("menu3");
  36. break;
  37. default:
  38. break;
  39. }
  40. if (id == R.id.action_settings) {
  41. return true;
  42. }
  43. return super.onOptionsItemSelected(item);
  44. }

(4) 执行效果

三. 图标导航

1. ActionBar 方法介绍

ActionBar 相关方法简介 :

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

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

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

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

2. 相关代码

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

  1. actionBar = getActionBar();
  2.  
  3. /* 设置将左侧图标设置成可点击图标, 并添加一个左箭头 */
  4. actionBar.setDisplayHomeAsUpEnabled(true);
  5.  
  6. /* 不显示应用程序图标 */
  7. actionBar.setDisplayShowHomeEnabled(false);

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

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

3. 运行示例

四. ActionBar 上添加 ActionView

1. 代码解析

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

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

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

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

代码示例 :

  1. <!--
  2. android:orderInCategory 属性 : 表示优先级, 用于进行 item 排序
  3. -->
  4. <item
  5. android:id="@+id/search"
  6. android:title="搜索"
  7. android:orderInCategory="100"
  8. android:showAsAction="always"
  9. android:actionViewClass="android.widget.SearchView"/>
  10.  
  11. <item
  12. android:id="@+id/layout"
  13. android:title="layout"
  14. android:showAsAction="always"
  15. android:orderInCategory="100"
  16. 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  普通导航;

-- 代码示例 :

  1. /* 获取 ActionBar */
  2. ActionBar actionBar = getActionBar();
  3.  
  4. /* 设置 ActionBar 的导航方式
  5. * -- ActionBar.NAVIGATION_MODE_TABS : Tab 导航
  6. * -- ActionBar.NAVIGATION_MODE_LIST : List 导航
  7. * -- ActionBar.NAVIGATION_MODE_STANDARD : 普通导航 */
  8. actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

(2) ActionBar 添加标签方法

创建标签并设置 :

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

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

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

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

-- 示例代码 :

  1. Tab tab1 = actionBar.newTab().setText("第一页").setTabListener(this);
  2. Tab tab2 = actionBar.newTab().setText("第二页").setTabListener(this);
  3. Tab tab3 = actionBar.newTab().setText("第三页").setTabListener(this);
  4.  
  5. actionBar.addTab(tab1);
  6. actionBar.addTab(tab2);
  7. actionBar.addTab(tab3);

(3) Tab 事件监听器

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

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

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

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

代码示例 :

  1. public class TabNavigationActivity extends Activity implements TabListener {
  2. @Override
  3. public void onTabSelected(Tab tab, FragmentTransaction ft) {
  4. Fragment fragment = new TabFragment();
  5.  
  6. /* 设置参数传递 */
  7. Bundle bundle = new Bundle();
  8. bundle.putInt(TabFragment.key, tab.getPosition() + 1);
  9. fragment.setArguments(bundle);
  10.  
  11. /* 创建 Fragment 管理器 */
  12. FragmentManager manager = getFragmentManager();
  13. /* 开启事务 */
  14. FragmentTransaction transaction = manager.beginTransaction();
  15. transaction.replace(R.id.holder, fragment);
  16. transaction.commit();
  17. }
  18.  
  19. /**
  20. * Tab 取消选中时回调
  21. */
  22. @Override
  23. public void onTabUnselected(Tab tab, FragmentTransaction ft) {
  24. }
  25. /**
  26. * Tab 释放时回调
  27. */
  28. @Override
  29. public void onTabReselected(Tab tab, FragmentTransaction ft) {
  30. }
  31.  
  32. }

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) 代码示例

代码示例 :

  1. @Override
  2. public void onTabSelected(Tab tab, FragmentTransaction ft) {
  3. Fragment fragment = new TabFragment();
  4.  
  5. /* 设置参数传递 */
  6. Bundle bundle = new Bundle();
  7. bundle.putInt(TabFragment.key, tab.getPosition() + 1);
  8. fragment.setArguments(bundle);
  9.  
  10. /* 创建 Fragment 管理器 */
  11. FragmentManager manager = getFragmentManager();
  12. /* 开启事务 */
  13. FragmentTransaction transaction = manager.beginTransaction();
  14. transaction.replace(R.id.holder, fragment);
  15. transaction.commit();
  16. }

3. 自定义 Fragement 相关解析

(1) 获取 Activity 对象

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

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

(2) 获取参数

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

-- 代码示例 :

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

(3) 创建 ImagView 组件

创建组件并设置参数 :

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

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

-- 代码示例 :

  1. /* 设置一个充满全屏的图片 */
  2. ImageView imageView = new ImageView(activity);
  3. LayoutParams layoutParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
  4. imageView.setLayoutParams(layoutParams);
  5. switch (tab) {
  6. case 1:
  7. imageView.setImageResource(R.drawable.a);
  8. break;
  9. case 2:
  10. imageView.setImageResource(R.drawable.b);
  11. break;
  12. case 3:
  13. imageView.setImageResource(R.drawable.c);
  14. break;
  15.  
  16. default:
  17. break;
  18. }

4. 代码示例

(1) Activity 示例代码

TabNavigationActivity.java 代码 :

  1. package cn.org.octopus.action_bar;
  2.  
  3. import android.app.ActionBar;
  4. import android.app.ActionBar.Tab;
  5. import android.app.ActionBar.TabListener;
  6. import android.app.Activity;
  7. import android.app.Fragment;
  8. import android.app.FragmentManager;
  9. import android.app.FragmentTransaction;
  10. import android.os.Bundle;
  11. import android.view.LayoutInflater;
  12. import android.view.MenuItem;
  13. import android.view.View;
  14. import android.view.ViewGroup;
  15. import android.view.ViewGroup.LayoutParams;
  16. import android.widget.ImageView;
  17.  
  18. public class TabNavigationActivity extends Activity implements TabListener {
  19.  
  20. @Override
  21. protected void onCreate(Bundle savedInstanceState) {
  22. super.onCreate(savedInstanceState);
  23. setContentView(R.layout.activity_tab);
  24.  
  25. /* 获取 ActionBar */
  26. ActionBar actionBar = getActionBar();
  27.  
  28. /* 设置 ActionBar 的导航方式
  29. * -- ActionBar.NAVIGATION_MODE_TABS : Tab 导航
  30. * -- ActionBar.NAVIGATION_MODE_LIST : List 导航
  31. * -- ActionBar.NAVIGATION_MODE_STANDARD : 普通导航 */
  32. actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
  33.  
  34. /* 设置 ActionBar 左侧图标可点击, 添加箭头 */
  35. actionBar.setDisplayHomeAsUpEnabled(true);
  36.  
  37. Tab tab1 = actionBar.newTab().setText("第一页").setTabListener(this);
  38. Tab tab2 = actionBar.newTab().setText("第二页").setTabListener(this);
  39. Tab tab3 = actionBar.newTab().setText("第三页").setTabListener(this);
  40.  
  41. actionBar.addTab(tab1);
  42. actionBar.addTab(tab2);
  43. actionBar.addTab(tab3);
  44.  
  45. }
  46.  
  47. @Override
  48. public boolean onOptionsItemSelected(MenuItem item) {
  49. int id = item.getItemId();
  50. switch (id) {
  51. /* 设置的点击图标按钮回退 */
  52. case android.R.id.home:
  53. finish();
  54. break;
  55.  
  56. default:
  57. break;
  58. }
  59.  
  60. return super.onOptionsItemSelected(item);
  61. }
  62.  
  63. @Override
  64. public void onTabSelected(Tab tab, FragmentTransaction ft) {
  65. Fragment fragment = new TabFragment();
  66.  
  67. /* 设置参数传递 */
  68. Bundle bundle = new Bundle();
  69. bundle.putInt(TabFragment.key, tab.getPosition() + 1);
  70. fragment.setArguments(bundle);
  71.  
  72. /* 创建 Fragment 管理器 */
  73. FragmentManager manager = getFragmentManager();
  74. /* 开启事务 */
  75. FragmentTransaction transaction = manager.beginTransaction();
  76. transaction.replace(R.id.holder, fragment);
  77. transaction.commit();
  78. }
  79.  
  80. /**
  81. * Tab 取消选中时回调
  82. */
  83. @Override
  84. public void onTabUnselected(Tab tab, FragmentTransaction ft) {
  85. }
  86. /**
  87. * Tab 释放时回调
  88. */
  89. @Override
  90. public void onTabReselected(Tab tab, FragmentTransaction ft) {
  91. }
  92.  
  93. public static class TabFragment extends Fragment{
  94. public static final String key = "key";
  95.  
  96. @Override
  97. public View onCreateView(LayoutInflater inflater, ViewGroup container,
  98. Bundle savedInstanceState) {
  99. /* 获取该 Fragment 被嵌入的 上下文对象 */
  100. Activity activity = getActivity();
  101.  
  102. /* 获取从 Activity 传入的数据 */
  103. Bundle bundle = getArguments();
  104. int tab = bundle.getInt(key);
  105.  
  106. /* 设置一个充满全屏的图片 */
  107. ImageView imageView = new ImageView(activity);
  108. LayoutParams layoutParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
  109. imageView.setLayoutParams(layoutParams);
  110. switch (tab) {
  111. case 1:
  112. imageView.setImageResource(R.drawable.a);
  113. break;
  114. case 2:
  115. imageView.setImageResource(R.drawable.b);
  116. break;
  117. case 3:
  118. imageView.setImageResource(R.drawable.c);
  119. break;
  120.  
  121. default:
  122. break;
  123. }
  124.  
  125. return imageView;
  126. }
  127.  
  128. }
  129.  
  130. }

(2) 布局文件代码

activity_tab.xml 代码 :

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

(3) 执行效果

六. ActionBar 实现下拉式导航

1. ActionBar 相关方法

a .设置 List 导航方式

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

代码示例 :

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

b. 创建一个 SpinnerAdapter

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

代码示例 :

  1. /* 设置标题 */
  2. String[] strs = new String[]{"第一页", "第二页", "第三页"};
  3. /* 设置 List导航 适配器 */
  4. 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);

-- 代码示例 :

  1. public class ListNavigationActivity extends Activity implements ActionBar.OnNavigationListener {
  2.  
  3. @Override
  4. public boolean onNavigationItemSelected(int itemPosition, long itemId) {
  5. /* 创建 Fragement */
  6. Fragment fragment = new TabFragment();
  7.  
  8. /* 设置 Fragement 参数 */
  9. Bundle bundle = new Bundle();
  10. bundle.putInt(TabFragment.key, itemPosition + 1);
  11. fragment.setArguments(bundle);
  12.  
  13. /* 置换 Fragement */
  14. FragmentManager manager = getFragmentManager();
  15. FragmentTransaction transaction = manager.beginTransaction();
  16. transaction.replace(R.id.list_holder, fragment);
  17. transaction.commit();
  18.  
  19. return true;
  20. }
  21.  
  22. }

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

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

2. 代码示例

(1) Activity 示例

ListNavigationActivity.java 代码示例 :

  1. package cn.org.octopus.action_bar;
  2.  
  3. import android.app.ActionBar;
  4. import android.app.Activity;
  5. import android.app.Fragment;
  6. import android.app.FragmentManager;
  7. import android.app.FragmentTransaction;
  8. import android.os.Bundle;
  9. import android.view.MenuItem;
  10. import android.widget.ArrayAdapter;
  11. import android.widget.SpinnerAdapter;
  12.  
  13. public class ListNavigationActivity extends Activity implements ActionBar.OnNavigationListener {
  14.  
  15. @Override
  16. protected void onCreate(Bundle savedInstanceState) {
  17. super.onCreate(savedInstanceState);
  18. setContentView(R.layout.activity_list);
  19.  
  20. /* 获取 ActionBar */
  21. ActionBar actionBar = getActionBar();
  22.  
  23. /* 设置 ActionBar 的导航方式
  24. * -- ActionBar.NAVIGATION_MODE_TABS : Tab 导航
  25. * -- ActionBar.NAVIGATION_MODE_LIST : List 导航
  26. * -- ActionBar.NAVIGATION_MODE_STANDARD : 普通导航 */
  27. actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
  28.  
  29. /* 设置 ActionBar 左侧图标可点击, 添加箭头 */
  30. actionBar.setDisplayHomeAsUpEnabled(true);
  31.  
  32. /* 设置标题 */
  33. String[] strs = new String[]{"第一页", "第二页", "第三页"};
  34. /* 设置 List导航 适配器 */
  35. SpinnerAdapter adapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_list_item_1, android.R.id.text1, strs);
  36. /* 为 ActionBar 设置适配器和回调接口 */
  37. actionBar.setListNavigationCallbacks(adapter, this);
  38. }
  39.  
  40. @Override
  41. public boolean onNavigationItemSelected(int itemPosition, long itemId) {
  42. /* 创建 Fragement */
  43. Fragment fragment = new TabFragment();
  44.  
  45. /* 设置 Fragement 参数 */
  46. Bundle bundle = new Bundle();
  47. bundle.putInt(TabFragment.key, itemPosition + 1);
  48. fragment.setArguments(bundle);
  49.  
  50. /* 置换 Fragement */
  51. FragmentManager manager = getFragmentManager();
  52. FragmentTransaction transaction = manager.beginTransaction();
  53. transaction.replace(R.id.list_holder, fragment);
  54. transaction.commit();
  55.  
  56. return true;
  57. }
  58.  
  59. @Override
  60. public boolean onOptionsItemSelected(MenuItem item) {
  61. int id = item.getItemId();
  62. switch (id) {
  63. /* 设置的点击图标按钮回退 */
  64. case android.R.id.home:
  65. finish();
  66. break;
  67.  
  68. default:
  69. break;
  70. }
  71.  
  72. return super.onOptionsItemSelected(item);
  73. }
  74. }

(2) 执行效果

作者 : 万境绝尘 (octopus_truth@163.com)

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

示例代码下载 : 

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

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

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

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

    程序猿学英语就上视觉英语网 Android程序开发0基础教程(一)   平台简单介绍   令人激动的Google手机操作系统平台-Android在2007年11月13日正式公布了,这是一个开放源码的操 ...

  2. 快速接入 Android BLE 开发的基础框架

    代码地址如下:http://www.demodashi.com/demo/12092.html ** Android BLE基础操作框架,基于回调,操作简单.包含扫描.多连接.广播包解析.服务读写及通 ...

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

    前言:本来我是做电视应用的,但是因为公司要出手机,人员紧张,所以就抽调我去支援一下,谁叫俺是雷锋呢!我做的一个功能就是处理手机中的应用ICON,处理无非就是美化一下,重新与底板进行合成和裁剪,用到了很 ...

  4. [Android] 环境配置之基础开发环境(SDK/Android Studio)(转)

    [Android] 环境配置之基础开发环境(SDK/Android Studio)   博客: blog.csdn.net/qiujuer 网站: www.qiujuer.net 开源库: Geniu ...

  5. Android应用开发基础篇(1)-----Button

    Android应用开发基础篇(1)-----Button   一.概述        Button,顾名思义就是按钮的意思,它主要的功能是响应用户按下按钮时的动作. 二.应用      新建一个工程, ...

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

    转载于:https://blog.csdn.net/aqi00/article/details/73065392 资源下载 下面是<Android Studio开发实战 从零基础到App上线&g ...

  7. 20155305 2016-2017-2 《Java程序设计》实验四 Android程序开发基础

    实验四 Android开发基础 实验内容 基于Android Studio开发简单的Android应用并部署测试; 了解Android.组件.布局管理器的使用: 掌握Android中事件处理机制 实验 ...

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

    原文:Android零基础入门第16节:Android用户界面开发概述 相信通过前面15期的学习,Android的开发环境已经基本掌握了,如果仍有问题,欢迎到Android零基础入门技术讨论微信群交流 ...

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

    Android音频开发(1):基础知识 导读 人的说话频率基本上为300Hz~3400Hz,但是人耳朵听觉频率基本上为20Hz~20000Hz. 对于人类的语音信号而言,实际处理一般经过以下步骤: 人 ...

随机推荐

  1. c++类的声明

    就像函数的声明与定义分离一样,我们也可以仅声明类而暂时不定义类: class ClassName;//ClassName类的声明 这种声明有时被称作前向声明 对于一个类来说,我们创建它的对象之前该类必 ...

  2. 多表insert操作详解

    --1.无条件的多表insert all ; ; ; --没有条件,向多个目标表全量插入,必须有all insert all --不指定emp_1后面的列,也不指定values,那么emp_1中的所有 ...

  3. [self init]

    在字典转模型中遇到了这样的代码: #import "HMAppInfo.h" @implementation HMAppInfo - (instancetype)initWithD ...

  4. MongoDB Java

    MongoDB Java 环境配置 在Java程序中如果要使用MongoDB,你需要确保已经安装了Java环境及MongoDB JDBC 驱动. 你可以参考本站的Java教程来安装Java程序.现在让 ...

  5. IntelliJ IDEA下Git的配置与使用(命令行下)

    1. 安装Git并配置好Git 安装与配置参见Git与码云(Git@OSC)入门-如何在实验室和宿舍同步你的代码(1)中的2.在本机安装Git与3.1 配置git. 2. 创建远程仓库 在gitee. ...

  6. Android Support库——support annotations

    Android Support库是官方出的支持扩展库,包含了丰富的组件.工具类等,通过在Android SDK Manager中勾选以下两项来获取到. 其中,Android Support Libra ...

  7. Bootstrap3 排版-缩略语

    当鼠标悬停在缩写和缩写词上时就会显示完整内容,Bootstrap 实现了对 HTML 的 <abbr> 元素的增强样式.缩略语元素带有 title 属性,外观表现为带有较浅的虚线框,鼠标移 ...

  8. Bootstrap3 排版-对齐

    通过文本对齐类,可以简单方便的将文字重新对齐. Left aligned text. Center aligned text. Right aligned text. Justified text. ...

  9. 微信开发获取地理位置实例(java,非常详细,附工程源码)

    在本篇博客之前,博主已经写了4篇关于微信相关文章,其中三篇是本文基础: 1.微信开发之入门教程,该文章详细讲解了企业号体验号免费申请与一些必要的配置,以及如何调用微信接口. 2.微信开发之通过代理调试 ...

  10. JAVA面向对象-----抽象类

    1抽象类 为什么使用抽象类 1:定义Dog类 有颜色属性和叫的方法 2:定义Bird类 有颜色属性和叫的方法 3:定义其父类Animal 1:颜色的属性可以使用默认初始化值. 2:叫的方法在父类中如何 ...