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