由 ActionBarSherlock 轉為 ActionBarCompat

Actionbar 由 Android 3.0 引入,若想要在 2.x 上實現的話,以前都會使用 ActionBarSherlock (ABS), 它是 2.x 年代必備的 library 之一。事宜世易,因 Google 終於開發 for 2.x 的 actionbar library - ActionBarCompat (ABC), 並放在 android-support library 裏,而 ABS 作者也表示停止開發(雖然之後有說過會出 Kitkat version,但現在 android 5.1 推出後還是沒有消息,似乎也是無望),所以大部份新的 project 都轉用 ABC。

本來舊的 app 便由它繼續使用 ABS 也無不可,但是自從 Android 5.0 讓 app 可以轉換 Status bar 的顏色後,便很想加入,「香港天晴」中,可惜只有 ABC 支援此功能。當然,我們也能用 values-v21 的方法去實現,不過在研究一下後發現原來將 ABS 轉為 ABC 也很容易,加上 android-support library 有其他實用的功能,有些已經在使用中,換掉的話能導入少 ABS 這 library,所以決定轉用。

由 ActionBarSherlock 轉用 ActionBarCompat 的步驟:

1. Import AppCompat Project

sdk\extras\android\support\v7\appcompat 找到 appcompat, 以 library 的形式 import 進你的 app 入面。也別忘了 lib\**.jars 也要 import。

2. 將 SherlockFragmentActivity 改為 ActionBarActivity

將所有 SherlockActivity 或其他 Sherlock 開頭的 activity 都改為 ActionBarActivity,當然 import statement 也要更新。基本上此步驟不會有大問題,可以用 find and replace 一次修改。但若有使用 SherlockPreferenceActivity 的話便不行,因為 ABC 沒有相對應的 activity ,可使用 PreferenceActivity 去代替,遲點再述。

3. 將 SherlockFragment 改為 Fragment

若有使用 SherlockFragment 的話,請用 android.support.v4.app.Fragment 去代替。緊記是使用 android.support.v4.app' 中的Fragment而不是android.app.Fragment`,後者是不支援 android 2.x 的。

4. 用回本來的 Menu, MenuItem, getSupportMenuInflater()

Menu, MenuItem 用回 android.view 裏的對應項目,getSupportMenuInflater() 便改用回 getMenuInflater()

5. 更新 Menu xml

xml 中的 menushowAsAction 要由 android namespace 改為 app,不改雖然沒有 error 只有 warning,不過會失去其作用。

6. ActionView 的處理

如用 ActionView 的話,將 menuItem.getActionView() 改為 MenuItemCompat.getActionView() , setActionView() 也是同樣處埋。

7. Theme

然後將 theme 改由 Theme.Sherlock 的改為 Theme.AppCompat 的,並將所有 Sherlock 字眼的東西改為 AppCompat。懶的話可使用 Action Bar Style Generator (Google Chrome only),適合重新設計 style 的人仕。

8. PreferenceActivity

由於 ABC 沒有對應 PreferenceActivity 的 class,

由於官方建議使用 PreferenceFragment 來代替 PreferenceActivity,可是 PreferenceFragment 只在 api 11 以上才支援,android-support 中又沒對應的 class 。若要支持 2.x 的 (如不是的話為何搞這麼多東西呢?) ,stackoverflow 有人提供解決方法:使用最新的 Toolbar 去代替 ActionBar,這樣 SettingActivity 便能繼續便用 addPreferencesFromResource 等 method,又不用大改 code 或使用其他 library,便有 ActionBar 的顯示。


現在 2.x 的佔有率其實很低,若不是以往的 app 已經支援 2.x 的話,也不會想繼續支援它。新 app 都會以 4.0 作起點,但使用 AppCompat 還是必要的,因為 Android 還是不斷開發中,經常有新的功能加在最新的版本上,AppCompat 可有效的提高兼容性。