Android ActionBar

  1. ActionBar:位于标题栏的位置,要关闭ActionBar 可以配置android:theme=”@android:style/Theme.Holo.NoActionBar”,也可以调用Actionbar的Hide()函数.ActionBar提供了如下功能:
    • 显示选项菜单的菜单项(将菜单项显示成Action Item)
    • 使用程序图标作为返回Home主屏或向上的导航操作
    • 提供交互式View作为Action View
    • 提供基于Tab的导航方式,可以用于切换多个Fragement
    • 提供基于下拉的导航方式
  2. ActionBar无法同时显示所有的菜单项时,Android会根据不同手机设备采取不同行为:
    • 对有menu键的手机,点menu键即可显示剩余菜单项,菜单项无法显示图标
    • 对于没有menu键的手机,android会在最后显示一个折叠图标,用户点击折叠图标就会显示剩余菜单

  3. MenuItem title中的内容通常情况下只会在overflow中显示出来,ActionBar中由于屏幕空间有限,默认是不会显示title内容的。但是出于以下几种因素考虑,即使title中的内容无法显示出来,我们也应该给每个item中都指定一个title属性:
    • 当ActionBar中的剩余空间不足的时候,如果Action按钮指定的showAsAction属性是ifRoom的话,该Action按钮就会出现在overflow当中,此时就只有title能够显示了(通过反射调用特殊方法,也可以使图标显示在overflow menu中)。
    • 如果Action按钮在ActionBar中显示,用户可能通过长按该Action按钮的方式来查看到title的内容。
    • 屏幕阅读器(盲人使用)可以独处Menu的tit
  4. 如果是在Fragment中添加的menu item,那么单击item时会先调用Activity的onOptionsItemSelected然后是Fragment的onOperationsItemSelected
  5. ActionBar除了显示Action Item以外,还可以显示普通的UI组件,称为action view,这样的item要指定android:showAsAction="ifRoom|collapseActionView"属性收缩成一个图标item,以减少占用的空间,当点击item时控件会自己展开,如果要为UI组件添加事件处理等,可以用如下方式:
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.options, menu);
        SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();
        // Configure the search info and add any event listeners
        ...
        return super.onCreateOptionsMenu(menu);
    }
    可以用如下两种方式:
    • 添加Action Item时,设置android:actionViewClass指定Action View的实现类
    • 添加Action Item时,使用android:actionLayout指定Action View对应的视图资源
  6. 选项菜单中能够加到Actionbar中直接显示的item一般要满足下列条件之一,而Help,Setting,FeedBack等要放到overflow menu中
    • 经常使用
    • 重要
    • 典型 
  7. Android 4.0开始支持split actionbar,split actionbar会在屏幕底部显示一部分menu item,以确保顶部actionbar有足够空间显示icon和title等,对于Tab导航的actionbar,隐藏actionbar的title和icon,使用split actionbar可以使tab导航显示在屏幕最顶部。在<activity>或<application>元素中设置uiOptions="splitActionBarWhenNarrow"支持split actionbar,使用在低于4.0的android也可以使用android:uiOptions属性,系统不识别该属性就会使用之前版本的actionbar布局
  8. ActionBar调用setHomeButtonEnabled使图标变为可点击的按钮(也可以理解为menu item),menu id为android.R.menu.home(系统id),可以在onOptionsItemSelected中处理该单击事件,行为应该是下面行为之一:
    • 返回application的主activity(navigating back)
      Intent intent = new Intent(this, HomeActivity.class);
      intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
      startActivity(intent);
    • 返回application的上一层(navigating up)
  9. setHomeButtonEnabled使应用程序图标可以点击,setDisplayHomeAsUpEnabled函数(Android 4.0后才有)在应用程序图标上加上向左的箭头并使图标可点击,对应ActionBar.DISPLAY_HOME_AS_UP, 行为是navigating up,要注意的是navigating up的行为同navigating back(返回按钮的行为)行为一样都要自己在onOptionsItemSelected中实现,与navigating back行为的区别是:
    image
    image
  10. Action Provider:如同action view一样,action provider也可以替代action item,它可以自定义item的appearance和behaviors,还可以为item创建submenu.自定义ActionProvider要实现的函数:
    • ActionProvider():构造函数,会传Context参数,用于其他函数
    • onCreateActionView():为action item定义action view,可以使用Context获取一个LayoutInflater,然后填充action view
      public View onCreateActionView() {
          // Inflate the action view to be shown on the action bar.
          LayoutInflater layoutInflater = LayoutInflater.from(mContext);
          View view = layoutInflater.inflate(R.layout.action_provider, null);
          ImageButton button = (ImageButton) view.findViewById(R.id.button);
          button.setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View v) {
                  // Do something...
              }
          });
          return view;
      }
    • onPerformDefaultAction():menu item在overflow menu中时,点击item执行的action,如果通过onPrepareSubMenu()函数创建了submenu,则点击overflow menu中的item时不会执行onPerformDefaultAction,而是会弹出submenu。如果Activity或Fragment实现了onOptionsItemSelected()函数并返回True,onPerformDefaultAction()也不会被调用
    • onPrepareSubMenu():创建与指定了ActionProvider的menu item关联的submenu.只有当hasSubMenu函数返回True时该方法才执行

  11. ShareActionProvider:为actionbar提供一个share action,比如为短信引用或者社交应用分享照片,需要配置actionProviderClass属性,
    <?xml version="1.0" encoding="utf-8"?>
    <menu xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:id="@+id/menu_share"
              android:title="@string/share"
              android:showAsAction="ifRoom"
              android:actionProviderClass="android.widget.ShareActionProvider" />
        ...
    </menu>
    ShareActionProvider实现了创建子菜单,弹出显示分享目标应用,处理单击事件等逻辑,根据用户选中的频率,ShareActionProvider为每个分项目标都保存了一个优先级,优先级高的保存在列表靠前的位置,使用最多的应用作为默认分享目标直接显示在actionbar上,优先级信息默认是存放在一个私有文件中,文件名为DEFAULT_SHARE_HISTORY_FILE_NAME指定.使用ShareActionProvider的步骤通常为:
    • 获取ShareActionProvider对象
      mShareActionProvider = (ShareActionProvider) menu.findItem(R.id.menu_share).getActionProvider();
    • 调用ShareActionProvider.setShareIntent(Intent)方法,Intent参数的action必须是ACTION_SEND,并带有附加数据,如果EXTRA_TEXT,EXTRA_STREAM等
      ShareActionProvider

  12. ActionBar Tab导航的实现步骤如下:
    • 调用ActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TAB)设置使用tab导航
    • 调用ActionBar.addTab方法添加多个tab标签,并为每个tab标签添加事件监听器.系统会根据屏幕大小自动调整tabs,大屏在action bar上显示,小屏在单独的bar上显示,称为stacted action bar
      image
      image

  13. ActionBar还提供了下拉式导航方式,需要调用setNavigationg(ActionBar.NAVIGATON_MODE_LIST)方法设置使用下拉列表导航方式,调用setListNavigationCallbacks添加列表,并为每个列表设置事件监听器
原文地址:https://www.cnblogs.com/phenixyu/p/3969120.html