Android ActionBar 一步一步分析 (转)

原文摘自:http://blog.csdn.net/android2me/article/details/8874846

1.Action Bar 介绍

我们能在应用中看见的actionbar一般就是下图的样子,比如快图应用

1.App icon 应用的图标,左侧带应用相当于back返回键

2.ViewControl

3.Action button 相当于普通的Button可以监听点击事件

4.Action overflow 三个点,相当于手机上的menu键,可以显示隐藏的action button

下面是一个简单的关于Action Bar的例子:

  1. package com.example.demo_actionbarbasic;
  2. import com.example.demo_actionbarbasic.R;
  3. import android.app.ActionBar;
  4. import android.app.Activity;
  5. import android.content.Intent;
  6. import android.os.Bundle;
  7. import android.view.Menu;
  8. import android.view.MenuItem;
  9. import android.widget.Toast;
  10. public class MainActivity extends Activity {
  11. private MenuItem menuItem = null;
  12. @Override
  13. protected void onCreate(Bundle savedInstanceState) {
  14. super.onCreate(savedInstanceState);
  15. setContentView(R.layout.activity_main);
  16. // 通过hilde()和show()方法可以控制actionbar的隐藏和显示
  17. // ActionBar actionBar = getActionBar();
  18. // actionBar.hide();
  19. // actionBar.show();
  20. }
  21. // 我们可以看到,actonbar的用法跟选项菜单是一样的
  22. @Override
  23. public boolean onCreateOptionsMenu(Menu menu) {
  24. // Inflate the menu; this adds items to the action bar if it is present.
  25. getMenuInflater().inflate(R.menu.activity_main, menu);
  26. return true;
  27. }
  28. @Override
  29. public boolean onOptionsItemSelected(MenuItem item) {
  30. switch (item.getItemId()) {
  31. case R.id.action_refresh:
  32. Toast.makeText(this, "Menu Item refresh selected",
  33. Toast.LENGTH_SHORT).show();
  34. break;
  35. case R.id.action_about:
  36. Toast.makeText(this, "Menu Item about selected", Toast.LENGTH_SHORT)
  37. .show();
  38. break;
  39. case R.id.action_edit:
  40. Toast.makeText(this, "Menu Item edit selected", Toast.LENGTH_SHORT)
  41. .show();
  42. break;
  43. case R.id.action_search:
  44. Toast.makeText(this, "Menu Item search selected",
  45. Toast.LENGTH_SHORT).show();
  46. break;
  47. case R.id.action_help:
  48. Toast.makeText(this, "Menu Item  settings selected",
  49. Toast.LENGTH_SHORT).show();
  50. break;
  51. default:
  52. break;
  53. }
  54. return super.onOptionsItemSelected(item);
  55. }
  56. }
  1. <menu xmlns:android="http://schemas.android.com/apk/res/android" >
  2. <item
  3. android:id="@+id/menu_settings"
  4. android:orderInCategory="100"
  5. android:showAsAction="never"
  6. android:title="settings"/>
  7. <item
  8. android:id="@+id/action_refresh"
  9. android:icon="@drawable/navigation_refresh"
  10. android:orderInCategory="101"
  11. android:showAsAction="ifRoom|withText"
  12. android:title="refresh"/>
  13. <item
  14. android:id="@+id/action_about"
  15. android:icon="@drawable/action_about"
  16. android:orderInCategory="101"
  17. android:showAsAction="ifRoom"
  18. android:title="about"/>
  19. <item
  20. android:id="@+id/action_search"
  21. android:icon="@drawable/action_search"
  22. android:orderInCategory="103"
  23. android:showAsAction="ifRoom"/>
  24. <item
  25. android:id="@+id/action_edit"
  26. android:icon="@android:drawable/ic_menu_edit"
  27. android:orderInCategory="105"
  28. android:showAsAction="ifRoom"
  29. android:title="edit"/>
  30. <item
  31. android:id="@+id/action_help"
  32. android:showAsAction="always"
  33. android:title="help"/>
  34. <item
  35. android:id="@+id/action_email"
  36. android:icon="@android:drawable/ic_dialog_email"
  37. android:orderInCategory="106"
  38. android:showAsAction="ifRoom"
  39. android:title="email"/>
  40. </menu>

onCreateOptionsMenu()方法用来加载menu文件夹中定义的xml文件,用来显示action bar。onOptionsItemSelected()方法用来加入点击事件。

效果图:

        

左图的效果我们看到只能显示两个action button,由于屏幕的空间有限,其他的action button会被隐藏。横屏的时候我们可以显示4个,还有3个被隐藏起来了。当我们按手机上的更多键时可以显示出来关于action button的文字信息,一定要在item标签中加入title属性。

android:showAsAction="ifRoom"ifRomm表示有空间的时候显示。

android:showAsAction="always"表示总是显示

android:showAsAction="ifRoom|withText"有空间的时候同时显示title标题

其他属性可以自己试试。

2.显示3个点的更多action button

从上面的代码我们知道,即使我们横屏也显示不出全部action button。我们可以加入3个点的action button来用下拉显示的方式,显示跟多的action button。在网上的信息得知,只要你的手机有menu键actionbar就不会显示3个点的更多或者说3个点的menu按钮。从上面的代码我们知 道,即使我们横屏也显示不出全部action button。我们可以加入3个点的action button来用下拉显示的方式,显示跟多的action button。在网上的信息得知,只要你的手机有menu键actionbar就不会显示3个点的更多或者说3个点的menu按钮。

  1. private void getOverflowMenu() {
  2. try {
  3. ViewConfiguration config = ViewConfiguration.get(this);
  4. Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey");
  5. if(menuKeyField != null) {
  6. menuKeyField.setAccessible(true);
  7. menuKeyField.setBoolean(config, false);
  8. }
  9. } catch (Exception e) {
  10. e.printStackTrace();
  11. }
  12. }

在onCreat()方法中调用这个方法可以显示3个点的menu按钮。下图是按下3个点的action button的效果

 

代码:Demo_ActionBar3dot

动态action button

用到了MenuItem 类的,setActionView()和collapseActionView()这两个方法。 这个例子的效果是当我们点击refresh action button的时候会显示进度条。

  1. package com.example.demo_actionbar;
  2. import android.app.ActionBar;
  3. import android.app.Activity;
  4. import android.content.Intent;
  5. import android.os.AsyncTask;
  6. import android.os.Bundle;
  7. import android.view.KeyEvent;
  8. import android.view.Menu;
  9. import android.view.MenuItem;
  10. import android.widget.EditText;
  11. import android.widget.ProgressBar;
  12. import android.widget.TextView;
  13. import android.widget.TextView.OnEditorActionListener;
  14. import android.widget.Toast;
  15. public class MainActivity extends Activity {
  16. private MenuItem menuItem = null;
  17. @Override
  18. protected void onCreate(Bundle savedInstanceState) {
  19. super.onCreate(savedInstanceState);
  20. setContentView(R.layout.activity_main);
  21. }
  22. @Override
  23. public boolean onCreateOptionsMenu(Menu menu) {
  24. // Inflate the menu; this adds items to the action bar if it is present.
  25. getMenuInflater().inflate(R.menu.activity_main, menu);
  26. return true;
  27. }
  28. @Override
  29. public boolean onOptionsItemSelected(MenuItem item) {
  30. // TODO Auto-generated method stub
  31. switch (item.getItemId()) {
  32. case R.id.action_refresh:
  33. menuItem = item;
  34. menuItem.setActionView(R.layout.progressbar);
  35. TestTask task = new TestTask();
  36. task.execute("test");
  37. break;
  38. case R.id.action_about:
  39. Toast.makeText(this, "Menu Item about selected", Toast.LENGTH_SHORT)
  40. .show();
  41. break;
  42. default:
  43. break;
  44. }
  45. return super.onOptionsItemSelected(item);
  46. }
  47. private class TestTask extends AsyncTask<String, Void, String> {
  48. @Override
  49. protected String doInBackground(String... params) {
  50. // Simulate something long running
  51. try {
  52. Thread.sleep(2000);
  53. } catch (InterruptedException e) {
  54. e.printStackTrace();
  55. }
  56. return null;
  57. }
  58. @Override
  59. protected void onPostExecute(String result) {
  60. menuItem.collapseActionView(); // 这个方法需要 API 14 以上
  61. menuItem.setActionView(null);
  62. }
  63. };
  64. }

Actionbar之spinner实现drop-down Navigation

1.首先需要一个SpinnerAdapter设置下拉item的内容和显示的layout

2.实现ActionBar.OnNavigationListener这个接口,接口中有点击item的事件
3.设置navigation mode例如
ActionBar actionBar = getActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
4.用 setListNavigationCallbacks()方法来实现下拉选项,例如
actionBar.setListNavigationCallbacks(mSpinnerAdapter, mNavigationCallback);

效果图:

代码:

  1. package in.wptrafficanalyzer.actionbardropdownnavigation;
  2. import android.app.ActionBar;
  3. import android.app.ActionBar.OnNavigationListener;
  4. import android.app.Activity;
  5. import android.os.Bundle;
  6. import android.widget.ArrayAdapter;
  7. import android.widget.Toast;
  8. public class MainActivity extends Activity {
  9. /** An array of strings to populate dropdown list */
  10. String[] actions = new String[] { "Bookmark", "Subscribe", "Share" };
  11. /** Called when the activity is first created. */
  12. @Override
  13. public void onCreate(Bundle savedInstanceState) {
  14. super.onCreate(savedInstanceState);
  15. setContentView(R.layout.main);
  16. /** Create an array adapter to populate dropdownlist */
  17. ArrayAdapter<String> adapter = new ArrayAdapter<String>(
  18. getBaseContext(),
  19. android.R.layout.simple_spinner_dropdown_item, actions);
  20. /** Enabling dropdown list navigation for the action bar */
  21. getActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
  22. /** Defining Navigation listener */
  23. ActionBar.OnNavigationListener navigationListener = new OnNavigationListener() {
  24. @Override
  25. public boolean onNavigationItemSelected(int itemPosition,
  26. long itemId) {
  27. Toast.makeText(getBaseContext(),
  28. "You selected : " + actions[itemPosition],
  29. Toast.LENGTH_SHORT).show();
  30. return false;
  31. }
  32. };
  33. /**
  34. * Setting dropdown items and item navigation listener for the actionbar
  35. */
  36. getActionBar().setListNavigationCallbacks(adapter, navigationListener);
  37. }
  38. }

代码下载:Demo_ActionBarDropdownNavigation

Action Bar之Contextual action bar

    

两张图,前一张是没有显示contextual action bar 的时候,后面那张是用户长点击EditText显示contextual action bar的效果。contextual action bar 也能加入menu item 并对menu item 进行监听。在contextual action bar 中显示 menu item 需要在 /res/menu/ 文件夹中加入布局文件。

代码:

  1. package com.example.demo_actionbarcontextual;
  2. import com.example.demo_actionbarcontextual.R;
  3. import android.app.Activity;
  4. import android.os.Bundle;
  5. import android.view.ActionMode;
  6. import android.view.Menu;
  7. import android.view.MenuInflater;
  8. import android.view.MenuItem;
  9. import android.view.View;
  10. import android.widget.Toast;
  11. public class MainActivity extends Activity {
  12. protected Object mActionMode;
  13. @Override
  14. public void onCreate(Bundle savedInstanceState) {
  15. super.onCreate(savedInstanceState);
  16. setContentView(R.layout.activity_main);
  17. View view = findViewById(R.id.myView);
  18. // 对EditText设置长点击事件,用来显示 contextual action bar
  19. view.setOnLongClickListener(new View.OnLongClickListener() {
  20. public boolean onLongClick(View view) {
  21. if (mActionMode != null) {
  22. return false;
  23. }
  24. // Start the Contextual Action Bar using the ActionMode.Callback defined above
  25. mActionMode = MainActivity.this
  26. .startActionMode(mActionModeCallback);
  27. view.setSelected(true);
  28. return true;
  29. }
  30. });
  31. }
  32. @Override
  33. public boolean onCreateOptionsMenu(Menu menu) {
  34. MenuInflater inflater = getMenuInflater();
  35. inflater.inflate(R.menu.mainmenu, menu);
  36. return true;
  37. }
  38. @Override
  39. public boolean onOptionsItemSelected(MenuItem item) {
  40. Toast.makeText(this, "Just a test", Toast.LENGTH_SHORT).show();
  41. return true;
  42. }
  43. private ActionMode.Callback mActionModeCallback = new ActionMode.Callback() {
  44. // Called when the action mode is created; startActionMode() was called
  45. public boolean onCreateActionMode(ActionMode mode, Menu menu) {
  46. // Inflate a menu resource providing context menu items
  47. MenuInflater inflater = mode.getMenuInflater();
  48. // R.menu.contextual 是 contextual action bar 的布局文件, 在 /res/menu/ 文件夹下
  49. inflater.inflate(R.menu.contextual, menu);
  50. return true;
  51. }
  52. // Called each time the action mode is shown. Always called after
  53. // onCreateActionMode, but
  54. // may be called multiple times if the mode is invalidated.
  55. public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
  56. return false; // Return false if nothing is done
  57. }
  58. // 当用户点击 contextual action bar 的 menu item 的时候产生点击事件
  59. public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
  60. switch (item.getItemId()) {
  61. case R.id.toast:
  62. Toast.makeText(MainActivity.this, "Selected menu",
  63. Toast.LENGTH_LONG).show();
  64. mode.finish(); // 关闭 contextual action bar
  65. return true;
  66. default:
  67. return false;
  68. }
  69. }
  70. // Called when the user exits the action mode
  71. public void onDestroyActionMode(ActionMode mode) {
  72. mActionMode = null;
  73. }
  74. };
  75. }

下载:Demo_ActionBarContextual

Action bar 之 navigation tabs

左图是竖直屏幕的效果,右图是横屏的效果:

  

代码:

  1. package de.arvidg.exampleactionbartabs;
  2. import android.app.ActionBar;
  3. import android.app.ActionBar.Tab;
  4. import android.app.Activity;
  5. import android.app.Fragment;
  6. import android.app.FragmentTransaction;
  7. import android.content.Context;
  8. import android.os.Bundle;
  9. import android.util.Log;
  10. import android.view.Menu;
  11. import android.view.MenuInflater;
  12. import android.view.MenuItem;
  13. import android.widget.Toast;
  14. public class StartActivity extends Activity {
  15. public static Context appContext;
  16. /** Called when the activity is first created. */
  17. @Override
  18. public void onCreate(Bundle savedInstanceState) {
  19. super.onCreate(savedInstanceState);
  20. setContentView(R.layout.main);
  21. appContext = getApplicationContext();
  22. // ActionBar
  23. ActionBar actionbar = getActionBar();
  24. // 设置action bar 的 navigation mode
  25. actionbar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
  26. // 添加 action bar 的 tabs
  27. ActionBar.Tab PlayerTab = actionbar.newTab().setText("Fragment A");
  28. ActionBar.Tab StationsTab = actionbar.newTab().setText("Fragment B");
  29. // 实例化 fragment action bar 是用 fragment 来显示的
  30. Fragment PlayerFragment = new AFragment();
  31. Fragment StationsFragment = new BFragment();
  32. // 对 tabs 设置监听事件
  33. PlayerTab.setTabListener(new MyTabsListener(PlayerFragment));
  34. StationsTab.setTabListener(new MyTabsListener(StationsFragment));
  35. // 最后把 tabs 加入监听事件
  36. actionbar.addTab(PlayerTab);
  37. actionbar.addTab(StationsTab);
  38. }
  39. @Override
  40. public boolean onCreateOptionsMenu(Menu menu) {
  41. MenuInflater inflater = getMenuInflater();
  42. inflater.inflate(R.menu.main, menu);
  43. return true;
  44. }
  45. @Override
  46. public boolean onOptionsItemSelected(MenuItem item) {
  47. switch (item.getItemId()) {
  48. case R.id.menuitem_search:
  49. Toast.makeText(appContext, "search", Toast.LENGTH_SHORT).show();
  50. return true;
  51. case R.id.menuitem_add:
  52. Toast.makeText(appContext, "add", Toast.LENGTH_SHORT).show();
  53. return true;
  54. case R.id.menuitem_share:
  55. Toast.makeText(appContext, "share", Toast.LENGTH_SHORT).show();
  56. return true;
  57. case R.id.menuitem_feedback:
  58. Toast.makeText(appContext, "feedback", Toast.LENGTH_SHORT).show();
  59. return true;
  60. case R.id.menuitem_about:
  61. Toast.makeText(appContext, "about", Toast.LENGTH_SHORT).show();
  62. return true;
  63. case R.id.menuitem_quit:
  64. Toast.makeText(appContext, "quit", Toast.LENGTH_SHORT).show();
  65. return true;
  66. }
  67. return false;
  68. }
  69. // @Override
  70. // protected void onSaveInstanceState(Bundle outState) {
  71. // super.onSaveInstanceState(outState);
  72. // outState.putInt("tab", getActionBar().getSelectedNavigationIndex());
  73. // }
  74. }
  75. // 实例化 tabs 的监听类
  76. class MyTabsListener implements ActionBar.TabListener {
  77. public Fragment fragment;
  78. // 传入监听的 tab 的 fragment
  79. public MyTabsListener(Fragment fragment) {
  80. this.fragment = fragment;
  81. }
  82. // 重复两次以上点击 tab
  83. @Override
  84. public void onTabReselected(Tab tab, FragmentTransaction ft) { // ft 用来控制 fragment
  85. Toast.makeText(StartActivity.appContext, "Reselected!",
  86. Toast.LENGTH_SHORT).show();
  87. }
  88. // 就点击一次
  89. @Override
  90. public void onTabSelected(Tab tab, FragmentTransaction ft) {
  91. ft.replace(R.id.fragment_container, fragment);
  92. }
  93. // 不点击
  94. @Override
  95. public void onTabUnselected(Tab tab, FragmentTransaction ft) {
  96. ft.remove(fragment);
  97. }

Action bar 之 ShareActionProvider

1.首先要在menu布局文件的item标签中加入
android:actionProviderClass="android.widget.ShareActionProvider"
2.得到ShareActionProvider的实例
provider = (ShareActionProvider) menu.findItem(R.id.menu_share)
.getActionProvider();
3.设置Intent
效果图:

代码:

  1. package com.example.demo_shareactionprovider;
  2. import android.os.Bundle;
  3. import android.app.Activity;
  4. import android.content.Intent;
  5. import android.view.Menu;
  6. import android.view.MenuItem;
  7. import android.widget.ShareActionProvider;
  8. public class MainActivity extends Activity {
  9. ShareActionProvider provider = null;
  10. @Override
  11. protected void onCreate(Bundle savedInstanceState) {
  12. super.onCreate(savedInstanceState);
  13. setContentView(R.layout.activity_main);
  14. }
  15. @Override
  16. public boolean onCreateOptionsMenu(Menu menu) {
  17. // Inflate the menu; this adds items to the action bar if it is present.
  18. getMenuInflater().inflate(R.menu.activity_main, menu);
  19. // Get the ActionProvider
  20. provider = (ShareActionProvider) menu.findItem(R.id.menu_share)
  21. .getActionProvider();
  22. // Initialize the share intent
  23. Intent intent = new Intent(Intent.ACTION_SEND);
  24. intent.setType("text/plain");
  25. intent.putExtra(Intent.EXTRA_TEXT, "Text I want to share");
  26. provider.setShareIntent(intent);
  27. return true;
  28. }
  29. @Override
  30. public boolean onOptionsItemSelected(MenuItem item) {
  31. switch (item.getItemId()) {
  32. case R.id.menu_share:
  33. break;
  34. default:
  35. break;
  36. }
  37. return super.onOptionsItemSelected(item);
  38. }
  39. }

/res/menu/activity_main.xml

  1. <menu xmlns:android="http://schemas.android.com/apk/res/android" >
  2. <item
  3. android:id="@+id/menu_share"
  4. android:actionProviderClass="android.widget.ShareActionProvider"
  5. android:showAsAction="ifRoom"
  6. android:title="Share"/>
  7. <item
  8. android:id="@+id/item1"
  9. android:icon="@android:drawable/ic_menu_call"
  10. android:showAsAction="ifRoom"
  11. android:title="">
  12. </item>
  13. </menu>

The ShareActionProvider now handles all user interaction with the item and you do not need to handle click events from the onOptionsItemSelected() callback method.
上面是官方文档上给的: 就是说无需在onOptionsItemSelected()这个回调方法中再去处理了。

代码:Demo_ShareActionProvider

Action Bar 之 style

你可以用android的style和theme来自定义action bar的风格和主题

android:windowActionBarOverlay 这个属性是用来定义actionbar和其下方视图的位置关系的。默认false,当设置成true时,表示activity layout 就是说你的下方的视图将覆盖整个屏幕。这样设置的好处就是说,当你隐藏action bar的时候,视图不会改变位置。当我们把action bar设置成半透明的时候,我们也能看见其下面的内容,这样的界面对用户来说更加有好。

<SomeView  android:layout_marginTop="?android:attr/actionBarSize" />

上面这个属性可以设置activity layout距离屏幕顶端的距离。这样设置可以防止被action bar覆盖下方内容。

下面是一个简单的关于如何改变antion bar 字体、分割图片、背景的一个style

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <resources>
  3. <!-- the theme applied to the application or activity -->
  4. <style name="CustomActivityTheme" parent="@android:style/Theme.Holo">
  5. <item name="android:actionBarTabTextStyle">@style/CustomTabTextStyle</item>
  6. <item name="android:actionBarDivider">@drawable/ab_divider</item>
  7. <item name="android:actionBarItemBackground">@drawable/ab_item_background</item>
  8. </style>
  9. <!-- style for the action bar tab text -->
  10. <style name="CustomTabTextStyle" parent="@android:style/TextAppearance.Holo">
  11. <item name="android:textColor">#2456c2</item>
  12. </style>
  13. </resources>

能设置的关于action bar的风格(style)的属性有:

android:actionButtonStyle // Defines a style resource for the action item buttons.

android:actionBarItemBackground //Defines a drawable resource for each action item‘s background. (Addedin API level 14.)

android:itemBackground // Defines a drawable resource for each overflow menu item‘s background.

android:actionBarDivider // Defines a drawable resource for the divider between action items.(Added in API level 14.)

android:actionMenuTextColor //Defines a color for text that appears in an action item.

android:actionMenuTextAppearance //Defines a style resource for text that appears in an action item.

android:actionBarWidgetTheme //Defines a theme resource for widgets that are inflated into the actionbar as action views. (Added in API level 14.)

下面的网址是源码中的styles.xml和themes.xml文件,包含了系统中所有的样式和主题。根据自己的需要可以改变action bar的显示风格。

https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/res/res/values/styles.xml

https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/res/res/values/themes.xml

例子1:怎么改变tab的字体大小、字体颜色等

      1. <pre name="code" class="html">在themes.xml文件中关于tab的属性有:</pre><br>
      2. <br>
      3. <pre></pre>
      4. <pre name="code" class="html">android:actionBarTabStyle // Defines a style resource for tabs in the action bar.</pre>android:actionBarTabBarStyle // Defines a style resource for the thin bar that appears below the navigation tabs.<br>
      5. android:actionBarTabTextStyle //Defines a style resource for text in the navigation tabs.
      6. <p><br>
      7. </p>
      8. <p>在themes.xml文件中找到:</p>
      9. <p></p>
      10. <p></p>
      11. <pre name="code" class="html"><itemnameitemname="actionBarTabTextStyle">@style/Widget.Holo.Light.ActionBar.TabText</item></pre>
      12. <p></p>
      13. <p>在style.xml文件中找到</p>
      14. <pre name="code" class="html"><style name="Widget.Holo.Light.ActionBar.TabText" parent="Widget.Holo.ActionBar.TabText">
      15. </pre>
      16. <p><br>
      17. </p>
      18. 在style.xml文件中通过Widget.Holo.ActionBar.TabText,我们可以找到下面<br>
      19. <pre name="code" class="html"><style name="Widget.Holo.ActionBar.TabText" parent="Widget.ActionBar.TabText">
      20. <item name="android:textAppearance">@style/TextAppearance.Holo.Medium</item>
      21. <item name="android:textColor">?android:attr/textColorPrimary</item>
      22. <item name="android:textSize">12sp</item>
      23. <item name="android:textStyle">bold</item>
      24. <item name="android:textAllCaps">true</item>
      25. <item name="android:ellipsize">marquee</item>
      26. <item name="android:maxLines">2</item>
      27. </style>
      28. </pre>
      29. <p><br>
      30. </p>
      31. <p>下面是我们工程中styles.xml的内容:<br>
      32. </p>
      33. <pre name="code" class="html"><?xml version="1.0" encoding="utf-8"?>
      34. <resources xmlns:android="http://schemas.android.com/apk/res/android">
      35. <style name="CustomActivityThemo" parent="@android:style/Theme.Holo.Light">
      36. <item name="android:actionBarTabTextStyle">@style/CustomTabTextStyle</item>
      37. </style>
      38. <style name="CustomTabTextStyle" parent="@android:style/Widget.ActionBar.TabText">
      39. <item name="android:textSize">25sp</item>
      40. <item name="android:textColor">#FF0000</item>
      41. <item name="android:textStyle">italic|bold</item>
      42. </style>
      43. </resources>
      44. </pre><br>
      45. 我们必须在manifest.xml文件中的activity标签中设置<br>
      46. <br>
      47. <p></p>
      48. <pre name="code" class="html"><activity
      49. <span style="white-space:pre">  </span>android:theme="@style/CustomActivityThemo" ></pre><pre name="code" class="html"><span style="white-space:pre">    </span>....
      50. </activity>
      51. </pre>
      52. <p></p>
      53. <p><br>
      54. </p>
      55. 代码:Demo_ActionBarTabsColor<br>
      56. <p><br>
      57. </p>
      58. <p>例子2:改变action bar中tab的indicator(下面的那条横线)的颜色<br>
      59. styles.xml文件内容:</p>
      60. <p><br>
      61. </p>
      62. <pre name="code" class="html"><?xml version="1.0" encoding="utf-8"?>
      63. <resources xmlns:android="http://schemas.android.com/apk/res/android">
      64. <!-- the theme applied to the application or activity -->
      65. <style name="CustomActivityTheme" parent="@android:style/Theme.Holo.Light">
      66. <item name="android:actionBarTabTextStyle">@style/CustomTabTextStyle</item>
      67. <item name="android:actionBarTabBarStyle">@android:color/holo_orange_dark</item>
      68. <item name="android:actionBarTabStyle">@style/ActionBarTabStyle.Example</item>
      69. </style>
      70. <!-- style for the action bar tab text -->
      71. <style name="CustomTabTextStyle" parent="@android:style/TextAppearance.Holo">
      72. <item name="android:textColor">#2456c2</item>
      73. </style>
      74. <style name="ActionBarTabStyle.Example" parent="@android:style/Widget.Holo.Light.ActionBar.TabView">
      75. <item name="android:background">@drawable/tab_indicator_ab_example</item>
      76. </style>
      77. </resources>
      78. </pre><br>
      79. <br>
      80. <p></p>
      81. <p>android:background这个属性定义了tab的显示风格,对应的是一个xml文件不是图片<br>
      82. </p>
      83. <p></p>
      84. <p><br>
      85. </p>
      86. <p><br>
      87. </p>
      88. <p>tab_indicator_ab_example.xml文件的内容:</p>
      89. <p></p>
      90. <pre name="code" class="html"><?xml version="1.0" encoding="utf-8"?>
      91. <selector xmlns:android="http://schemas.android.com/apk/res/android">
      92. <!-- Non focused states -->
      93. <item android:drawable="@android:color/transparent" android:state_focused="false" android:state_pressed="false" android:state_selected="false"/>
      94. <item android:drawable="@drawable/tab_selected_example" android:state_focused="false" android:state_pressed="false" android:state_selected="true"/>
      95. <!-- Focused states -->
      96. <item android:drawable="@drawable/tab_unselected_focused_example" android:state_focused="true" android:state_pressed="false" android:state_selected="false"/>
      97. <item android:drawable="@drawable/tab_selected_focused_example" android:state_focused="true" android:state_pressed="false" android:state_selected="true"/>
      98. <!-- Pressed -->
      99. <!-- Non focused states -->
      100. <item android:drawable="@drawable/tab_unselected_pressed_example" android:state_focused="false" android:state_pressed="true" android:state_selected="false"/>
      101. <item android:drawable="@drawable/tab_selected_pressed_example" android:state_focused="false" android:state_pressed="true" android:state_selected="true"/>
      102. <!-- Focused states -->
      103. <item android:drawable="@drawable/tab_unselected_pressed_example" android:state_focused="true" android:state_pressed="true" android:state_selected="false"/>
      104. <item android:drawable="@drawable/tab_selected_pressed_example" android:state_focused="true" android:state_pressed="true" android:state_selected="true"/>
      105. </selector>
      106. </pre><pre name="code" class="html"></pre>代码:Demo_ActionBarTabsColor<p></p><p>参考文献:</p><p>http://www.vogella.com/articles/AndroidActionBar/article.htmlhttp://developer.android.com/guide/topics/ui/actionbar.html</p><p></p>

---------------------------------------------------------------------------------------------------------------------------------------------

如果需要隐藏Action Bar可以在你的Activity的属性中设置主题风格为NoTitleBar在你的manifest文件中,下面的代码在3.0以前是隐藏标题,而在3.0以后就是隐藏ActionBar了,代码为
 < activity android:theme="@android:style/Theme.NoTitleBar">

将你的选项菜单项放在Action Bar的右上角,对用户来说使用更方便,控制该行为的主菜单项属性是android:showAsAction。
  这个属性可接受的值有:
  1、always:这个值会使菜单项一直显示在Action Bar上。
  2、ifRoom:如果有足够的空间,这个值会使菜单项显示在Action Bar上。
  3、never:这个值使菜单项永远都不出现在Action Bar上。
  4、withText:这个值使菜单项和它的图标,菜单文本一起显示。

时间: 2024-10-10 23:21:56

Android ActionBar 一步一步分析 (转)的相关文章

一步一步教你在 Android 里创建自己的账号系统(二)--同步数据以及设计账号页面

大家如果喜欢我的博客,请关注一下我的微博,请点击这里(http://weibo.com/kifile),谢谢 转载请标明出处(http://blog.csdn.net/kifile),再次感谢 在前一篇文章中(一步一步教你在 Android 里创建自己的账号系统(一)),我向大家介绍了如何在 Android 系统中创建自己的账户系统,接下来我会向大家详细介绍一下如何使用账户系统. (一)同步数据 通常而言,我们会在两种情况下使用我们的账号系统: (1)登陆验证 登陆验证其实是一个很实用的功能,试

Android 从硬件到应用:一步一步向上爬 6 -- 编写APP测试框架层硬件服务(完)

创建Android Application工程:使用Eclipse的Android插件ADT创建Android工程,工程名称为Gpio,创建完成后将工程目录拷贝到packages/apps/文件夹下,并删除工程目录下的gen文件夹,不删除的话会造成类重复的错误. src/com/android/gpio/Gpio.java: package com.android.gpio; import com.android.gpio.R; import android.app.Activity; impo

Android 从硬件到应用:一步一步向上爬 4 -- 使用 JNI 方法调硬件驱动

Android下,java应用程序通过JNI方法调用硬件抽象层模块,在Android 从硬件到应用:一步一步向上爬 3 -- 硬件抽象层访问硬件驱动 中我们已经编译好了硬件抽象层模块,下面就要开始为HAL层编写JNI方法,为上层提供服务. cd到frameworks/base/services/jni目录中,新建一个com_android_server_GpioService.cpp文件: #include "jni.h" #include "JNIHelp.h"

Android 从硬件到应用:一步一步向上爬 3 -- 硬件抽象层访问硬件驱动

Android 标准的硬件驱动分为两个部分,一个是运行在linux内核里的硬件驱动,而另外一部分是运行在用户空间的硬件抽象层.采用这种方法,就可以使系统具有硬件无关性,也保护了部分厂商的利益.在Android 从硬件到应用:一步一步向上爬 1 -- 从零编写底层硬件驱动程序中已经有了编写硬件驱动到linux内核里的步骤,下面就要接着这个工程去看看怎么在硬件抽象层增加硬件模块和我们的内核驱动程序进行交互,完成硬件控制. 进入hardware/libhardware/include/hardware

Android 从硬件到应用:一步一步向上爬 1 -- 从零编写底层硬件驱动程序

硬件平台:TI AM335X Starter Kit 开发源码:TI-Android-ICS-4.0.3-DevKit-EVM-SK-3.0.1.bin 主机系统:Ubuntu 10.04 这次写<Android 从硬件到应用>是想尝试从底层的最简单的GPIO硬件驱动开始,一步一步的向上走,经过硬件抽象层HAL.JNI方法等,最终编写出APP,达到硬件调用的目的,期间会增加一些Android下C程序测试底层驱动的细节.既然是从零编写驱动,那就要脱离源码包里已有的一些api函数,从硬件电路开始.

Android教程-从零开始一步一步接入SDK

从零开始一步一步接入SDK 本篇博客想总结一下笔者在接入手游渠道SDK的一些经验方法,为想接入手游渠道或者想学习如何接入SDK的童鞋们提供一个参考.本篇博客基于Android平台,关于IOS接入SDK的方法,笔者以后有机会也会整理. 首先来给大家说明一下SDK,何为SDK?它的全称是,SoftWare Develop Kit,意思是软件开发工具包,它是可以辅助我们去开发某类软件的相关文档,范例和工具的集合.关于SDK,这里推荐一个服务商店,名叫Devstore(http://www.devsto

一步一步分析新建App启动过程

IOS温故而知新(一)  一步一步分析新建App启动过程 笔者接触IOS大概半年的时间,可以说能够开发App,但是又有很多不足的地方,因此打算写一些技术文章,能够达到温故而知新的效果,难免会有错误或者遗漏,也希望各位看官不吝指教.另外宣传一下刚建立的群“IOS菜鸟到高手之路”,312747764,欢迎希望交流分享的人加入. 1.IOS系统的简单说明IOS与Mac OS X以及安卓一样都属于类UINX系统,然而熟悉类UNIX系统的人可能会失望的是,个人开发的App会进入类似chroot的状态,被操

一步一步教你在 Android 里创建自己的账号系统(一)

大家如果喜欢我的博客,请关注一下我的微博,请点击这里(http://weibo.com/kifile),谢谢 转载请标明出处(http://blog.csdn.net/kifile),再次感谢 大家在平时使用 Android 手机的时候,都会发现有些应用(例如 qq,微信,淘宝)为自己创建了账号系统,并且能够在设置页面看到他,可是当自己希望为自己的软件写一个账号系统的时候总是不知从何入手,现在我们就从头开始,一步一步打造属于自己应用的账号系统. 在进行设备账户管理的时候,我们会通过一个 Acco

Ace教你一步一步做Android新闻客户端(一)

复制粘贴了那么多博文很不好意思没点自己原创的也说不出去,现在写一篇一步一步教你做安卓新闻客户端,借此机会也是让自己把相关的技术再复习一遍,大神莫笑,专门做给新手看. 手里存了两篇,一个包括软件视图 和新手引导 软件侧滑菜单 滑动主页的GUI篇 一个内容解析篇. 代码里有很详细的注释 所以直接放代码了 有不会的站内信或者评论我会及时回复. MainActivity XML :只有一个ListView布局 <?xml version="1.0" encoding="utf-

android一步一步实现视频clientapp(一)

我开发完毕了一个完整的视频clientapp.如今.分享出来.供刚開始学习的人学习參考(大神就不用看了,比較简单,仅供入门),大家相互交流相互学习. 项目有些功能,我时间也不是非常多.仅仅能时不时更新下. 仅仅能大概解说怎么一步一步实现,相关的知识点.大家自己查阅相关文档了,本人非常多地方也是会使用,要我说出个详细的原理什么的,确实说不清,还有本人表达能力有限.大家仅仅能将就看看,不喜忽喷,哈哈. 还有为大家说下,怎么增加广告平台的广告,公布市场,获取收入(老实说本人app,加广告.基本没收入)