Action Bar Compat読んでみた

31
ActionBarCompat 読読読読読 2011/12/12 読読 06/16/2022

Transcript of Action Bar Compat読んでみた

Page 1: Action Bar Compat読んでみた

04/12/2023

ActionBarCompat 読んでみた

2011/12/12 中川

Page 2: Action Bar Compat読んでみた

04/12/2023

Agenda

• Introduction• ActionBarCompat について• 読解: ActionBarCompat

Page 3: Action Bar Compat読んでみた

04/12/2023

INTRODUCTIONどうしてこうなった

Page 4: Action Bar Compat読んでみた

04/12/2023

現状の課題• Android 版アグリノート– スマートフォン版– タブレット版

• できれば1つの apk で済ませる• 2012 年の春〜夏にかけて訪れる

Android 4.x Icecream Sandwitch(ICS) の時代への親和性を確保する

Page 5: Action Bar Compat読んでみた

04/12/2023

解決への基本方針• ICS 対応に主眼を置く– 理由1:アグリノートリリース直後の

2012 年春モデルは ICS だらけになると予想されるため

– 理由2: ICS はスマートフォンでもタブレットでも動作するため

• タブレット対応が次点– 理由: ICS と共通の API が多いので楽

Page 6: Action Bar Compat読んでみた

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 %

Page 7: Action Bar Compat読んでみた

04/12/2023

基本方針の問題点 2/2

• 全世界でアクティベートされたAndroid 端末のうち 97.6% がAndroid 2.3.x 以下。

• 2011 〜 2012 年冬春モデルが最後の2.3.x になったとしても、2年縛りが切れるのは 2014 年春

中長期に渡るサポートが必要

Page 8: Action Bar Compat読んでみた

04/12/2023

解決策• Support Package

– http://developer.android.com/sdk/compatibility-library.html

– 旧称: Compatibility Package– 通称:コンパチ– Android 1.6 以上の端末に

Honeycomb 以降との互換 API を提供する

– ただし、一部の API はサポートされていない

Page 9: Action Bar Compat読んでみた

04/12/2023

コンパチの問題点

ActionBar がサポートされていない

Page 10: Action Bar Compat読んでみた

04/12/2023

ActionBar だいじ• Honeycomb 以降のアプリでは追加

機能へのアクセスにおけるActionBar の存在は偉大

• 実は 2.3.x までにあったOptionsMenu をちょっとゴニョればActionBar に自動で移ってくれる– が、どうせ ICS では ActionBar に載せ

ることになる

Page 11: Action Bar Compat読んでみた

04/12/2023

2.x 系でもActionBar

使いたいなあ

Page 12: Action Bar Compat読んでみた

04/12/2023

ACTIONBARCOMPAT について

いいものみつけたかも

Page 14: Action Bar Compat読んでみた

04/12/2023

つまり• ActionBarCompat の中で何が起き

ているのか分かれば、コンパチと組み合わせて、アプリの単一 apk 化も十分に可能!かも!

どうせ後でコンパチに

組み込まれるし

Page 15: Action Bar Compat読んでみた

04/12/2023

読解 ACTIONBARCOMPATよむ。

Page 16: Action Bar Compat読んでみた

04/12/2023

読む順• AndroidManifest.xml– res/drawable と values* も逐次

• res/layout*• res/menu• res/drawable-*• src

Page 17: Action Bar Compat読んでみた

04/12/2023

AndroidManifest.xml

• ほぼ何の変哲もない、1つのActivity で構成されるアプリのマニフェスト

• 見所①<uses-sdk android:minSdkVersion="3" android:targetSdkVersion="14" />

意訳:「本当は ICS 向けに作ってあるけど、  Android 1.5 でも動かんわけでもないよ」

Page 18: Action Bar Compat読んでみた

04/12/2023

AndroidManifest.xml

• 見所②android:theme=“@style/AppTheme”

※ 標準テーマ( Theme.Holo.Light )から オーバーライドしてテーマ自作してます

res/drawable/*.xml と res/values/*.xml は、概ねres/values*/style.xml を作るために存在している。

Page 19: Action Bar Compat読んでみた

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

Page 20: Action Bar Compat読んでみた

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”

Page 21: Action Bar Compat読んでみた

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 も表示

Page 22: Action Bar Compat読んでみた

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

なにこれ・・・

Page 23: Action Bar Compat読んでみた

04/12/2023

src

• ActionBarActivity.java• ActionBarHelper.java• ActionBarHelperBase.java• ActionBarHelperICS.java• MainActivity.java• SimpleMenu.java• SimpleMenuItem.java

Page 24: Action Bar Compat読んでみた

04/12/2023

src: 継承関係

ActionBarActivity

MainActivity

extends

Menu

SimpleMenu

implements

MenuItem

SimpleMenuItem

implements

ActionBarHelper

ActionBarHelperBaseActionBarHelperHoneycom

b

ActionBarHelperICS

extends extends

extends

色の意味: Abstract, Interface, Normal

Page 25: Action Bar Compat読んでみた

04/12/2023

SimpleMenu/Item

• 本家 Menu/Item の縮小版実装• 「完全版は AOSP の

com.android.internal.view.menuの MenuBuilder と MenuItemImplを見に行ってね」とか書いてあった。

• Android 1.6 系にないメソッドを潰しにかかっている感じ。

Page 26: Action Bar Compat読んでみた

04/12/2023

ActionBarActivity

• extends Activity• Abstract クラス• Activity クラスのメソッドをひたす

らオーバーライドしてActionBarHelper へ処理を委譲している

• OnCreateOptionsMenu はActionBarHelper と super を両方実行している気がする

Page 27: Action Bar Compat読んでみた

04/12/2023

MainActivity

• extends ActionBarActivity• 何の変哲もない Activity• ボタンを押すとタイトルが変わる• メニューを押すと対応する Toast が

出てくる• ただし 2.x lower には

android.R.id.home なんて ID はない。

Page 28: Action Bar Compat読んでみた

04/12/2023

ActionBarHelper

• Abstract クラス• 実装されている機能はバージョンご

とに ActionBarHelper○○ を返すFactory メソッドだけ

• あとは MainActivity のライフサイクルから呼び出すための空メソッド

Page 29: Action Bar Compat読んでみた

04/12/2023

ActionBarHelperBase

• extends ActionBarHelper• ActionBar を自前で生成するという荒

行にチャレンジしているクラス• actionBar という名の ViewGroup• inflate メソッドの独自実装とか泣ける– XmlResourceParser とか初めて見た

• レイアウトの大半は styles.xml で済んでいる

Page 30: Action Bar Compat読んでみた

04/12/2023

ActionBarHelperHoneycomb

• 本来のライフサイクル系メソッドの機能がそのまま動くように丸投げ

• setRefreshActionItemSate だけ細かい実装が入っているが、これは本来 Fragment#onCreateViewやActivity#onCreate などで実装するような部分

Page 31: Action Bar Compat読んでみた

04/12/2023

ActionBarHelperICS

• ほぼ ActionBarHelperHoneycombに丸投げ

• ActionBar周りの Context 渡しメソッドgetActionBarThemedContext だけ、ActionBar#getThemedContext( API14 )を利用している