MyTracks
コンパイルエラーが取れたので中身を確認。とりあえず Manifest 見たところではエントリポイントは com.google.android.apps.mytracks.MyTracks#onCreate() かな。
てっぺんから順に確認入れていきます。
@Override protected void onCreate(Bundle savedInstanceState) { Log.d(MyTracksConstants.TAG, "MyTracks.onCreate"); super.onCreate(savedInstanceState); instance = this; providerUtils = MyTracksProviderUtils.Factory.get(this);
とりあえず instance と providerUtils の定義から。まず instance の定義が以下。
/** * Singleton instance */ private static MyTracks instance = null;
微妙なコメントが付いてますな。何故に singleton にしているのかは現時点では謎。onCreate() のいっちゃんてっぺんで this を代入しとります。
次、providerUtils ですが、定義が以下。
/** * Utilities to deal with the database. */ private MyTracksProviderUtils providerUtils;
ええと MyTracksProviderUtils は MyTracksProviderUtils 型との事なんですが、実体の定義は com.google.android.apps.mytracks.content.MyTracksProviderUtils な模様。FactoryMethod 使っているのかな。定義を除いたら interface になってる模様。
ええと、MyTracksProviderUtils の中で定義されてる Factory が以下。
/** * A factory which can produce instances of {@link MyTracksProviderUtils}, * and can be overridden in tests (a.k.a. poor man's guice). */ public static class Factory { private static Factory instance = new Factory(); /** * Creates and returns an instance of {@link MyTracksProviderUtils} which * uses the given context to access its data. */ public static MyTracksProviderUtils get(Context context) { return instance.newForContext(context); } /** * Returns the global instance of this factory. */ public static Factory getInstance() { return instance; } /** * Overrides the global instance for this factory, to be used for testing. * If used, don't forget to set it back to the original value after the * test is run. */ public static void overrideInstance(Factory factory) { instance = factory; } /** * Creates an instance of {@link MyTracksProviderUtils}. */ protected MyTracksProviderUtils newForContext(Context context) { return new MyTracksProviderUtilsImpl(context); } }
get() は何故か一番下で定義されてる protected なインスタンスメソドである newForContext の戻りを戻してます。その中では MyTracksProviderUtilsImple のオブジェクトを生成して戻しているのか。
何故にこんな面倒な事をしているのかは不明ですが (FactoryMethod な事は分かりますが)、クラス定義の先頭にあるコメントがポイントなのかなぁ。
次
このあたり。
// The volume we want to control is the Text-To-Speech volume setVolumeControlStream(TextToSpeech.Engine.DEFAULT_STREAM); // We don't need a window title bar: requestWindowFeature(Window.FEATURE_NO_TITLE);
ええと setVolumeControlStream() はボリュームボタンで調整されるデバイスを指定、という事で良いのかな。このケイスではコメントにあるソレを操作対象にしている模様。
次の requestWindowFeature() についてはタイトルバーを非表示にする手続きな模様。
あ、コメントにもその旨記載がありますな。。
次
ぱっと見微妙。
final Resources res = getResources(); final TabHost tabHost = getTabHost(); tabHost.addTab(tabHost.newTabSpec("tab1") .setIndicator("Map", res.getDrawable( android.R.drawable.ic_menu_mapmode)) .setContent(new Intent(this, MyTracksMap.class))); tabHost.addTab(tabHost.newTabSpec("tab2") .setIndicator("Stats", res.getDrawable(R.drawable.menu_stats)) .setContent(new Intent(this, StatsActivity.class))); tabHost.addTab(tabHost.newTabSpec("tab3") .setIndicator("Chart", res.getDrawable(R.drawable.menu_elevation)) .setContent(new Intent(this, ChartActivity.class)));
これ、ざっくりベースで言うとメインなウィンドウにある 3 つのタブの設定してる風。具体的に何をしているのか、という事をざくっと以下に。
- Android.content.Context#getResources() 呼び出し
- Activity は Context のサブクラスなのか
- ドキュメントには Return a Resources instance for your application's package. との記述あり。アプリケーションの、なのか
- TabHost のオブジェクト取得
- Container Widget らしい (TabView が管理するタブをナニ
- getTabHost は TabView のメソド
- タブの追加については Hello, TabWidget にある方法に沿ってる模様
- setIndicator() な部分が若干異なる
- これ、タブの切り替えがちょっと違うことと関係してるのかなぁ
- ウィンドウをタップしたらタブ切り替えのソレが出てくるんだよねぇ
ちょっと
中断。別件を進めます。