Android ActionBar的使用
前言:
ActionBar是一个能用于确定应用程序和用户的位置,并提供给用户操作和导航模式的窗口功能。如果需要显著地展示当前用户的操作或导航,应该使用ActionBar,因为ActionBar为用户提供了一个统一的跨应用程序和系统的接口,并且针对不同尺寸的屏幕优雅的处理了ActionBar的适配。你可以通过ActionBar API来控制它的行为和可视性,这些API添加于Android 3.0(API级别为11)。
Action Bar设计的目的是:
◆提供一个专门的空间来确定应用程序的标识和用户的位置。
◆提供统一的导航和视图细化到不同的应用程序中。
Action Bar提供了内置选项卡导航来进行在fragments之间切换。它还提供了一个下拉列表中,可以来用来替代导航模式或用来完善当前视图(比如按照不同的标准来排序列表)。
◆突出Activity的关键动作(如“搜索”、“创建”、“共享”,等等。),便于提供给用户一个可预测的访问。
1.1 添加Action Bar
在3.0以后,所有的activity主题为Theme.Hole(或是其子类)中都有actionbar,以下是Manifest.xml中的内容:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.administrator.myapplication" >
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
其中:android:theme的选择是很重要的,只有设置application标签的该属性为Theme.Hole(或为其子类)时,actionbar才能被显示出来。
1.2 移除指定的activity的actionbar的方法
方法一:
在manifest.xml文件中,对指定的activity的</activity>标签
中的Theme
主题改成如下:`android:theme=”@android:style/Theme.Holo.NoActionBar”
则可以在指定的activity中去除actionbar。
方法二:
在指定的activity中的onCreat()方法中用getActionbar()得到当前activity的actionbar,再用hide()方法就可以隐藏了。代码如下:
ActionBar actionBar=getActionBar();
//隐藏activity中的actionbar
actionBar.hide();
当ActionBar隐藏时,系统会调整Activity的布局来填充所有可用屏幕空间。当然你可以通过调用show()
显示ActionBar。
1.3 在actionbar添加action item
有时你可能想让用户从选项菜单(options menu)中直接访问item。要做到这一点,你可以声明该菜单项为ActionBar中的一个“action item”。也就是说,用一个action item作为一些不想被显示出来的索引。通过点击该action item就相当于点击手机上的菜单键。一个action item包括一个图标和/或文字标题,如果一个菜单项不作为一个“action item”,系统会将菜单项放置在溢出菜单(overflow menu)。现在,可以认为ActionBar中的所有item组成了一个menu(包括overflow menu),系统会调用onCreateOptionMenu()方法来创建填充action bar和溢出菜单(overflow menu)。你必须在方法中inflate一个XML定义的menu资源。代码如下:
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
在XML文件中,你可以通过声明android:showAsAction=”never”来让item成为action item (注意:之所以在命名前面加了一个action是因为这样的item才有action)。其中对于android:showAsAction的值有:
1. always:
一直显示在actionbar上显示出来
2. collapseActionView:
3. ifRoom:
由它的命名可以知道,如果room(空间)够的话,就会在actionbar上显示出来
4. never:
从来不会被显示出来
5. withText:
“withText”值应用用于一个Action Bar的提示文本出现。但如果一个图标无法使用或者空间受限,action bar的标题可能无法显示。
menu.xml文件的代码:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" tools:context=".MainActivity" >
<item android:id="@+id/action_settings"
android:title="@string/action_settings"
android:orderInCategory="100"
app:showAsAction="never" />
<item
android:id="@+id/action_search"
android:title="@string/action_search"
android:orderInCategory="100"
app:showAsAction="never"
/>
<!--orderInCategory:item的排列顺序-->
<item
android:id="@+id/action_loge"
android:title="@string/action_loge"
android:orderInCategory="100"
app:showAsAction="never"
/>
<item
android:id="@+id/action_nightstyle"
android:title="@string/action_nightstyle"
android:orderInCategory="100"
app:showAsAction="never"
/>
<item
android:id="@+id/action_ctrile"
android:title="@string/action_ctrile"
android:orderInCategory="100"
app:showAsAction="always"
/>
<item
android:id="@+id/action_theme"
android:title="@string/action_theme"
android:orderInCategory="100"
app:showAsAction="always"
/>
<item
android:id="@+id/action_refresh"
android:title="@string/action_refresh"
android:orderInCategory="100"
app:showAsAction="never"
android:icon="@drawable/abc_ic_search_api_mtrl_alpha"
/>
</menu>
其中orderInCategory:item有actionbar上的item进行排序的作用。其值为整形数据。值越大,越排在前。
1.4 item的使用
当用户选择一个action item,activity会调用OptionsItemSelected()方法,通过android:id属性获取的ID值来接收在选项菜单中的所有item中相同的回调。 这一点很重要,你总是为每个菜单项定义android:title,你不在显示的action item中声明标题的理由有三个:
◆如果在action bar中没有足够的空间提供给action item,该菜单项出现溢出“菜单中,而且只有标题显示。
◆屏幕阅读器为视障用户读出菜单项的标题。
◆如果action item只有图标,用户可以长按item显示的工具提示,显示action item的标题。
注意:
如果要使用应用名所在的item。这就得使用android:id:home来得到应用名所在的item的资源id,你懂的,拿到id后就可以为所欲为了。