现在的位置: 首页 > 综合 > 正文

Android ActionBar与Menu – 1 – api demos 学习

2013年10月27日 ⁄ 综合 ⁄ 共 7021字 ⁄ 字号 评论关闭

android2.x到现在的4.0有很大的差别,而手机开发者又没有经历过3.x版本的过渡,所以对于手机开发者的压力是比较大的,需要学习和适应大量新的组件与api

 

本文主要总结对ActionBar和Menu的学习

注意:这里以4.0为base

 

作为开发者,应该阅读下面重要新闻

谷歌敦促Android开发者停止使用菜单按钮

先说几句题外话

我个人觉得,应该保留实体menu按键,如果没有实体按键,那应该如何与menu交互?android提供了方案,使用action bar,action bar是显示在屏幕上的

等等,似乎有点问题,这也就是说:如果开发者需要menu,那么就需要消耗一部分屏幕的空间,虽然现在的手机很少有3寸以下的屏幕了,但是也没大到增加一个action bar而不使用户与开发者心疼的地步,起码我是这么觉得的

之前我可以隐藏状态栏标题栏但是保留menu,以后估计不行了

 

开始学习,以api demos - App - Action Bar中内容为主

 

boolean android.app.Activity.onCreateOptionsMenu(Menu menu)还是保留下来了的

 

Java代码  收藏代码
  1. MenuItem actionItem = menu.add("Action Button");  
  2. actionItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);  

setShowAsAction是设置ActionBar中menu的显示方式的

显示方式一共有如下5种:

从不显示;如果有空间就显示;总是显示;显示时跟随文字;默认收缩其action view

Java代码  收藏代码
  1. /** Never show this item as a button in an Action Bar. */  
  2. public static final int SHOW_AS_ACTION_NEVER = 0;  
  3. /** Show this item as a button in an Action Bar if the system decides there is room for it. */  
  4. public static final int SHOW_AS_ACTION_IF_ROOM = 1;  
  5. /** 
  6. * Always show this item as a button in an Action Bar. 
  7. * Use sparingly! If too many items are set to always show in the Action Bar it can 
  8. * crowd the Action Bar and degrade the user experience on devices with smaller screens. 
  9. * A good rule of thumb is to have no more than 2 items set to always show at a time. 
  10. */  
  11. public static final int SHOW_AS_ACTION_ALWAYS = 2;  
  12.   
  13. /** 
  14. * When this item is in the action bar, always show it with a text label even if 
  15. * it also has an icon specified. 
  16. */  
  17. public static final int SHOW_AS_ACTION_WITH_TEXT = 4;  
  18.   
  19. /** 
  20. * This item's action view collapses to a normal menu item. 
  21. * When expanded, the action view temporarily takes over 
  22. * a larger segment of its container. 
  23. */  
  24. public static final int SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW = 8;  

其中SHOW_AS_ACTION_WITH_TEXT需要注意一下

在手机中,竖屏状态下text是不会显示的,切换到横屏才会显示text

 

SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW也需要特别说明一下

menu的每个item都可以设置action view,如果设置了,那么这个view默认是显示的,设置了SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW后,则默认不显示

 

另外需要说明的是:

现在手机有两种,一种是有实体按键的手机,不在action bar显示的item,按menu则会看到剩余的item

另一种是没有实体menu键的手机,他们通过action bar等触发menu,所有的item都会在action bar显示,“显示不下”的item会在action bar最后一个item触发显示剩余item列表,类似于之前我们按menu键后出现的“more”

 

 

ActionBar还提供了Tab功能

4.0中大家发现:TabActivity已经称为了过时的class,那么新的标签页如何实现,ActionBar提供一种简单的方式

Java代码  收藏代码
  1. final ActionBar bar = getActionBar();  
  2. final int tabCount = bar.getTabCount();  
  3. final String text = "Tab " + tabCount;  
  4. bar.addTab(bar.newTab()  
  5.         .setText(text)  
  6.         .setTabListener(new TabListener(new TabContentFragment(text))));  

其中TabListener要实现ActionBar.TabListener,并实现如下几个函数

 

Java代码  收藏代码
  1. private class TabListener implements ActionBar.TabListener {  
  2.     public void onTabSelected(Tab tab, FragmentTransaction ft) {}  
  3.     public void onTabUnselected(Tab tab, FragmentTransaction ft) {}  
  4.     public void onTabReselected(Tab tab, FragmentTransaction ft) {}  
  5. }  

 函数从名称就能看出是做什么的了,不再赘述

 

上面是ApiDemos的示例,只需addTab即可

Java代码  收藏代码
  1. void android.app.ActionBar.addTab(Tab tab)  
  2. void android.app.ActionBar.addTab(Tab tab, boolean setSelected)  
  3. void android.app.ActionBar.addTab(Tab tab, int position)  
  4. void android.app.ActionBar.addTab(Tab tab, int position, boolean setSelected  

除此之外,android也提供了remove和removeAll的api,不再列举

api demos中给出了Action Bar中使用menu的简单演示,效果如下

  

上面三个menu,下面两个,点击Sort之后弹出二级菜单

只需在xml中进行配置即可

 

Xml代码  收藏代码
  1. <menu xmlns:android="http://schemas.android.com/apk/res/android">  
  2.     <item android:id="@+id/action_search"  
  3.           android:icon="@android:drawable/ic_menu_search"  
  4.           android:title="@string/action_bar_search"  
  5.           android:showAsAction="ifRoom"  
  6.           android:actionViewClass="android.widget.SearchView" />  
  7.     <item android:id="@+id/action_add"  
  8.           android:icon="@android:drawable/ic_menu_add"  
  9.           android:title="@string/action_bar_add" />  
  10.     <item android:id="@+id/action_edit"  
  11.           android:icon="@android:drawable/ic_menu_edit"  
  12.           android:showAsAction="always"  
  13.           android:title="@string/action_bar_edit" />  
  14.     <item android:id="@+id/action_share"  
  15.           android:icon="@android:drawable/ic_menu_share"  
  16.           android:title="@string/action_bar_share"  
  17.           android:showAsAction="ifRoom" />  
  18.     <item android:id="@+id/action_sort"  
  19.           android:icon="@android:drawable/ic_menu_sort_by_size"  
  20.           android:title="@string/action_bar_sort"  
  21.           android:showAsAction="ifRoom">  
  22.         <menu>  
  23.             <item android:id="@+id/action_sort_size"  
  24.                   android:icon="@android:drawable/ic_menu_sort_by_size"  
  25.                   android:title="@string/action_bar_sort_size"  
  26.                   android:onClick="onSort" />  
  27.             <item android:id="@+id/action_sort_alpha"  
  28.                   android:icon="@android:drawable/ic_menu_sort_alphabetically"  
  29.                   android:title="@string/action_bar_sort_alpha"  
  30.                   android:onClick="onSort" />  
  31.         </menu>  
  32.     </item>  
  33. </menu>  

 

当把手机变成横屏的时候,由于空间充足,Sort就会显示在Action Bar中,下图是点击Sort后的效果

 

我们点击By size和Alphabetically会发现,Sort的图标会跟着改变

 

Java代码  收藏代码
  1. public void onSort(MenuItem item) {  
  2.     mSortMode = item.getItemId();  
  3.     // Request a call to onPrepareOptionsMenu so we can change the sort icon  
  4.     invalidateOptionsMenu();  
  5. }  

 

invalidateOptionsMenu会通知系统menu发生了改变,触发onPrepareOptionsMenu和onCreateOptionsMenu,然后再看看onPrepareOptionsMenu做了些什么

 

Java代码  收藏代码
  1. public boolean onPrepareOptionsMenu(Menu menu) {  
  2.     if (mSortMode != -1) {  
  3.         Drawable icon = menu.findItem(mSortMode).getIcon();  
  4.         menu.findItem(R.id.action_sort).setIcon(icon);  
  5.     }  
  6.     return super.onPrepareOptionsMenu(menu);  
  7. }  

 

调用的时候会判断状态,根据状态设置Sort图标

 

当我们点击Search按钮的时候,它的Action View会显示出来

 

Xml代码  收藏代码
  1. <item android:id="@+id/action_search"  
  2.       android:icon="@android:drawable/ic_menu_search"  
  3.       android:title="@string/action_bar_search"  
  4.       android:showAsAction="ifRoom"  
  5.       android:actionViewClass="android.widget.SearchView" />  

 

xml中显示了Action View调用的是android.widget.SearchView这个class

 

Java代码  收藏代码
  1. public boolean onCreateOptionsMenu(Menu menu) {  
  2.     MenuInflater inflater = getMenuInflater();  
  3.     inflater.inflate(R.menu.actions, menu);  
  4.     SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();  
  5.     searchView.setOnQueryTextListener(this);  
  6.     return true;  
  7. }  

在这里为SearchView设置监听,onQueryTextChange在输入框文字修改时触发,onQueryTextSubmit在提交搜索时触发

 

在xml也可以设置ActionProvider,例如

 

Java代码  收藏代码
  1. <item android:id="@+id/menu_item_action_provider_action_bar"  
  2.     android:showAsAction="ifRoom"  
  3.     android:title="@string/action_bar_settings"  
  4.     android:actionProviderClass="com.example.android.apis.app.ActionBarSettingsActionProviderActivity$SettingsActionProvider"/>  

 

ActionProvider的使用暂时不做过多讨论

 

上面的图片是一个Action Bar,可以分为几个部分,他们都可以设置为显示或者不显示,从左至右依次为:

ActionBar.DISPLAY_HOME_AS_UP:类似于提示作用,上图为一个脱字符(Up caret),不能单独只显示这个。。

ActionBar.DISPLAY_SHOW_HOME:大大的android图片为home,当然这个默认为apk的图标,可以通过ActionBar.DISPLAY_USE_LOGO来设置使用什么图片

ActionBar.DISPLAY_SHOW_TITLE:接下来的是title

ActionBar.DISPLAY_SHOW_CUSTOM:然后是定制的View,可以通过void android.app.ActionBar.setCustomView(View view, LayoutParams layoutParams)设置

 

api demos中关于Action Bar的内容总结完了,我想掌握了这些,基本使用应该是没有问题了,之后打算在android源码中找些实例分析一下,待续

抱歉!评论已关闭.