写于开始前,首先这篇是翻译,源自于自己关于ActionBar的一个问题求教于manoel兄,其csdn博客地址(http://blog.csdn.net/manoel?viewmode=contents)。后来他发送我一份资料,感觉不错,翻译一下。
效果图如下:
其效果图如下:
效果图:
HomeUpActivity.java
效果图:
AFragmentTab.java
BFragmentTab.java
CFragmentTab.java
main.xml
效果图:
关于那个问题:是关于如何生成如下图所示之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
每一个操作菜单的菜单项都可以成为ActionBar中的一个Action Item
参考代码如下:
ActionBarDemoActivity.java:
- 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)
当使用xml文件创建菜单(menu)时,可以标记这些菜单项作为想要实现的Action Item
代码如下:
ActionBarXMLActivity:
- 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>
效果图:
菜单项过多溢出
当创建一个ActionBar拥有太多的Action item以至于没有足够的控件来显示会在屏幕的右上角出现一个溢出菜单项,可以通过它来访问溢出部分菜单。
代码示例:
其Activity代码如上(ActionBarXMLActivity)
溢出菜单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/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>
其效果图如下:
使用带字的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);
- }
- }
当我们想实现用户点击ActionBar 图标后返回前一个activity,可以通过在Actionbar设置setDisplayHomeAsUpEnabled(true) 来实现。
- 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;
- }
- }
效果图:
添加活动视图
- 我们也可以添加一个视图作为一个Action Item.我们可以通过在xml元素的android:actionLayout属性制定我们希望现实布局资源的ID(例如@layout/mysearchview)
- 我们可以选择添加android:actionViewClass属性分配与完全限定的类名描述我们想要显示的视图(例如android.widget.SearchView)
代码示例:
optionsmenu.xml
- <?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;
- }
- }
效果图:
ActionBar 标签
- ActionBar可以现实选项卡供用户切换浏览该Activity中不同的Fragment
- 每个标签都可以是一个图标或文本标题
代码示例:
TabsActivity.java
- 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>
效果图: