扩展用户体验之操作栏ActionBar
一、什么是ActionBar
熟悉Android的人應(yīng)該很清楚ActionBar指的是哪一部分,不熟悉的人并不清楚其的重要性,特別是Web app與Hybrid app開發(fā)者基本沒有這一概念,當然在你們平時的開發(fā)中也用到了類似于ActionBar功能的布局部分,只是實現(xiàn)當時不同而已,一個使用Java實現(xiàn),一個使用html來布局。
那到底什么是ActionBar呢?每個App的不同界面中都有一個相同的部分,這部分UI一般在一個App中是一致的,這部分就是導(dǎo)航欄,導(dǎo)航欄中一般有返回導(dǎo)航菜單,應(yīng)用圖標,產(chǎn)品徽標,當前上下文標題,快捷菜單,以及Tab,例如下圖中就是具有返回導(dǎo)航與上下文標題的操作欄(ActionBar)
?
二、Android中配置是否引入ActionBar
ActionBar并不是每個Activity具有的,有的應(yīng)用中就看不到這樣的操作欄,例如HyBrid app中整個都沒有ActionBar,但是有的App中又是用這樣的操作欄,這是如何配置的呢?這與Activity的主題有關(guān),例如使用NoActionBar的主題或者使用具有
<item name="android:windowActionBar">false</item>屬性的主題style時,該Activity就不存在ActionBar,這個不存在并不表示不顯示,而是沒有該實例,即通過mcontext.getActionBar()獲取到的是null,相反的,如果要使用ActionBar,那么就不能設(shè)置Activity的主題具有該屬性。
?
三、靜態(tài)ActionBar
靜態(tài)ActionBar是指不可操作的ActionBar,就是顯示給用戶“看”的部分,而不是點的部分。
其中包括:圖標、徽標、標題、二級標題
圖標:通過Activity注冊時的android:icon設(shè)置或者通過getActionBar().setIcon()設(shè)置
徽標:通過Activity注冊時的android:logo設(shè)置或者通過getActionBar().setLogo()設(shè)置
標題:通過Activity注冊時的android:label設(shè)置或者通過getActionBar().setTitle()設(shè)置
二級標題:通過getActionBar().setSubTitle()設(shè)置
圖標與徽標的區(qū)別:
他們兩者都是一個圖片,顯示的位置都是在標題的左側(cè),也就是最左側(cè),但是兩者只能有一個顯示,無法同時顯示,圖標表示的應(yīng)用程序快捷圖標,徽標通常是應(yīng)用或者企業(yè)的品牌,顯示徽標的時候通常不會再顯示標題,即一般的顯示組合是:圖標+標題||徽標;圖標是大小固定的正方形,無法改變,而徽標的寬度是不固定的,通常情況下控制徽標的寬度為圖標的2倍。
顯示與隱藏:
ActionBar的顯示:getActionBar().show();
ActionBar的隱藏:getActionBar().hide();
標題的顯示與隱藏:getActionBar().setDisplayShowTitleEnable(true|false);
圖標與徽標的顯示切換:如果兩者都有,則默認顯示徽標,當兩者都有又想顯示圖標是:getActionBar().setDisplayUseLogoEnable(false);
圖標與徽標同時隱藏:getActionBar().setDisplayShowHomeEnable(false);
?
四、動態(tài)ActionBar
動態(tài)ActionBar表示用戶能夠“點”的操作欄。
ActionBar中一般至少有一個返回上一級的按紐,有的甚至還有下拉菜單按紐,Tab等快捷菜單。
讓靜態(tài)的ActionBar動起來:
getActionBar().setHomeButtonEnabled(true);一行代碼能夠讓ActionBar中左側(cè)圖標、徽標、標題部分能夠點擊,當然如果設(shè)置
getActionBar().setDisplayHomeAsUpEnabled(true);這樣就會在最左邊添加一個返回箭頭,其左側(cè)點擊ActionBar內(nèi)部會廣播一個事件,觸發(fā)Activity中的onOptionsItemSelected事件,在該事件中判斷item的id,來執(zhí)行相應(yīng)操作,因為其他的快捷菜單按鈕也會觸發(fā)該事件
實現(xiàn)點擊返回上一級Activity的代碼實例:
@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.t_act);getActionBar().setHomeButtonEnabled(true);getActionBar().setDisplayHomeAsUpEnabled(true);}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {switch(item.getItemId()){case android.R.id.home:finish();return true;default:return super.onOptionsItemSelected(item);}}另一種簡單的方式是在Activity注冊的時候指定其父Activity:android:parentActivityName="",那么就不需要重寫onOptionsItemSelected方法就可以實現(xiàn)點擊返回父Activity了,建議使用第一種,因為第二種返回的動畫與打開新Activity動畫一樣,同時不利于Activity多處復(fù)用,如果一個Activity可能存在多個父Activity,這樣就沒辦法了,而且,返回按鈕一般不僅僅只是執(zhí)行返回操作,有時需要關(guān)閉一些view或?qū)υ捒蛐问紸ctivity,等關(guān)閉這些之后再點擊才關(guān)閉當前Activity。
返回按鈕圖片自定義方法:
方法一:該方法可能較低版本的Android API不支持
getActionBar().setHomeAsUpIndicator(R.drawable.back6);方法二:在樣式中配置,所有都支持
<item name="android:homeAsUpIndicator">@drawable/back6</item>?
導(dǎo)航Tab鍵的使用
配置導(dǎo)航Tab顯示:getActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
通常顯示Tab的時候也是禁用標題的,而Tab的添加需要先創(chuàng)建Tab,然后像actionbar中addTab(tab);
創(chuàng)建Tab:ActionBar.Tab tab=getActionBar().newTab().setTitle("").setIcon().setTabListener(new ActionBar.TabListener(){...});
必須指定TabListener,否則會報錯,通常在TabListener中執(zhí)行切換Fragment操作,業(yè)務(wù)邏輯是判斷對應(yīng)的fragment是否存在,如果存在(即在指定 Activity中能夠查詢到Fragment)就直接通過attach顯示,否則就先添加add該Fragment,在打開其他tab 的時候該Listener執(zhí)行detach操作
基本工作流程是:初始化、配置新的Fragment,然后在onTabSelected處理程序?qū)⒋薋ragment添加到布局。在Tab未選中時,它關(guān)聯(lián)的Fragment應(yīng)從布局中分離,當其Tab被重新選中時,該Fragment應(yīng)該被回收利用
? ? ? ? ??
ActionBar.Tab tab1=getActionBar().newTab().setText("Tab2").setTabListener(new ActionBar.TabListener() {private Fragment fragment;@Overridepublic void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {if(fragment==null){fragment=new ffFragment();ft.add(R.id.container,fragment,null);}else{ft.attach(fragment);}}@Overridepublic void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft) {if(fragment!=null){ft.detach(fragment);}}@Overridepublic void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft) {}});顯示效果:發(fā)現(xiàn)Tab 會與ActionBar分為兩行顯示,這是因為設(shè)備寬度不夠,在Pad中就會一行顯示,當然也可以強制顯示一行或兩行:
顯示一行:
try {Method setHasEmbeddedTabsMethod = getActionBar().getClass().getDeclaredMethod("setHasEmbeddedTabs", boolean.class);setHasEmbeddedTabsMethod.setAccessible(true);setHasEmbeddedTabsMethod.invoke(getActionBar(), true);} catch (Exception ignore) {}顯示兩行
try {Method setHasEmbeddedTabsMethod = getActionBar().getClass().getDeclaredMethod("setHasEmbeddedTabs", boolean.class);setHasEmbeddedTabsMethod.setAccessible(true);setHasEmbeddedTabsMethod.invoke(getActionBar(), false);} catch (Exception ignore) {}顯示成一行時Tab是基于左對齊的,也就是并不是在中間的,如果想要在中間顯示,需要通過自定義view的形式來創(chuàng)建自定義ActionBar實現(xiàn)
?
下拉列表導(dǎo)航實現(xiàn):
配置下拉列表導(dǎo)航顯示:getActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
下拉列表導(dǎo)航Spinner一樣,都是通過adapter來設(shè)置的,可以自定義復(fù)雜的adapter,然后通過setListNavigationCallbacks方法配置adapter
getActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);ArrayList<String> arrayList=new ArrayList<>();arrayList.add("aaa");arrayList.add("bbb");ArrayAdapter arrayAdapter=new ArrayAdapter(TAct.this,android.R.layout.simple_list_item_1,arrayList);getActionBar().setListNavigationCallbacks(arrayAdapter, new ActionBar.OnNavigationListener() {@Overridepublic boolean onNavigationItemSelected(int itemPosition, long itemId) {return false;}});顯示效果也與Spinner類似,不太美觀,更好的體驗需要自定義實現(xiàn)
?
五、自定義導(dǎo)航View
在Tab與下拉都不適合的情況下,操作欄允許使用setCustomView方法添加自定義View(包括布局)
getActionBar().setDisplayShowCustomEnabled(true);
getActionBar().setCustomView(R.layout.);
自定義View會出現(xiàn)同Tab和下拉列表一樣的位置,在應(yīng)用程序圖標右側(cè),但在任意操作的左側(cè)
能實現(xiàn)的效果:居中Tab與標題等
?
六、右側(cè)任意操作欄
? 應(yīng)用中菜單分類:
1、圖標菜單:在3.0以前常用的點擊menu按鈕觸發(fā)的菜單界面,具有圖標和文本的菜單,一般只顯示6個,超過6個最后一個會變成more,點擊more會顯示其余的菜單,3.0以后不建議使用,被操作欄操作代替,不能顯示復(fù)選框、單選按鈕或者快捷鍵
2、操作欄操作:同圖標菜單一樣,可以顯示圖標,也可選擇性的顯示文本,按照原定,圖標都是單色的,不能顯示復(fù)選框、單選按鈕或者快捷鍵
3、展開菜單:在3.0以前點擊圖標菜單中的more時就會觸發(fā)展開菜單,展開菜單顯示一個在圖標菜單中不可見的菜單的滾動列表
4、溢出菜單:3.0以后展開菜單被溢出菜單代替,溢出菜單包含未標識為操作欄操作的菜單項及操作欄缺少控件而溢出的菜單項
5、子菜單:Android中子菜單不能像Web中那樣呈現(xiàn)樹狀結(jié)構(gòu),而是一個點擊彈出浮動菜單對話框的操作
如何創(chuàng)建菜單:
給Activity添加一個菜單需要重寫onCreateOptionsMenu處理程序,在3.0以前當Activity第一次顯示菜單的時候會觸發(fā)該處理程序,3.0以后在Activity完成布局開始創(chuàng)建操作欄的時候觸發(fā)該處理程序
其中需要的操是:一:調(diào)用父類實現(xiàn),可能額外包含系統(tǒng)菜單選項,如果完全自定義菜單則可以不調(diào)用
二:分組
三:菜單id
四:排序方式
五:add菜單返回MenuItem引用(保留當前引用有用)
六:return true;
如果想要將菜單指定到操作欄操作中可以通過setShowAsActionFlags方法設(shè)置:SHOW_AS_ACTION,強制一個菜單項一直作為操作顯示;SHOW_AS_IF_SPACE,當操作欄有足夠空間時,會顯示指定菜單
默認的,操作欄中的菜單只顯示圖標,可以選擇SHOW_AS_ACTION_WITH_TEXT與前兩個標志做OR操作來同時顯示文本
菜單布局:
菜單中可以包括圖標、快捷方式、復(fù)選框、單選按鈕、文本
復(fù)選框:通過setCheckable(true)方法將MenuItem變成帶復(fù)選框的菜單
單選按鈕組:針對一組菜單進行的,通過menu.setGroupCheckable(groupId,true,true);設(shè)置
快捷鍵:使用menuItem的setShortcut方法設(shè)置,需要設(shè)置兩個鍵盤快捷鍵,一個數(shù)數(shù)字鍵盤,一個是全鍵盤
扼要標題:setTitleCondensed(),可以設(shè)置在圖標菜單或操作欄操作中顯示的標題,不同標題只在溢出菜單或者展開菜單中顯示
圖標:menuItem.setIcon();設(shè)置圖標,圖標只能在圖標菜單或者作為一個操作顯示,溢出菜單中是不顯示圖標的
處理點擊事件:setOnMenuItemClickListener,出于效率原因不建議單個設(shè)置,建議使用Activity的onOptionsItemSelected處理程序處理
Intent:如果某個菜單點擊操作沒有被MenuItemClick處理,也沒有被onOptionsItemSelected處理,那么就會調(diào)用startActivity(intent);
通過setIntent()方法設(shè)置菜單執(zhí)行Intent
?
轉(zhuǎn)載于:https://www.cnblogs.com/xl-xlg/p/5017012.html
總結(jié)
以上是生活随笔為你收集整理的扩展用户体验之操作栏ActionBar的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql存储过程详解[转]
- 下一篇: gets scanf以及缓冲区域的问题