android ActionBar與Menu - 1 - api demos 學習
android ActionBar與Menu - 2 - email中ActionBar分析
?
android2.x到現在的4.0有很大的差別,而手機開發者又沒有經歷過3.x版本的過渡,所以對于手機開發者的壓力是比較大的,需要學習和適應大量新的組件與api
?
本文主要總結對ActionBar和Menu的學習
注意:這里以4.0為base
?
作為開發者,應該閱讀下面重要新聞
先說幾句題外話
我個人覺得,應該保留實體menu按鍵,如果沒有實體按鍵,那應該如何與menu交互?android提供了方案,使用action bar,action bar是顯示在屏幕上的
等等,似乎有點問題,這也就是說:如果開發者需要menu,那么就需要消耗一部分屏幕的空間,雖然現在的手機很少有3寸以下的屏幕了,但是也沒大到增加一個action bar而不使用戶與開發者心疼的地步,起碼我是這么覺得的
之前我可以隱藏狀態欄標題欄但是保留menu,以后估計不行了
?
開始學習,以api demos - App - Action Bar中內容為主
?
menu的顯示方式
boolean android.app.Activity.onCreateOptionsMenu(Menu menu)還是保留下來了的
MenuItem actionItem = menu.add("Action Button"); actionItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
setShowAsAction:設置ActionBar中menu的顯示方式
顯示方式一共有如下5種:
從不顯示;如果有空間就顯示;總是顯示;顯示時跟隨文字;默認收縮其action view
/** Never show this item as a button in an Action Bar. */ public static final int SHOW_AS_ACTION_NEVER = 0; /** Show this item as a button in an Action Bar if the system decides there is room for it. */ public static final int SHOW_AS_ACTION_IF_ROOM = 1; /** * Always show this item as a button in an Action Bar. * Use sparingly! If too many items are set to always show in the Action Bar it can * crowd the Action Bar and degrade the user experience on devices with smaller screens. * A good rule of thumb is to have no more than 2 items set to always show at a time. */ public static final int SHOW_AS_ACTION_ALWAYS = 2; /** * When this item is in the action bar, always show it with a text label even if * it also has an icon specified. */ public static final int SHOW_AS_ACTION_WITH_TEXT = 4; /** * This item's action view collapses to a normal menu item. * When expanded, the action view temporarily takes over * a larger segment of its container. */ 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”
(模擬器中可以選擇是否有實體menu按鍵,編輯模擬器 - hardware - new - hardware back/home keys,添加此項選擇no即可去掉實體按鍵)
?
?
ActionBar還提供了Tab功能
4.0中大家發現:TabActivity已經稱為了過時的class,那么新的標簽頁如何實現,ActionBar提供一種簡單的方式
final ActionBar bar = getActionBar(); final int tabCount = bar.getTabCount(); final String text = "Tab " + tabCount; bar.addTab(bar.newTab() .setText(text) .setTabListener(new TabListener(new TabContentFragment(text))));
其中TabListener要實現ActionBar.TabListener,并實現如下幾個函數
private class TabListener implements ActionBar.TabListener { public void onTabSelected(Tab tab, FragmentTransaction ft) {} public void onTabUnselected(Tab tab, FragmentTransaction ft) {} public void onTabReselected(Tab tab, FragmentTransaction ft) {} }
?函數從名稱就能看出是做什么的了,不再贅述
?
上面是ApiDemos的示例,只需addTab即可
void android.app.ActionBar.addTab(Tab tab) void android.app.ActionBar.addTab(Tab tab, boolean setSelected) void android.app.ActionBar.addTab(Tab tab, int position) void android.app.ActionBar.addTab(Tab tab, int position, boolean setSelected
除此之外,android也提供了remove和removeAll的api,不再列舉
?
api demos中給出了Action Bar中使用menu的簡單演示 ,效果如下
上面三個menu,下面兩個,點擊Sort之后彈出二級菜單
只需在xml中進行配置即可
<menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/action_search" android:icon="@android:drawable/ic_menu_search" android:title="@string/action_bar_search" android:showAsAction="ifRoom" android:actionViewClass="android.widget.SearchView" /> <item android:id="@+id/action_add" android:icon="@android:drawable/ic_menu_add" android:title="@string/action_bar_add" /> <item android:id="@+id/action_edit" android:icon="@android:drawable/ic_menu_edit" android:showAsAction="always" android:title="@string/action_bar_edit" /> <item android:id="@+id/action_share" android:icon="@android:drawable/ic_menu_share" android:title="@string/action_bar_share" android:showAsAction="ifRoom" /> <item android:id="@+id/action_sort" android:icon="@android:drawable/ic_menu_sort_by_size" android:title="@string/action_bar_sort" android:showAsAction="ifRoom"> <menu> <item android:id="@+id/action_sort_size" android:icon="@android:drawable/ic_menu_sort_by_size" android:title="@string/action_bar_sort_size" android:onClick="onSort" /> <item android:id="@+id/action_sort_alpha" android:icon="@android:drawable/ic_menu_sort_alphabetically" android:title="@string/action_bar_sort_alpha" android:onClick="onSort" /> </menu> </item> </menu>
?
當把手機變成橫屏的時候,由于空間充足,Sort就會顯示在Action Bar中,下圖是點擊Sort后的效果
?
我們點擊By size和Alphabetically會發現,Sort的圖標會跟著改變
public void onSort(MenuItem item) { mSortMode = item.getItemId(); // Request a call to onPrepareOptionsMenu so we can change the sort icon invalidateOptionsMenu(); }
invalidateOptionsMenu會通知系統menu發生了改變,觸發onPrepareOptionsMenu和onCreateOptionsMenu ,然后再看看onPrepareOptionsMenu做了些什么
public boolean onPrepareOptionsMenu(Menu menu) { if (mSortMode != -1) { Drawable icon = menu.findItem(mSortMode).getIcon(); menu.findItem(R.id.action_sort).setIcon(icon); } return super.onPrepareOptionsMenu(menu); }
調用的時候會判斷狀態,根據狀態設置Sort圖標
?
當我們點擊Search按鈕的時候,它的Action View會顯示出來
<item android:id="@+id/action_search" android:icon="@android:drawable/ic_menu_search" android:title="@string/action_bar_search" android:showAsAction="ifRoom" android:actionViewClass="android.widget.SearchView" />
xml中顯示了Action View調用的是android.widget.SearchView這個class
public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.actions, menu); SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView(); searchView.setOnQueryTextListener(this); return true; }
在這里為SearchView設置監聽,onQueryTextChange在輸入框文字修改時觸發,onQueryTextSubmit在提交搜索時觸發
?
在xml也可以設置ActionProvider,例如
<item android:id="@+id/menu_item_action_provider_action_bar" android:showAsAction="ifRoom" android:title="@string/action_bar_settings" 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源碼中找些實例分析一下,待續
?
?
轉貼請保留以下鏈接
本人blog地址
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
