由 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 中的 menu
的 showAsAction
要由 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
可有效的提高兼容性。