2012年12月12日水曜日

ActionBarSherlockでActionBar対応したメモ

おおよそ番組改変期ごとにアップデートしている拙作Androidアプリ「あにすと」をActionBarSherlock対応したのでその自分用メモです。

要するに
  アプデついでに記事書いたからダウンロードしてよねっ!!!///
てことです。

あにすと - アニメ番組表&実況ストリーミング
https://play.google.com/store/apps/details?id=com.miquniqu.animestreamfree

■参考サイトとか書籍とか

Android 2.xでAction Barが使えるActionBarSherlockの使い方
http://d.hatena.ne.jp/gabuchan/20120227/1330302592
→とりあえずの出だしまで

ACTIONBARSHERLOCKを3.5.1から4.1にリプレイスした際の備忘録
http://blog.water-cell.jp/2012/08/abs-replace/
→Activityの継承を何に変換すればいいのかとか

ActionBarSherlockライブラリを使って、2.xでもActionBarを使用する
http://techbooster.org/android/application/13784/
→setThemeの話

ActionBarSherlockの導入が一筋縄にいかなかったのでメモ
http://www.takaiwa.net/2012/10/actionbarsherlock.html
→setThemeとAndroidManifest.xmlの話

Android UI Cookbook for 4.0 ICS(Ice Cream Sandwich)アプリ開発術

→ActionBarSherlockについては一切乗ってないけど、そもそもICSのUIとかActionBarのスタイル変更とかのっててすこぶる助かる本

■ActionBarSherlock対応でやったこと

大まかに以下のようなことをやりました。

  • 上記各サイトを参考に、ActionBarのプロジェクトを導入
  • android-support-v4.jarを削除したり再適用したり
  • 全体のActvitiyをSherlockActivity系継承に
  • AndroidManifestでsherlock系のテーマ指定
  • オプションメニューのmenuやらmenuitemのパッケージをcom.actionbarsherlock.viewに
  • menuitem.setShowAsActionでSHOW_AS_ACTION_ALWAYSとか指定
  • actionBar.setTitle(~)でタイトル設定
  • ホーム以外はactionBar.setDisplayHomeAsUpEnabled(true)してアイコンと矢印マーク設定
  • アプリケーションアイコン押されたときのandroid.R.id.homeでfinish or ホームActivity遷移
  • getActivityしてる箇所をgetSherlockActivityに変更
  • Fragmentの場合はgetSherlockActivityでnullになる場合を考慮してnullチェック追加
  • 旧VerのアイコンをActionBar上に表示させるとダサいので、API16のアイコンを自アプリ内に取り込み

 

■要所のメモ

AndroidManifestでsherlock系のテーマ指定

よく見かけるサンプルコードではsetContentView()の前にsetTheme()でsherlock提供のテーマを指定するような記載となってるのですが、全Activityで作業するのは忘れるし面倒なのでAndroidManifest.xmlでやったほうがいい気がします。

  1:         <activity
  2:             android:name=".MainActivity"
  3:             android:label="@string/title_activity_main"
  4:             android:theme="@style/Theme.Sherlock.Light" 
  5:             >
  6: 


で、これだけだとイカのような灰色の背景になりますね。

device-2012-12-12-045232



そこで、「あにすと」はもともとActionBar風なViewを配置して背景青にしていたので背景色変えたいです。
「Android UI Cookbook for 4.0 ICS(Ice Cream Sandwich)アプリ開発術」の記載内容を元に背景を設定してみます。(要所のみ記載しますが、サンプルコードもあるしわかりやすい本なのでぜひ買いましょう!)



AndroidManifest.xmlをカスタムテーマ指定にして

  1: <activity
  2:             android:name=".MainActivity"
  3:             android:label="@string/title_activity_main"
  4:             android:theme="@style/MyTheme"
  5:             >


style.xmlにその定義を記載します。
parentとしてSherlockのテーマを継承しておかないとSherlockのActionBarがうまく動作しないので必ず指定します。

  1:     <style name="MyTheme" parent="@style/Theme.Sherlock.Light">
  2:         <item name="android:actionBarStyle">@style/MyActionBarStyle</item>
  3:     </style>
  4: 


↑こんな感じです。



parentで指定されているTheme.Sherlock.Lightは

  1: <item name="actionBarStyle">@style/Widget.Sherlock.Light.ActionBar.Solid</item>

↑と定義してるので、これを継承して

  1:     <style name="MyActionBarStyle" parent="@style/Widget.Sherlock.Light.ActionBar.Solid">
  2:         <item name="android:background">#0099AA</item>
  3:         <item name="android:backgroundSplit">#0099AA</item>
  4:         <item name="android:backgroundStacked">#0099AA</item>
  5:         <item name="android:titleTextStyle">@style/MyActionBarTitleStyle</item>
  6:     </style>
  7: 

↑こうします。

titleTextStyleも同じような感じで対処して

  1:     <style name="MyActionBarTitleStyle" parent="@style/TextAppearance.Sherlock.Widget.ActionBar.Title">
  2:         <item name="android:textColor">#FFFFFF</item>
  3:         <item name="android:textStyle">bold</item>
  4:     </style>
  5: 

↑こうします。

まとめると、以下のとおり。

  1: <resources>
  2: 
  3:     <style name="MyTheme" parent="@style/Theme.Sherlock.Light">
  4:         <item name="android:actionBarStyle">@style/MyActionBarStyle</item>
  5:     </style>
  6: 
  7:     <style name="MyActionBarStyle" parent="@style/Widget.Sherlock.Light.ActionBar.Solid">
  8:         <item name="android:background">#0099AA</item>
  9:         <item name="android:backgroundSplit">#0099AA</item>
 10:         <item name="android:backgroundStacked">#0099AA</item>
 11:         <item name="android:titleTextStyle">@style/MyActionBarTitleStyle</item>
 12: 	</style>
 13: 
 14:     <style name="MyActionBarTitleStyle" parent="@style/TextAppearance.Sherlock.Widget.ActionBar.Title">
 15:         <item name="android:textColor">#FFFFFF</item>
 16:         <item name="android:textStyle">bold</item>
 17:     </style>
 18:     
 19: </resources>


これを各OSバージョンで表示してみました。



device-2012-12-12-220937device-2012-12-12-221128device-2012-12-12-220700



色がついた端末とついてない端末があります。
システムアイコンがダサくなってるのはともかく色が反映されていないのはまずい。



よくわからないので、ActionBarSherlockのResフォルダをみてたらこんなんなってました。



image


エイリアス定義でvalues、values-v11、values-v14向けのabs__themeファイルがありますね。

デフォルトのabs__themes.xmlではTheme.Sherlock.Light定義が

  1: <style name="Theme.Sherlock.Light" parent="Sherlock.__Theme.Light">

↑となっています。

Sherlock.__Theme.Lightはどうなってるかというと

  1: valuesのabs__themes.xml
  2:     <style name="Sherlock.__Theme.Light" parent="android:Theme.Light.NoTitleBar">
  3:          ~
  4:         <item name="actionBarStyle">@style/Widget.Sherlock.Light.ActionBar.Solid</item>
  5:          ~
  6:     </style>
  7: 
  8: values-v11のabs__themes.xml
  9:     <style name="Sherlock.__Theme.Light" parent="android:Theme.Holo.Light">
 10:         <item name="android:windowNoTitle">true</item>
 11:         <item name="android:windowActionBar">false</item>
 12:     </style>
 13: 
 14: values-v14のabs__themes.xml
 15:     <style name="Sherlock.__Theme.Light" parent="android:Theme.Holo.Light">
 16:     </style>
 17: 


これはあれですかね。
v11未満(ver 3.0未満)はSherlockの定義するスタイルを上書きして、
それ以降(ver 3.0以降)は標準のスタイルを上書きしてあげると背景色が反映されるということですかね。



ということで、以下の2種類を配置してみました。


/* 2013.05.28 そういえばの追記

上記でv11未満は~といいつつ「values or values-v14のstyles.xml」の2種類だけ提示してv11~v13の
いわゆるハニカム端末を無視してるのは、明らかにうっかり確認してなかったからでして、
上記の確認結果から行くと「values or values-v11のstyles.xml」としておくのが正解だったかなぁと
今になっておもいます。
が、いまさら確認するのも面倒ですので追記にとどめておきます。
個人的にはハニカムなんてなかったんだ!という見解で押し通したい所存。
ちな、本文中も少し手を入れてます。
*/

  1: valuesのstyles.xml
  2: <resources>
  3: 
  4:     <style name="MyTheme" parent="@style/Theme.Sherlock.Light">
  5:         <item name="actionBarStyle">@style/MyActionBarStyle</item>
  6:     </style>
  7: 
  8:     <style name="MyActionBarStyle" parent="@style/Widget.Sherlock.Light.ActionBar.Solid">
  9:         <item name="background">#0099AA</item>
 10:         <item name="backgroundSplit">#0099AA</item>
 11:         <item name="backgroundStacked">#0099AA</item>
 12:         <item name="titleTextStyle">@style/MyActionBarTitleStyle</item>
 13: 	</style>
 14: 
 15:     <style name="MyActionBarTitleStyle" parent="@style/TextAppearance.Sherlock.Widget.ActionBar.Title">
 16:         <item name="android:textColor">#FFFFFF</item>
 17:         <item name="android:textStyle">bold</item>
 18:     </style>
 19:     
 20: </resources>
 21: 
 22: values-v14のstyles.xml
 23: <resources>
 24: 
 25:     <style name="MyTheme" parent="@style/Theme.Sherlock.Light">
 26:         <item name="android:actionBarStyle">@style/MyActionBarStyle</item>
 27:     </style>
 28: 
 29:     <style name="MyActionBarStyle" parent="@style/Widget.Sherlock.Light.ActionBar.Solid">
 30:         <item name="android:background">#0099AA</item>
 31:         <item name="android:backgroundSplit">#0099AA</item>
 32:         <item name="android:backgroundStacked">#0099AA</item>
 33:         <item name="android:titleTextStyle">@style/MyActionBarTitleStyle</item>
 34: 	</style>
 35: 
 36:     <style name="MyActionBarTitleStyle" parent="@style/TextAppearance.Sherlock.Widget.ActionBar.Title">
 37:         <item name="android:textColor">#FFFFFF</item>
 38:         <item name="android:textStyle">bold</item>
 39:     </style>
 40:     
 41: </resources>
 42: 


device-2012-12-12-223537device-2012-12-12-223515device-2012-12-12-223453



できたー!



■github



に登録しておきました。





ここ。
https://github.com/miquniqu/AndroidTips/tree/master/Tips03



ではでは

0 件のコメント:

コメントを投稿