action bar compat読んでみた
Post on 31-May-2015
8.751 Views
Preview:
TRANSCRIPT
04/12/2023
ActionBarCompat 読んでみた
2011/12/12 中川
04/12/2023
Agenda
• Introduction• ActionBarCompat について• 読解: ActionBarCompat
04/12/2023
INTRODUCTIONどうしてこうなった
04/12/2023
現状の課題• Android 版アグリノート– スマートフォン版– タブレット版
• できれば1つの apk で済ませる• 2012 年の春〜夏にかけて訪れる
Android 4.x Icecream Sandwitch(ICS) の時代への親和性を確保する
04/12/2023
解決への基本方針• ICS 対応に主眼を置く– 理由1:アグリノートリリース直後の
2012 年春モデルは ICS だらけになると予想されるため
– 理由2: ICS はスマートフォンでもタブレットでも動作するため
• タブレット対応が次点– 理由: ICS と共通の API が多いので楽
04/12/2023
基本方針の問題点 1/2
• Android 2.3.x 以下のスマートフォンへの対応
Platform Versions | Android Developers (2012/12/1 現在 )
Platform Codename API Level Distribution
Android 1.5 Cupcake 3 0.8 %
Android 1.6 Donut 4 1.3 %
Android 2.1 Eclair 7 9.6 %
Android 2.2 Froyo 8 35.3 %
Android 2.3 - Android 2.3.2
Gingerbread 9 0.5 %
Android 2.3.3 - Android 2.3.7
10 50.1 %
Android 3.0 Honeycomb 11 0.1 %
Android 3.1 12 1.1 %
Android 3.2 13 1.2 %
04/12/2023
基本方針の問題点 2/2
• 全世界でアクティベートされたAndroid 端末のうち 97.6% がAndroid 2.3.x 以下。
• 2011 〜 2012 年冬春モデルが最後の2.3.x になったとしても、2年縛りが切れるのは 2014 年春
中長期に渡るサポートが必要
04/12/2023
解決策• Support Package
– http://developer.android.com/sdk/compatibility-library.html
– 旧称: Compatibility Package– 通称:コンパチ– Android 1.6 以上の端末に
Honeycomb 以降との互換 API を提供する
– ただし、一部の API はサポートされていない
04/12/2023
コンパチの問題点
ActionBar がサポートされていない
04/12/2023
ActionBar だいじ• Honeycomb 以降のアプリでは追加
機能へのアクセスにおけるActionBar の存在は偉大
• 実は 2.3.x までにあったOptionsMenu をちょっとゴニョればActionBar に自動で移ってくれる– が、どうせ ICS では ActionBar に載せ
ることになる
04/12/2023
2.x 系でもActionBar
使いたいなあ
04/12/2023
ACTIONBARCOMPAT について
いいものみつけたかも
04/12/2023
ActionBarCompat とは• Android 公式サンプルの一つ
http://developer.android.com/resources/samples/ActionBarCompat/index.html
• 何故かコンパチ抜きで ActionBar 実装してる
04/12/2023
つまり• ActionBarCompat の中で何が起き
ているのか分かれば、コンパチと組み合わせて、アプリの単一 apk 化も十分に可能!かも!
どうせ後でコンパチに
組み込まれるし
04/12/2023
読解 ACTIONBARCOMPATよむ。
04/12/2023
読む順• AndroidManifest.xml– res/drawable と values* も逐次
• res/layout*• res/menu• res/drawable-*• src
04/12/2023
AndroidManifest.xml
• ほぼ何の変哲もない、1つのActivity で構成されるアプリのマニフェスト
• 見所①<uses-sdk android:minSdkVersion="3" android:targetSdkVersion="14" />
意訳:「本当は ICS 向けに作ってあるけど、 Android 1.5 でも動かんわけでもないよ」
04/12/2023
AndroidManifest.xml
• 見所②android:theme=“@style/AppTheme”
※ 標準テーマ( Theme.Holo.Light )から オーバーライドしてテーマ自作してます
res/drawable/*.xml と res/values/*.xml は、概ねres/values*/style.xml を作るために存在している。
04/12/2023
res/layout*
• res/layout– actionbar_compat.xml
空の LinearLayout(horizontal)–main.xml
Button しか入ってない FrameLayout
• res/layout-v11– actionbar_indeterminate_progress.xml
ProgressBar しか入ってない FrameLayout
04/12/2023
res/menu
• main.xml–@+id/menu_refresh• android:orderInCategory=“1”• android:showAsAction=“always”
–@+id/menu_search• android:orderInCategory=“0”• android:showAsAction=“always”
–@+id/menu_share• android:orderInCategory=“1”• android:showAsAction=“never”
04/12/2023
各パラメータ• android:orderInCategory
– http://developer.android.com/guide/topics/resources/menu-resource.html
– ActionBar/ メニュー内での表示順序• android:showAsAction– ActionBar での扱い• never: 初期表示される範囲に出てこない• always: 常に表に表示• ifRoom: もし空きがあれば表に表示• withText: android:title も表示
04/12/2023
res/drawable-*
• 各サイズ共通– actionbar_shadow.9.png– ic_action_refresh.png– ic_action_search.png– ic_action_share.png– ic_home.png– ic_launcher.png
• スマホサイズ (hdpi,mdpi) 限定– ic_menu_share.png
なにこれ・・・
04/12/2023
src
• ActionBarActivity.java• ActionBarHelper.java• ActionBarHelperBase.java• ActionBarHelperICS.java• MainActivity.java• SimpleMenu.java• SimpleMenuItem.java
04/12/2023
src: 継承関係
ActionBarActivity
MainActivity
extends
Menu
SimpleMenu
implements
MenuItem
SimpleMenuItem
implements
ActionBarHelper
ActionBarHelperBaseActionBarHelperHoneycom
b
ActionBarHelperICS
extends extends
extends
色の意味: Abstract, Interface, Normal
04/12/2023
SimpleMenu/Item
• 本家 Menu/Item の縮小版実装• 「完全版は AOSP の
com.android.internal.view.menuの MenuBuilder と MenuItemImplを見に行ってね」とか書いてあった。
• Android 1.6 系にないメソッドを潰しにかかっている感じ。
04/12/2023
ActionBarActivity
• extends Activity• Abstract クラス• Activity クラスのメソッドをひたす
らオーバーライドしてActionBarHelper へ処理を委譲している
• OnCreateOptionsMenu はActionBarHelper と super を両方実行している気がする
04/12/2023
MainActivity
• extends ActionBarActivity• 何の変哲もない Activity• ボタンを押すとタイトルが変わる• メニューを押すと対応する Toast が
出てくる• ただし 2.x lower には
android.R.id.home なんて ID はない。
04/12/2023
ActionBarHelper
• Abstract クラス• 実装されている機能はバージョンご
とに ActionBarHelper○○ を返すFactory メソッドだけ
• あとは MainActivity のライフサイクルから呼び出すための空メソッド
04/12/2023
ActionBarHelperBase
• extends ActionBarHelper• ActionBar を自前で生成するという荒
行にチャレンジしているクラス• actionBar という名の ViewGroup• inflate メソッドの独自実装とか泣ける– XmlResourceParser とか初めて見た
• レイアウトの大半は styles.xml で済んでいる
04/12/2023
ActionBarHelperHoneycomb
• 本来のライフサイクル系メソッドの機能がそのまま動くように丸投げ
• setRefreshActionItemSate だけ細かい実装が入っているが、これは本来 Fragment#onCreateViewやActivity#onCreate などで実装するような部分
04/12/2023
ActionBarHelperICS
• ほぼ ActionBarHelperHoneycombに丸投げ
• ActionBar周りの Context 渡しメソッドgetActionBarThemedContext だけ、ActionBar#getThemedContext( API14 )を利用している
top related