Action Bar在实际应用中,很好地为用户提供了导航,窗口位置标识,操作点击等功能。它出现于Android3.0(API 11)之后的版本中,在2.1之后的版本中也可以使用。

添加与隐藏Action Bar

  在3.0之后的版本中(android:minSdkVersion 或者 android:targetSdkVersion 属性被设置成11或者更高),默认在activity中添加了Action Bar,不用额外添加。如果不想在activity中使用Action Bar,我们可以通过设定activity的主题来实现。

  在程序运行过程中,也可以动态隐藏或者显示Action Bar:

  动态显示或隐藏将引起当前的activity界面重绘。如果需要频繁的显示或隐藏,可以使用overlay模式,将一个action bar固定在当前activity界面上方,无论显示或隐藏都不会使activity界面重绘。

为Action Bar添加Item

  action bar上通常放置着最常用的item便于用户进行操作,那些不重要的item会被隐藏于overflow 的item中。Item通常被预定义于menu资源文件中,如下:

  当一个activity启动后,在onCreateOptionsMenu()方法来填充ab中预设的item。

在item的showAsAction属性中,选项含义如下:

  1. never:永远不会显示。只会在溢出列表中显示。
  2. ifRoom:会显示在Item中,但是如果已经有4个或者4个以上的Item时会隐藏在溢出列表中。
  3. always:无论是否溢出,总会显示。
  4. withText:Title会显示。
  5. collapseActionView:可拓展的Item。

处理item事件

  当用户触发item的点击事件后,通过onOptionsItemSelected()方法来处理事件,如下:

通过APP图标返回上一层

  单击app图标回退上一层功能与单击back返回按钮是完全不同的两个功能,后者是根据时间的顺序,向后返回到上一个用户操作界面,而不是根据app的层次结构返回。

  启用向上一层返回功能,需要调用setDisplayHomeAsUpEnabled()方法:

  除此之外,我们还需要指定向上返回到哪个activity,根据不同情况有两种方式:

  当前activity有唯一的父activity A,即能从A这个activity跳转到当前的activity,那么可以通过在manifest文件中指定父activity:

  如果有多个父activity,则通过复写getSupportParentActivityIntent()onCreateSupportNavigateUpTaskStack()方法来指定要回到哪个activity。

  当用户在同一个app的若干层activity中进行操作时,单击UP进行回退,此时系统会调用getSupportParentActivityIntent()方法。由于可能存在多个父activity,在此方法中可以返回一个启动父activity的Intent。

  当用户在进行跨app的多层activity中进行操作时,单击UP进行回退,系统会调用onCreateSupportNavigateUpTaskStack()方法。此时,需要将TaskStackBuilder传递给该方法,构造相应的回退栈。

  即使复写了getSupportParentActivityIntent()方法来指定在本app中回退的操作后,并不是一定要复写onCreateSupportNavigateUpTaskStack()方法,通过在manifest文件中指定默认activity即可。

添加Action View

  在action bar上添加action view这种小插件,可以帮助用户在不改变当前activity或fragment的情况下完成一些功能,例如搜索等等。

  通过在menu文件的item中声明actionLayoutactionViewClass属性来指定需要使用的布局文件或者类,例如添加一个搜索控件:

  在menu文件中添加完成后,可以在onCreateOptionsMenu()方法中获取并配置该action view:

  通过将获取到的menuItem项传递给getActionView方法取得该action view,如果在11版本之上,则直接调用getActionView即可:

  通过指定collapseActionView属性可以让action view折叠起来,单击后又会出现,此时系统会自动回调onOptionsItemSelected()方法,如果你将其返回结果为true(意味着你已经处理了该事件,不要将该事件继续传递下去),则action view将无法展开。

添加Action Provider

  与action view相似,action provider使用定制的布局来取代了固定的action button. 它将一系列action放入子菜单,单击它会展示出来。

  因为action provider定义了自身的action行为,所以无需在onOptionsItemSelected()方法中监听点击事件。

  通过指定item的actionViewClass属性来指定使用的provider类,也可以通过继承并扩展ActionProvider类来自定义provider. Android预定义了一些provider,例如ShareActionProvider,便于开发者实现分享功能:

  此时,我们需要指定分享要用到的Intent。这里,我们需要获取到MenuItem并传递给getActionProvider()方法,从而获取到provider。通过setShareIntent()方法设置分享所用到的Intent, 用来初始化分享action,但用户所处的context是变化的,所以必须及时更新要分享的intent。例子如下:

  这时的shareActionProvider负责处理用户的一切交互行为,所以无需在onOptionsItemSelected()方法中处理监听事件。默认情况下,shareActionProvider记录了用户选择每个item的频率排名,并按此排名由高到低对所有item排序。

自定义provider

  我们可以通过继承扩展ActionProvider类来自定义provider,需要覆写如下几个方法:

  • ActionProvider() :构造方法中传入了app的context,应存为全局变量使用。
  • onCreateActionView(MenuItem) :在这个方法中定义item中要显示的view,完成初始化view和事件监听处理等操作:

  • onPerformDefaultAction() :当菜单选项从overflow中被选中,系统将会调用此方法。provider应该为菜单项提供一个默认的action。

  然而,如果provider通过onPrepareSubMenu()方法提供了子菜单,那么即使这个provider被放入了overflow中,子菜单也会被展示出来。

添加导航Tabs

  在action bar上添加导航的tabs可以帮助用户方便地切换视图,另外,这些导航tabs能很好地适配各种机型的屏幕。

  首先,我们的界面上要有一个放置fragment的viewgroup,最基本的做法如下:

    •   实现 ActionBar.TabListener 接口用于响应tabs的事件。
    •   实例化需要添加的tab,并为它设置响应事件。
    •   通过 addTab() 方法将实例化好的tab添加进去。

在这个例子中,当tab被点击时,listener将对应的fragment实例化并加入到布局中。接下来要创建tab对象并添加进action bar中。另外,需要设置setNavigationMode(NAVIGATION_MODE_TABS),使得tabs可见。下面展示如何使用listener:

  当activity停止的时候,可以记录下当前tab所处的位置(getSelectedNavigationIndex()),这样再次打开activity时,就可以看到关闭时候的tab了。

  我们也可以使用viewpager来管理fragment,我们只需在方法onTabSelected()中告诉viewpager当前选中了哪个fragment,这样就可以实现手势滑动切换view的功能了。

添加下拉导航

  下拉导航通常用于放置那些必须但不是经常用到的导航项目。添加下拉导航通常需要以下步骤:

    •   创建一个 SpinnerAdapter 用于提供可选择列表项。
    •   实现 ActionBar.OnNavigationListener 接口,监听选择事件。
    •   在activity的 onCreate() 中设置 setNavigationMode(NAVIGATION_MODE_LIST) 来使下拉列表可用。
    •   通过 setListNavigationCallbacks() 方法设置下拉列表的回调函数:
        actionBar.setListNavigationCallbacks(mSpinnerAdapter, mNavigationCallback);

  SpinnerAdapter是一个接口用于为spinner提供数据。同时,Android也提供了其他可以被继承的adapter,例如arrayadapter或simplecursoradapter。例如,通过arrayadapter创建一个使用字符串数组为数据源的adapter:

  SpinnerAdapter mSpinnerAdapter =ArrayAdapter.createFromResource(this,R.array.action_list, android.R.layout.simple_spinner_dropdown_item);

  ActionBar.OnNavigationListener接口中需要实现选中项目的响应事件,下面例子将一个fragment加入到布局中:

更多相关文章

  1. Instrumentation 框架简介
  2. Android(安卓)系统启动过程详解
  3. Android(安卓)的invalidate 与postInvalidate的用法
  4. Flutter 混合开发(Android)Flutter跟Native相互通信
  5. Android中ViewGroup等容器控件的使用
  6. Android高效编程注意事项
  7. Android的SDK,NDK以及JNI
  8. 浅谈Java中Collections.sort对List排序的两种方法
  9. Python list sort方法的具体使用

随机推荐

  1. Android——使用ContentProvider在应用间
  2. Android的Drawable和Bitmap之间相关转换
  3. Android中的多线程机制
  4. React Native -1环境搭建(macOS--Android)
  5. Android之Menu选项菜单
  6. android 3D系列之光效篇
  7. View的刷新机制
  8. android:三种菜单(Menu)的设置
  9. Android(安卓)fragment 重叠问题,闪退后fr
  10. android:layout_marginEnd隐藏的坑 or se