写于开始前,首先这篇是翻译,源自于自己关于ActionBar的一个问题求教于manoel兄,其csdn博客地址(http://blog.csdn.net/manoel?viewmode=contents)。后来他发送我一份资料,感觉不错,翻译一下。
关于那个问题:是关于如何生成如下图所示之ActionBar效果:

其实就在官网上就有答案,自己疏忽再加上资料繁多。寻了许久,经过指点。终于找到:
To enable split action bar, simply add uiOptions="splitActionBarWhenNarrow" to your <activity> or <application> manifest element.(http://developer.android.com/guide/topics/ui/actionbar.html)Using split action bar 标题下。
如果你想拥有上图的那种效果,Fragment(关于Fragment的内容,见上篇)在menuItem的下面显示,在manifest.xml文件里在<activity>或者<application>里加上uiOptions="splitActionBarWhenNarrow" 即可。
注:本人在4.0版本平板上不能达到此效果,在4.0手机上可以实现。在平板上,效果类似如下:
,
如果fragment增多,不会分裂出现上图效果,而使用下拉列表来显示Fragment。
下面开始正题。
简介
- ActionBar是一个显示在屏幕顶部的控件,它包括了在左边显示的应用的logo图标和右边操作菜单的可见项。
- 我们可以选择可见的操作菜单可见项,不可见项会以下拉列表的形式呈现出来。(见上图相机图标右侧,点击出现下拉列 表,显示没有直接显示出来的操作菜单可见项)
- ActionBar为Fragment之间提供标签导航
添加ActionBar
- 不需要导入ActionBar,因为在android3.0或者以上版本中,ActionBar已经默认的包含在Activity中
- 在Android3.0的默认主题“holographic”中,已经创造了ActionBar
- 当android:minSdkVersion 或者 android:targetSdkVersion 属性被设置成11或者更高时,应用会被认为是Android3.0版本(默认含有ActionBar)
去除ActionBar
- 我们可以通过把主题设置为Theme.Holo.NoActionBar为一个Activity去除掉ActionBar。 <activity android:theme="@android:style/Theme.Holo.NoActionBar">
- 我们也可以通过在代码中调用show()或者hide()方法来相应的显示或者隐藏ActionBar
添加Action Item
public class ActionBarDemoActivity extends Activity
{/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);Button showBt = (Button) findViewById(R.id.showBt);showBt.setOnClickListener(new OnClickListener(){public void onClick(View view){ActionBar actionBar = getActionBar();actionBar.show();}});}public boolean onCreateOptionsMenu(Menu menu){super.onCreateOptionsMenu(menu);MenuItem add = menu.add(0, 1, 0, "Save");MenuItem open = menu.add(0, 2, 1, "Open");MenuItem close = menu.add(0, 3, 2, "Close");add.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);open.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);close.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);return true;}
}
main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="horizontal" ><Buttonandroid:id="@+id/hideBt"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Hide The Action Bar" ></Button><Buttonandroid:id="@+id/showBt"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Show The Action Bar" ></Button></LinearLayout>
效果图如下:

添加活动项(Action Item)
public class ActionBarXMLActivity extends Activity {/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);}@Overridepublic boolean onCreateOptionsMenu(Menu menu){MenuInflater inflater = getMenuInflater();inflater.inflate(R.menu.optionsmenu, menu);return true;}
}
optionsmenu.xml:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" ><itemandroid:id="@+id/item1"android:orderInCategory="1"android:showAsAction="ifRoom|withText"android:title="@string/save"/><itemandroid:id="@+id/item1"android:orderInCategory="2"android:showAsAction="ifRoom|withText"android:title="@string/edit"/><itemandroid:id="@+id/item1"android:orderInCategory="3"android:showAsAction="ifRoom|withText"android:title="@string/about"/><itemandroid:id="@+id/item1"android:orderInCategory="4"android:showAsAction="ifRoom|withText"android:title="@string/help"/></menu>
效果图:

菜单项过多溢出
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" ><itemandroid:id="@+id/item1"android:orderInCategory="1"android:showAsAction="ifRoom|withText"android:title="@string/save"/><itemandroid:id="@+id/item2"android:orderInCategory="2"android:showAsAction="ifRoom|withText"android:title="@string/edit"/><itemandroid:id="@+id/item3"android:orderInCategory="3"android:showAsAction="ifRoom|withText"android:title="@string/about"/><itemandroid:id="@+id/item4"android:orderInCategory="4"android:showAsAction="ifRoom|withText"android:title="@string/help"/><itemandroid:id="@+id/item5"android:orderInCategory="5"android:showAsAction="ifRoom|withText"android:title="@string/file"/><itemandroid:id="@+id/item6"android:orderInCategory="6"android:showAsAction="ifRoom|withText"android:title="@string/run"/><itemandroid:id="@+id/item7"android:orderInCategory="7"android:showAsAction="ifRoom|withText"android:title="@string/source"/><itemandroid:id="@+id/item8"android:orderInCategory="8"android:showAsAction="ifRoom|withText"android:title="@string/navigate"/><itemandroid:id="@+id/item9"android:orderInCategory="9"android:showAsAction="ifRoom|withText"android:title="@string/search"/><itemandroid:id="@+id/item10"android:orderInCategory="10"android:showAsAction="ifRoom|withText"android:title="@string/project"/><itemandroid:id="@+id/item11"android:orderInCategory="11"android:showAsAction="ifRoom|withText"android:title="@string/refactor"/><itemandroid:id="@+id/item12"android:orderInCategory="12"android:showAsAction="ifRoom|withText"android:title="@string/window"/><itemandroid:id="@+id/item13"android:orderInCategory="13"android:showAsAction="ifRoom|withText"android:title="@string/help"/></menu> 其效果图如下:

使用带字的Action Item
- Action item 默认格式是如果菜单项含字和图标的话,只显示图标
- 如果想要显示字的效果,在xml里如下设置:android:showAsAction="ifRoom|withText"
- 或者在代码里调用setShowAsAction():setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM)
Action事件
- ActionBar中一个菜单项(即Action item)的触发像以前版本中的活动菜单回调方法(onOptionsItemSelected())一样。
- 当用户选择一个Fragment的菜单项时,首先会调用Activity的onOptionsItemSelected()方法,如果该方法返回false,则调用Fragment实现的onOptionsItemSelected()方法。
应用图标
- 默认情况下,应用图标在ActionBar的左侧
- 当用户点击应用bar的时候,系统会调用你的Activity里面的onOptionsItemSelected() 方法里面的Android.R.id.Home ID(你的主ID)里定义的事件。我们可以重写这个方法,添加一个条件执行该行为:让它跳转到这个应用的主Activity而不是返回的主屏幕。
- 如果选择返回应用的主activity,最好的方式是在创建的Intent中添加FLAG_ACTIVITY_CLEAR_TOP这个标签。
- 使用这个FLAG_ACTIVITY_CLEAR_TOP标签,如果应用的主Activity已经在activity栈中存在,所有在其上的activity都会被销毁,然后主activity会到栈顶,而不用创建主Activity的的新实例。
@Overridepublic boolean onOptionsItemSelected(MenuItem item){switch (item.getItemId()){case android.R.id.home:Intent intent = new Intent(this, MainActivity.class);intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);startActivity(intent);return true;default:return super.onOptionsItemSelected(item);}} public class HomyUpActivity extends Activity {/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);}@Overrideprotected void onStart() {super.onStart();ActionBar actionBar = this.getActionBar();actionBar.setDisplayHomeAsUpEnabled(true);}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {MenuInflater inflater = getMenuInflater();inflater.inflate(R.menu.optionsmenu, menu);return true;}} 效果图:

添加活动视图
- 我们也可以添加一个视图作为一个Action Item.我们可以通过在xml元素的android:actionLayout属性制定我们希望现实布局资源的ID(例如@layout/mysearchview)
- 我们可以选择添加android:actionViewClass属性分配与完全限定的类名描述我们想要显示的视图(例如android.widget.SearchView)
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" ><itemandroid:id="@+id/item4"android:orderInCategory="4"android:showAsAction="ifRoom|withText"android:title="@string/help"/><itemandroid:id="@+id/item5"android:orderInCategory="5"android:showAsAction="ifRoom|withText"android:title="@string/file"/><itemandroid:id="@+id/search"android:actionViewClass="android.widget.SearchView"android:showAsAction="ifRoom"android:title="Search"/></menu> HomeUpActivity.java
public class HomyUpActivity extends Activity {/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);}@Overrideprotected void onStart() {super.onStart();ActionBar actionBar = this.getActionBar();actionBar.setDisplayHomeAsUpEnabled(true);}@Overridepublic boolean onCreateOptionsMenu(Menu menu){MenuInflater inflater = getMenuInflater();inflater.inflate(R.menu.optionsmenu, menu);return true;}
} 效果图:

ActionBar 标签
- ActionBar可以现实选项卡供用户切换浏览该Activity中不同的Fragment
- 每个标签都可以是一个图标或文本标题
public class TabsActivity extends Activity
{/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);ActionBar bar = getActionBar();bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);ActionBar.Tab tabA = bar.newTab().setText("A Tab");ActionBar.Tab tabB = bar.newTab().setText("B Tab");ActionBar.Tab tabC = bar.newTab().setText("C Tab");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));bar.addTab(tabA);bar.addTab(tabB);bar.addTab(tabC);protected class MyTabsListener implements ActionBar.TabListener{private Fragment fragment;public MyTabsListener(Fragment fragment){this.fragment = fragment;}@Overridepublic void onTabSelected(Tab tab, FragmentTransaction ft){ft.add(R.id.fragment_place, fragment, null);}}} AFragmentTab.java
public class AFragmentTab extends Fragment
{@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState){return inflater.inflate(R.layout.fragment_a, container, false);}
} BFragmentTab.java
public class BFragmentTab extends Fragment
{@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState){return inflater.inflate(R.layout.fragment_b, container, false);}
}
CFragmentTab.java
public class CFragmentTab extends Fragment
{@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState){return inflater.inflate(R.layout.fragment_c, container, false);}
} main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical" ><LinearLayoutandroid:id="@+id/fragment_place"android:layout_width="match_parent"android:layout_height="wrap_content" ></LinearLayout></LinearLayout> 效果图:














