写于开始前,首先这篇是翻译,源自于自己关于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. */
- @Override
- public 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" >
- <Button
- android:id="@+id/hideBt"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="Hide The Action Bar" >
- </Button>
- <Button
- android: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. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- }
- @Override
- public 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" >
- <item
- android:id="@+id/item1"
- android:orderInCategory="1"
- android:showAsAction="ifRoom|withText"
- android:title="@string/save"/>
- <item
- android:id="@+id/item1"
- android:orderInCategory="2"
- android:showAsAction="ifRoom|withText"
- android:title="@string/edit"/>
- <item
- android:id="@+id/item1"
- android:orderInCategory="3"
- android:showAsAction="ifRoom|withText"
- android:title="@string/about"/>
- <item
- android: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" >
- <item
- android:id="@+id/item1"
- android:orderInCategory="1"
- android:showAsAction="ifRoom|withText"
- android:title="@string/save"/>
- <item
- android:id="@+id/item2"
- android:orderInCategory="2"
- android:showAsAction="ifRoom|withText"
- android:title="@string/edit"/>
- <item
- android:id="@+id/item3"
- android:orderInCategory="3"
- android:showAsAction="ifRoom|withText"
- android:title="@string/about"/>
- <item
- android:id="@+id/item4"
- android:orderInCategory="4"
- android:showAsAction="ifRoom|withText"
- android:title="@string/help"/>
- <item
- android:id="@+id/item5"
- android:orderInCategory="5"
- android:showAsAction="ifRoom|withText"
- android:title="@string/file"/>
- <item
- android:id="@+id/item6"
- android:orderInCategory="6"
- android:showAsAction="ifRoom|withText"
- android:title="@string/run"/>
- <item
- android:id="@+id/item7"
- android:orderInCategory="7"
- android:showAsAction="ifRoom|withText"
- android:title="@string/source"/>
- <item
- android:id="@+id/item8"
- android:orderInCategory="8"
- android:showAsAction="ifRoom|withText"
- android:title="@string/navigate"/>
- <item
- android:id="@+id/item9"
- android:orderInCategory="9"
- android:showAsAction="ifRoom|withText"
- android:title="@string/search"/>
- <item
- android:id="@+id/item10"
- android:orderInCategory="10"
- android:showAsAction="ifRoom|withText"
- android:title="@string/project"/>
- <item
- android:id="@+id/item11"
- android:orderInCategory="11"
- android:showAsAction="ifRoom|withText"
- android:title="@string/refactor"/>
- <item
- android:id="@+id/item12"
- android:orderInCategory="12"
- android:showAsAction="ifRoom|withText"
- android:title="@string/window"/>
- <item
- android:id="@+id/item13"
- android:orderInCategory="13"
- android:showAsAction="ifRoom|withText"
- android:title="@string/help"/>
- </menu>
其效果图如下:
![](https://img-my.csdn.net/uploads/201206/19/1340117324_6896.jpg)
使用带字的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的的新实例。
- @Override
- public 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. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- }
- @Override
- protected void onStart() {
- super.onStart();
- ActionBar actionBar = this.getActionBar();
- actionBar.setDisplayHomeAsUpEnabled(true);
- }
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- MenuInflater inflater = getMenuInflater();
- inflater.inflate(R.menu.optionsmenu, menu);
- return true;
- }
- }
效果图:
![](https://img-my.csdn.net/uploads/201206/20/1340122293_6866.jpg)
添加活动视图
- 我们也可以添加一个视图作为一个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" >
- <item
- android:id="@+id/item4"
- android:orderInCategory="4"
- android:showAsAction="ifRoom|withText"
- android:title="@string/help"/>
- <item
- android:id="@+id/item5"
- android:orderInCategory="5"
- android:showAsAction="ifRoom|withText"
- android:title="@string/file"/>
- <item
- android: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. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- }
- @Override
- protected void onStart() {
- super.onStart();
- ActionBar actionBar = this.getActionBar();
- actionBar.setDisplayHomeAsUpEnabled(true);
- }
- @Override
- public boolean onCreateOptionsMenu(Menu menu)
- {
- MenuInflater inflater = getMenuInflater();
- inflater.inflate(R.menu.optionsmenu, menu);
- return true;
- }
- }
效果图:
![](https://img-my.csdn.net/uploads/201206/20/1340123239_4665.jpg)
ActionBar 标签
- ActionBar可以现实选项卡供用户切换浏览该Activity中不同的Fragment
- 每个标签都可以是一个图标或文本标题
- public class TabsActivity extends Activity
- {
- /** Called when the activity is first created. */
- @Override
- public 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;
- }
- @Override
- public void onTabSelected(Tab tab, FragmentTransaction ft)
- {
- ft.add(R.id.fragment_place, fragment, null);
- }
- }
- }
AFragmentTab.java
- public class AFragmentTab extends Fragment
- {
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState)
- {
- return inflater.inflate(R.layout.fragment_a, container, false);
- }
- }
BFragmentTab.java
- public class BFragmentTab extends Fragment
- {
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState)
- {
- return inflater.inflate(R.layout.fragment_b, container, false);
- }
- }
CFragmentTab.java
- public class CFragmentTab extends Fragment
- {
- @Override
- public 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" >
- <LinearLayout
- android:id="@+id/fragment_place"
- android:layout_width="match_parent"
- android:layout_height="wrap_content" >
- </LinearLayout>
- </LinearLayout>
效果图:
![](https://img-my.csdn.net/uploads/201206/20/1340124153_8834.jpg)