活动条(ActionBar)是Android3.0的重要更新之中的一个。ActionBar位于传统标题的位置,其主要提供了例如以下功能:
>显示选项菜单的菜单项,即激昂菜单项显示在Action Item;
>使用程序图标作为返回Home主屏或向上的导航操作;
>提供交互式View作为Action View;
>提供基于Tab的导航方式。可用于切换多个Fragment
>提供基于下拉的导航方式
1.启用/关闭ActionBar
Android3.0及以上版本号已经默认启用了ActionBar。仅仅须要在AndroidManifest.xml文件的SDK配置指定Android版本号高于11就会默认启用ActionBar,代码例如以下:
<uses-sdk
android:minSdkVersion="17"
android:targetSdkVersion="17" />
在实际项目中。通常推荐使用代码来控制ActionBar的显示、隐藏,代码实现例如以下:
ActionBar actionBar = getActionBar(); //返回ActionBar实例
actionBar.show(); //显示
actionBar.hide(); //隐藏
当然。仅仅有当应用主题没有关闭ActionBar时才干返回ActionBar实例。
假设设置应用主题或Activity的主题属性Android:name="@android:style/Theme.Holo.NoActionBar"。则关闭ActionBar活动条功能。
注意:在使用ActionBar过程中。明明我们将Android的SDK版本号设置大于3.0,可是仍不能实如今标题栏显示ActionBar或者getActionBar()返回的null。这是因为Android应用的主题的错误,有两种方法:
(1)在新建项目时,设置Android版本号高于3.0
(2)删除AndroidManifest.xml清单文件<Application.../>元素中的Android:theme属性,然后在Activity代码中加入getWindow().requestFeature(Window.FEATURE_ACTION_BAR);就可以。
2.使用ActionBar显示选项菜单
因为有些手机不存在MENU按键。Android提供了ActionBar将选项菜单显示成Action Item。从Android 3.0開始,MenuItem新增例如以下方法用于将菜单选项显示在ActionBar上作为ActionItem。
ActionBar还能够依据应用程序当前的功能来提供与其相关的Actionbutton,这些button都会以图标或文字的形式直接显示在ActionBar上。
当然。假设button过多,ActionBar上显示不完。多出的一些button能够隐藏在overflow里面(最右边的三个点就是overflowbutton),点击一下overflowbutton就能够看到全部的Actionbutton了。 当Activity启动的时候。系统会调用Activity的onCreateOptionsMenu()方法来取出全部的Actionbutton,我们仅仅须要在这种方法中去载入一个menu资源(menu/*.xml)。并把全部的Actionbutton都定义在资源文件中面就能够了。
setShowAsAction(int actionEnum)
该方法设置是否将该菜单显示在ActionBar上。作为ActionItem。当中,actionEnum方法支持例如以下參数值:
>SHOW_AS_ACTION_ALWAYS:总是将该MenuItem显示在ActionBar上;
>SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW:将该Action View折叠成普通菜单项
>SHOW_AS_ACTION_IF_ROOM:当ActionBar位置足够时才显示MenuItem
>SHOW_AS_ACTION_NEVER:不将该MenuItem显示在ActionBar上
>SHOW_AS_ACTION_WITH_TEXT:将该MenuItem显示在ActionBar上。并显示菜单项的文本
然后,在实际项目中我们推荐使用XML资源文件来定义菜单。由于,我们能够直接在菜单资源文件里的<item.../>元素指定例如以下属性就可以:
<item android:title="菜单项名称"
android:icon="菜单项标题"
android:showAsAction="always|withText"
//总是将菜单项显示在ActionBar上并显示菜单项的文本
......./>
源代码举例:
(1)菜单资源文件/res/menu/menu.xml
- <?xml version="1.0" encoding="utf-8"?>
- <menu xmlns:android="http://schemas.android.com/apk/res/android">
- <!-- 第一个菜单项:字体大小菜单,并设置为ActionBar(假如手机无Menu键)-->
- <item android:title="@string/font_size"
- android:icon="@drawable/font"
- android:showAsAction="always|withText">
- <menu>
- <!-- 定义一组单选菜单项 ,然后定义一组菜单选项-->
- <group android:checkableBehavior="single">
- <item
- android:id="@+id/font_10"
- android:title="@string/font_10"/>
- <item
- android:id="@+id/font_12"
- android:title="@string/font_12"/>
- <item
- android:id="@+id/font_14"
- android:title="@string/font_14"/>
- <item
- android:id="@+id/font_16"
- android:title="@string/font_16"/>
- <item
- android:id="@+id/font_18"
- android:title="@string/font_18"/>
- </group>
- </menu>
- </item>
- <!-- 第二个菜单项:普通菜单-->
- <item
- android:id="@+id/plain_item"
- android:title="@string/palin_item"
- android:showAsAction="always|withText">
- </item>
- <!-- 第三个菜单项:字体颜色-->
- <item
- android:title="@string/font_color"
- android:icon="@drawable/color"
- android:showAsAction="always|withText">
- <!-- 定义一组单选菜单项 ,然后定义一组菜单选项-->
- <menu>
- <group>
- <item
- android:id="@+id/red_font"
- android:title="@string/red_title"/>
- <item
- android:id="@+id/blue_font"
- android:title="@string/blue_title"/>
- <item
- android:id="@+id/green_font"
- android:title="@string/blue_title"/>
- </group>
- </menu>
- </item>
- </menu>
凝视:android:showAsAction属性,用于指定了菜单项在ActionBar上显示的形式或位置,主要有下面几种值可选:
>always:表示永远显示在ActionBar中。假设屏幕空间不够则无法显示;
>ifRoom:表示屏幕空间够的情况下显示在ActionBar中,不够的话就显示在折叠图标中
>never:表示永远显示在折叠图标中。用户单击该折叠图标将显示全部选项菜单项
>withText:表示显示菜单项的名称
(2)src/MainActivity.java
- package com.android.android_actionbar_2;
- import android.app.ActionBar;
- import android.app.Activity;
- import android.content.Intent;
- import android.graphics.Color;
- import android.os.Bundle;
- import android.view.Menu;
- import android.view.MenuInflater;
- import android.view.MenuItem;
- import android.widget.TextView;
- import android.widget.Toast;
- public class MainActivity extends Activity {
- ActionBar actionbar;
- private TextView txt;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- /1./获取当前Activity的actionBar
- actionbar=getActionBar();
- }
- //2.将Xml资源加入到menu菜单中
- public boolean onCreateOptionsMenu(Menu menu)
- {
- MenuInflater inflator=new MenuInflater(this);
- inflator.inflate(R.menu.menu, menu);
- return super.onCreateOptionsMenu(menu);
- }
- //3.响应并实现菜单项功能
- public boolean onOptionsItemSelected(MenuItem mi)
- {
- if(mi.isCheckable())
- {
- mi.setChecked(true);
- }
- switch(mi.getItemId())
- {
- //设置字体大小
- case R.id.font_10:
- txt.setTextSize(10*2);
- break;
- case R.id.font_12:
- txt.setTextSize(12*2);
- break;
- case R.id.font_14:
- txt.setTextSize(14*2);
- break;
- //设置字体颜色
- case R.id.blue_font:
- txt.setTextColor(Color.BLUE);
- mi.setChecked(true);
- break;
- case R.id.green_font:
- txt.setTextColor(Color.GREEN);
- mi.setChecked(true);
- break;
- //设置普通菜单响应
- case R.id.plain_item:
- Toast toast=Toast.makeText(MainActivity.this, "您单击了普通菜单", Toast.LENGTH_SHORT);
- toast.show();
- break;
- }
- return true;
- }
- }
(3)效果演示
3.启用程序图标导航
为了实现将应用程序图标转变成能够点击的图标。能够调用ActionBar的下面方法:
>setDisplayHomeAsUpEnabled(boolean showHomeAsUp):设置是否将应用程序图标转变成可点击的图标,并在图标上加入一个向左的箭头;
>setDisplayOptions(int options):通过传入int类型变量来控制该ActionBar的显示选项;
>setDisplayShowHomeEnabled(boolean showHome):设置是否显示应用程序的图标;
>setHomeButtonEnabled(boolean enabled):设置是否将应用程序图标转换变成可点击的button;
源代码实战:
功能:将该Activity的程序图标转变成可点击的图标。并控制用于单击该图标时返回程序的主Activity.
package com.example.actionbar; import android.app.ActionBar; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; /** * 项目名称/版本:Actionbar/v1.0 * 包 名:com.example.actionbar * 类描写叙述:启用程序图标导航.点击应用程序图标。返回主界面 * 创建人:jiangdongguo * 创建时间:2015-6-12 下午8:20:14 * 博客地址:http://blog.csdn.net/u012637501 */ public class ActionHome extends Activity { private ActionBar actionBar; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //a.获得ActionBar实例 actionBar = getActionBar(); //b.设置是否显示应用程序图标 actionBar.setDisplayShowHomeEnabled(true); //c.设置是否将应用程序图标转换变成可点击的button actionBar.setHomeButtonEnabled(true); //d.将应用程序图标设置为可点击的button并在图标上加入向左箭头 } @Override public boolean onCreateOptionsMenu(Menu menu) { // TODO Auto-generated method stub return super.onCreateOptionsMenu(menu); } /** *选项菜单的菜单项被单击后的回调方法 * */ public boolean onOptionsItemSelected(MenuItem item) { //推断菜单项能否被点击,是则使能菜单项 if(item.isChecked()){ item.setChecked(true); } //推断单击的是哪个菜单项,并作出对应的响应 switch (item.getItemId()) { case android.R.id.home: Intent intent = new Intent(ActionHome.this,MainActivity.class); startActivity(intent); this.finish(); break; default: break; } return true; } }效果演示:
4.使用View作为Action View
ActionBar上除了能够显示普通的Action Item之外,还能够显示普通的UI组件(widget)作为一个功能button的替代。操作视图提供了高速訪问行为而不改变活动或片段,且没有替换动作栏。比如,假设你想实现搜索动作,能够在action
bar中嵌入一个SearchView窗体部件。为了实现一个action view到动作栏中。我们能够使用actionLayout or actionViewClass属性来指定一个布局(xml)资源或者窗体部件widget到Action
Bar.详细操作:
>定义Action Item时,使用android:actionViewClass属性指定Action View的实现类(widget);
>定义Action Item时,使用android:actionLayout属性指定Action View相应的视图(layout)。
(1)菜单资源res/menu/menu.xml
在菜单资源中定义Action Item,但这Action Item使用的是Action View而不是不同的Action Item。
- <?xml version="1.0" encoding="utf-8"?>
- <menu xmlns:android="http://schemas.android.com/apk/res/android">
- <!-- Action Item为widget-->
- <item
- android:id="@+id/search"
- android:title="搜索"
- android:orderInCategory="100"
- android:showAsAction="ifRoom|collapseActionView"
- android:actionViewClass="android.widget.SearchView"/>
- <!-- Action Item为视图资源-->
- <item
- android:id="@+id/clock"
- android:title="模拟时钟"
- android:orderInCategory="100"
- android:showAsAction="ifRoom|collapseActionView"
- android:actionLayout="@layout/clock"/>
- </menu>
当中。clock视图实现代码例如以下/res/layout/clock.xml:
<?
xml version="1.0" encoding="utf-8"?>
<AnalogClock
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
(2)为Action View加入事件监听器
Action视图的事件监听主要在onCreateOptionsMenu()方法中实现。通过调用MenuItemCompat.getActionView并传递对应的菜单项(MenuItem)来获取Action视图对象。
- public boolean onCreateOptionsMenu(Menu menu) {
- getMenuInflater().inflate(R.menu.menu, menu); //载入菜单资源
- MenuItem searchItem = menu.findItem(R.id.search); //获得MenuItem对象
- SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem); //获得Action视图对象
- // Configure the search info and add any event listeners //为Action视图对象注冊事件监听器
- ...
- return super.onCreateOptionsMenu(menu);
- }
(3)效果例如以下
注:android:showAsAction="collapseActionView"
属性值表示该空间能够被合并成一个Actionbutton。