安卓开发文档学习笔记之ActionBar的使用与适配

来源:互联网 发布:软件开发的创新思维 编辑:程序博客网 时间:2024/04/28 11:43
ActionBar

自从Android3.0(API 11)把ActionBar加入到android sdk后,其在安卓UI布局中的地位便一路上升。通过安卓的官方文档可以看出,ActionBar的出现旨在为用户提供一个更加简洁和友好的UI框架。同时开发者通过采用ActionBar也可以获得诸多好处(比如APP在高版本安卓系统中更好的稳定性)。

ActionBar的使用

对于Andorid3.0(API11)及以上的系统,使用ActionBar只需要设置两个地方即可

AndroidManifest.xml

  1. <manifest ... >http://www.kmnk03.com/hxpfk/dzpz/214.html
  2. <uses-sdk android:minSdkVersion="11" ... />
  3. ...
  4. </manifest>
复制代码

以及

  1. <activity android:theme="@style/Theme.Holo" ... >
  2. http://www.kmnk03.com/hxpfk/dzpz/214.html
复制代码

但是在平时的开发中,一般都要考虑APP的低版本适配问题,那么在Android3.0(API11)以下的的sdk中,该如何使用ActionBar呢?好在安卓为我们提供了支持包Android Support Library,该支持包可以通过Android SDK Manager下载

下载完成后在sdk安装路径下可以看到/extras/android/v7/appcompat这个项目,它就是低版本sdk使用ActionBar的支持包。(Andorid Support Library详细的使用说明请查看谷歌说明文档)。
安装完appcompat后,下面就是要在项目的代码中使用它了。
1.任何需要使用ActionBar的activity都要继承ActionBarActivity这个类

  1. public class YourActivity extends ActionBarActivity {...}
  2. http://www.kmnk03.com/hxpfk/dzpz/216.html
复制代码

2.activity(或者application)的主题都要继承Theme.AppCompat

  1. <activity android:theme="@style/Theme.AppCompat.Light" ... >
  2. http://www.kmnk03.com/hxpfk/dzpz/217.html
复制代码

3.APP版本兼容至(最低)Android2.1(API7)

  1. <manifest ... >
  2. <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="19" />
  3. ...
  4. </manifest>
复制代码

至此,项目就已经使用ActionBar了,接下来就是如何定义ActionBar的功能按钮。
首先来看下一个标准的ActionBar长什么样

通过图片可以看出,一个ActionBar大致可以分成两部分,左侧的图标和Activity标签,右侧是一些可以自定义的功能按钮。其中修改左侧的图标和标签比较简单,只要在AndroidManifest.xml文件里修改即可。下面就来看看如何修改右侧的功能按钮,从而把我们想要的操作加到ActionBar上面。
1.在/res/menu文件夹里新建一个菜单定义文件,比如

/res/menu/main_activity_actions.xml

  1. <menu xmlns:android="http://schemas.android.com/apk/res/android" >
  2. <!-- Search, should appear as action button -->http://www.kmnk03.com/hxpfk/dzpz/218.html
  3. <item android:id="@+id/action_search"
  4. android:icon="@drawable/ic_action_search"
  5. android:title="@string/action_search"
  6. android:showAsAction="ifRoom" />
  7. <!-- Settings, should always be in the overflow -->
  8. <item android:id="@+id/action_settings"
  9. android:title="@string/action_settings"
  10. android:showAsAction="never" />
  11. </menu>http://www.kmnk03.com/hxpfk/bpy/219.html
复制代码

在上面的文件中,我们定义了一个搜索和一个设置共两个菜单项。在定义文件中,如果一个菜单项设置了android:icon属性,那么在ActionBar中就会显示该属性指向的drawable资源,如果android:icon属性没有被设置,那么默认就会显示android:title指向的字符串。对于android:showAsAction属性(该属性有五个可以设定的值——ifRoom,withText,never,always,collapseActionView,详细说明请戳这里),如果设置为ifRoom,那么系统在显示该菜单项时做个判断,判断ActionBar右侧是否有足够的空间放置这个按钮,如果设置为never,那么这里会因系统版本不同而导致显示的方式有所差异。在高版本系统(测试版本为4.3)中,ActionBar的最右侧会自动添加一个按钮overflow,也就是上面图片中竖排的三个点。通过点击overflow按钮,android:showAsAction属性设置为never的菜单项就会以下拉的方式显示出来。但在低版本系统(测试版本为2.2)中,系统是没有添加这个overflow按钮的。

所以项目中对低版本的适配需要注意到这一点

2.在Activity中调用onCreateOptionsMenu(Menu menu)方法解析menu文件

  1. @Overridehttp://www.kmnk03.com/hxpfk/bpy/220.html
  2. public boolean onCreateOptionsMenu(Menu menu) {
  3. // Inflate the menu items for use in the action bar
  4. MenuInflater inflater = getMenuInflater();
  5. inflater.inflate(R.menu.main_activity_actions, menu);
  6. return super.onCreateOptionsMenu(menu);
  7. }
复制代码

3.定义各个菜单项的动作

  1. @Overridehttp://www.kmnk03.com/hxpfk/bpy/221.html
  2. public boolean onOptionsItemSelected(MenuItem item) {
  3. // Handle presses on the action bar items
  4. switch (item.getItemId()) {
  5. case R.id.action_search:
  6. openSearch();
  7. return true;
  8. case R.id.action_settings:
  9. openSettings();
  10. return true;http://www.kmnk03.com/hxpfk/xcy/223.html
  11. default:
  12. return super.onOptionsItemSelected(item);
  13. }
  14. }http://www.kmnk03.com/hxpfk/bpy/222.html
复制代码
ActionBar与Activities的树形结构

在微信5.2安卓客户端中,大家在使用时应该都注意到了一个特性,那就是不管当前活动界面是在哪个Activity上面,通过点击左上角的图标或者标签就可以返回到上一层的Activity。这一特性就是ActionBar带来的。那么如何实现呢?
1.在AndroidManifest.xml文件中声明Activity的android:parentActivityName属性

  1. <application ... >
  2. ...http://www.kmnk01.com/hxpfk/2015/xcy_1205/220.html
  3. <!-- The main/home activity (it has no parent activity) -->
  4. <activity
  5. android:name="com.example.myfirstapp.MainActivity" ...>
  6. ...http://www.kmnk01.com/hxpfk/2015/bpy_1205/219.html
  7. </activity>http://www.kmnk01.com/hxpfk/2015/pz_1205/211.html
  8. <!-- A child of the main activity -->
  9. <activity
  10. android:name="com.example.myfirstapp.DisplayMessageActivity"
  11. android:label="@string/title_activity_display_message"
  12. android:parentActivityName="com.example.myfirstapp.MainActivity" >
  13. <!-- Parent activity meta-data to support 4.0 and lower -->
  14. <meta-datahttp://www.kmnk01.com/hxpfk/2015/pz_1205/212.html
  15. android:name="android.support.PARENT_ACTIVITY"
  16. android:value="com.example.myfirstapp.MainActivity" />
  17. </activity>
  18. </application>http://www.kmnk01.com/hxpfk/2015/pz_1205/213.html
复制代码

android:parentActivtyName属性声明的值就是点击ActionBar左侧图标所返回的Activity同时,为了支持4.0以下的版本需要多添加一些数据

  1. <!-- Parent activity meta-data to support 4.0 and lower -->
  2. <meta-datahttp://www.kmnk01.com/hxpfk/2015/pz_1205/214.html
  3. android:name="android.support.PARENT_ACTIVITY"
  4. android:value="com.example.myfirstapp.MainActivity" />
  5. http://www.kmnk01.com/hxpfk/2015/bpy_1205/218.html
复制代码

2.在activity的onCreate(Bundle savedInstanceState)方法调用setDisplayHomeAsUpEnabled()方法

  1. @Overridehttp://www.kmnk01.com/hxpfk/2015/pz_1205/215.html
  2. public void onCreate(Bundle savedInstanceState) {
  3. super.onCreate(savedInstanceState);
  4. setContentView(R.layout.activity_displaymessage);
  5. http://www.kmnk01.com/hxpfk/2015/bpy_1205/217.html
  6. getSupportActionBar().setDisplayHomeAsUpEnabled(true);
  7. // 如果不需要支持Android3.0(API11)以下的版本,则可以调用
  8. // getActionBar().setDisplayHomeAsUpEnabled(true);
  9. }http://www.kmnk01.com/hxpfk/2015/bpy_1205/216.html
复制代码

通过ActionBar和Activities的树状结构相结合,APP内的Activities结合的更加紧密。其实这也是ActionBar的最大的魅力所在。对于开发者来说,至少可以省掉一个后退按钮。对于用户来说,实时的显示Activities标签可以帮助用户定位当前APP运行的位置,以及ActionBar这个UI框架普及后,用户的学习成本也会降低。

0 0