2010年12月12日日曜日

RoboGuiceのInject関連のソース読んできた。

ぶっちゃけぼくはGoogle GuiceをつかったことがないのでRoboGuiceのソース読んでもこんなもんなのかなーという感じにしか読めなかったわけなのだがそれなりに面白かった。
(まだ全部はよんでいない)

RoboGuiceを使うこと自体にはGuiceの知識はそこまで必要ない(Springとか触ったことあるなら)
だけどRoboGuice自体Guice使って書かれてるので中身知りたくなった時点でGuiceの知識が必要になるからこんどGuice勉強してみる。

で、Injectionの話にもどる訳なんだけどまずRoboGuice固有のInjection用のannotationを並べてみる

@InjectExtra
@InjectPreference
@InjectResource
@InjectView

この4つ

一応書いておくと
@Retension(RUNTIME) ※1
@Targer(FIELD,PARAMETER,METHOD) ※2 です。(全部)

(※1 Runtimeはリフレクションつかってアクセスできるし、クラスファイルにもアノテーションの情報が残りますよって意味です。@Overrideなんかは@Retension=SOURCEなのでリフレクションつかってアノテーションの情報を取ってくることはできないし、クラスファイルにアノテーションの情報は残りません。コンパイル時に破棄されます)

(※2 フィールド変数、メソッドの引数、メソッドにこのアノテーションが付けられますよの意味)

さて、各アノテーションの詳細を書いてきます

1.@InjectExtra

@InjectExtraはString valueとBoolean optionalという二つの値を持っています。
このアノテーションはIntentによって呼び出されたActivityで呼び出される前にputExtra()で設定された値を取り出すとき(いつもならgetExtra()するとき)に使います。

下は一例(

@InjectExtra(value = "id")
Integer id;

(前回の記事にもちょろっと書いてありますけど、@InjectExtraを使う場所は基本的にはフィールド変数に対してです、と一応 (あとの3つも同様))

これでgetExtra("id")とか書いたときとおんなじようになりました。

で、うまくいったやったーとおもって終わりかと思えばoptionalってなんだったの?ということに
で調べてみると、どうやらデフォルト値を設定するかどうかを聞いてるようです(なにもしないとoptionalはfalseになっておりデフォルト値なんてないよってことになってるみたい)

optionalを含めて使ってみた

@InjectExtra(value = "id", optional = true)
Integer id = 0;


こうするともし"id"というkeyで取得できる値がなかったら0にしといてということになる。

ついでにvalueやoptionalとかの指定は省略して下のようにも書ける

@InjectExtra("id")
Integer id = 0;


で、この@InjectExtraの仕様で気をつけることがあって持ってくる値がnullであることを許容してくれません。
もしnullでもちゃんと持ってきてほしいとおもったら@Nullableをつけましょう。

@InjectExtra("id")
@Nullable
Integer id = 0;

これで@InjectExtraはおしまいです。
ちなみにたしか変数名と@InjectExtraのvalueは同じでなければならなかったはずなのでご注意を(確証はない。でもたぶんそうだったはず)

あとの三つですがoptionalがない(デフォルト値設定がない)というのとvalueの型が少し違うという以外@InjectExtraと特に違うところはありません
(@InjectPreferenceはRoboPreferenceActivityを継承したクラス内のみ使用可能というぐらいです)

一応使用例としてテキトーに書いたソースを下に貼っつけておきます。


class RoboWay extends RoboActivity { 
    @InjectView(R.id.name) TextView name; 
    @InjectView(R.id.thumbnail) ImageView thumbnail; 
    @InjectResource(R.drawable.icon) Drawable icon; 
    @InjectResource(R.string.app_name) String myName; 
    @InjectExtra("id") Integer id; 
    @InjectExtra("from") String from;

    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        name.setText( "Hello, " + myName ); 
    } 
}

2010年12月11日土曜日

RoboGuiceとかちょっと見てみた

いや、本当にまだ見てみただけ
今のところやったこと sampleのAstroboyの全ソース読んだぐらいです。

RoboGuiceのサイト
http://code.google.com/p/roboguice/

RoboGuiceってなーにって人用にちょっとだけ解説ー

一言で言うとandroid用のDIコンテナーです。
DIってなーにっていう方はJavaフレームワーク開発入門とか読んでみましょう。
まだ触るにははやいってことです(いや、僕も今読んでる途中ですけど)

どんなことができるか。
例えばいつもはこんな感じに書くコードを


// こんな感じ
Button myButton = (Button) findViewById(R.id.my_button);
次のような感じに書けます。

@InjectResource(R.id.my_button)
Button myButton;

アノテーション書けばかってにキャストして入れてくれるよってことですな。
でもまあ、これだけじゃ別にたいしたことないじゃんってやつですが、

LocationManager mLocationManager = (LocationManager) getSystemService(LOCATION_SERVICE);

とかいうのも
@Inject
LocationManager mLocationManager;


とかやればかってに初期化しといてくれます。
ちょっと便利

ほかにもたとえばIntentで自分がつくったActivityが起動されたときにsetExtra()でくっついてきた値を取るときにこんなふうに書けば取っといてくれます。


@InjectExtra("nameExtra")
protected String nameExtra;
意味はこれ
nameExtra=getIntent().getStringExtra("nameExtra")

あとよくありがちな@Nullableとかもあった。

androidによくあったResourceやIntent連携で起きるデータのやり取りとかのどうしてこうなったwという仕様(キャストが必要とか)をGuiceがやさしくしてくれる感じ

追記:上でやってたことはすべてField変数にたいしてです。

とりあえず見てみただけだからこのへんにしとく
詳しくは上のページにあるsampleのところにあるAstroboyを見るといいと思うのです。
astroboyは一時間もあれば読めると思うですよ(それぐらいRoboGuice君がやさしくしてくれた)

次回のRoboGuiceに関する記事の予定
RoboGuice使ってUnitTestやってみる
(Twitterで@vvakameさんがやれとかいってたので)
もしくは普通に導入手順とか書くかも(あとあと勉強会するときにもう一度調べるのめんどくさいから)

すこしBlogを一新したのです

いや、いろいろひどいことになってたのである程度戻しました。
そろそろBlog再開しますです

2010年5月6日木曜日

現在いろいろ進行中

Blogの更新が止まっていますが、現在いろいろなプロジェクトを進行中のためです。
一番更新を遅れさせている理由は
AnscaのCoronaのバージョンが変わる度に微妙に変わる仕様に戸惑っているから

うまくクロスプラットフォームのためのソースを書きたいけど大本が微妙に変わっているという

今までのソースでも微妙に動作が変わるソースがあるのでいろいろ調べています。

もうちょっと続きはお待ちください(_ _)

2010年3月31日水曜日

Corona基礎編2 画像貼付けと簡単なtransition

前回の基礎編1のプログラムに画像の貼付けと簡単なtransitionをつけてみました。
とりあえず今回のソースです。

--
-- アプリに画像貼付け
local backImage = display.newImage("sample.png")

-- x座標とy座標の設定
local x,y = display.stageWidth/2,0
--RGBの色
local r,g,b = 255,255,255
--表示する文字列の設定
local hello = display.newText("Hello,Corona",x,y,nil,24)
--文字列の色指定
hello:setTextColor(r,g,b)

transition.to(hello,{y=display.stageHeight/2,time=1000})
--

今回新しく出てきたのは3種類ですね。
1.display.newImage(画像ファイル名)
指定された画像ファイルを読み込んでアプリに画像を貼付けます。
ちなみにもっと引数を増やして、
display.newImage(ファイルネーム[、ベースディレクトリ名][、x座標、y座標])という風にもできます。
[]でくくられている引数は無くてもデフォルト値で補われます。
ディレクトリはアプリのルートディレクトリで、
x,yはともに0で補われます。

2.display.stageWidthとdisplay.stageHeight
これは端末の横の長さ、縦の長さを取得できます。
これらを利用して機種依存を少なくすることができます。

3.transition.to(対象となるオブジェクト,{最終目標値})
transition.toはアニメーション用のメソッドです。
今回はhelloオブジェクトを対象とし、helloオブジェクトのyを画面の中央まで、
1000ミリ秒かけて動くという最終目標値を設定しています。

次回はボタンをこれにボタンを付けてみます。
それと画像ファイルでいいフリー素材が見つかったらそれを含めてzip形式でサンプルを公開します。
しばしお待ちを。

2010年3月29日月曜日

Corona基礎編1 Hello,Corona!!

というわけで、すごく簡単なHello,WorldならぬHello,Coronaプログラムを書いてみました。

以下ソースコード
--
hello = display.newText( "Hello,Corona", 10, 80, nil , 24 )
hello:setTextColor( 255,255,255 )
--
これだけでスマートフォン上にHello,Coronaと表示されます。
以下ちょっとした関数説明。
display.newText(String,x,y,font name,size)
 String:表示したい文字列
 x,y:座標
 font name:使いたいフォントの名前を文字列で
 size:文字のサイズの数値

注:fontに関しては使う機種によって用意されているfontが違います。
Coronaのサンプルコードにfont確認用のプログラムが用意されていると書いてありますが、
見つからないので、見つけたらBlogに記事として載せておこうと思います。

この行では変数helloにnewTextの戻り値、テキスト情報を格納しています。

setTextColor( r,g,b )
r:赤色の濃さ
g:緑色の濃さ
b:青色の濃さ
この関数自体には説明はいらないかと。
helloのフィールドメソッド(Luaでどういう言葉を使っているかわからないのでJava風に)であるsetTextColorを呼び出して文字の色の指定をしています。標準は0,0,0で黒色です。 
 : はJavaでいうところの . です。フィールド呼び出しの演算子ですね。

この二つを行うことによって文字が表示されます。

とりあえず初めてのCorona自体の解説でした。
次回は画像貼付けの予定です。多分今日の夜にでもささっと書いて公開します。ではでは

2010年3月23日火曜日

Android版Coronaについての情報が公開されました

Anscaの対応の速さは恐ろしいですね。
前にSymbian版だすよーといっておいてiPad版だいたい終わったという報告もうけ、
さてさて、ここがきっとCoronaがシェアを握るための鍵となるであろうAndroid版Coronaの情報公開が行われました。
以下いろいろリンク
Ansca公式Blog:Corona, now with a lot more Android
動画:Corona SDK for Android & iPhone
公式Blogを読む限りではやはりSymbian版よりもAndroid版の方を先に出せという要望は結構あった様ですね。ある程度完成したので情報公開といったところでしょうか。
気になるのはAndroidSDKにあったIntent等の機能はいれるのかどうかですかね。
動画を見る限りではiPhone版と同等の機能をいれてしまった感がするので、
IntentによってAndroidの標準搭載のアプリ群とのデータのやりとりであったりはどうなってるのか気になります。
場合によってはデータを取りたければDBにアクセスしろということになるのか。
Luaでのマルチプラットフォーム自体はすごく魅力的で、
Javaの思想であった「Once write , run anywhere」は保ちつつ、アンドロイド用ライブラリ等があってもいいかなとすこし思いました。

何か自分なりにいまのままのCoronaでintentを実現するにはどうするか考えてみよう。
(あからさまにコルーチンとかの応用な気がしないでもない)

追記
LuaにてAndroidのライブラリーが動かせることをAndroid上のコンソールで確認しました。
ToastとかDialogが普通に表示できたのでもしかしたらAndroidのライブラリに関してはそのまま使えるかもしれません。

2010年3月22日月曜日

公式ドキュメント&参考になるリンク

リンク集を作る前に記事にしてまとめておきます。

公式ドキュメント
基本的な情報はこれらのドキュメントに掲載されています。
このBlogでも必要なときに取り出して、噛み砕いて翻訳してみます。
※学生レベルの翻訳であること=>僕は英語苦手
API Reference
Application Programming Guide
Device Build Guide
Getting Started Guide
Tools Guide

公式youtubeチャンネル
もちろん英語での動画しか載っていませんが、軽く前もってどういうふうに開発するのかなど知りたい場合や簡単なところから勉強したいという時の副教材としておすすめです。
もしかしたらいつかこれを使って放送するかもしれないです。
http://www.youtube.com/anscamobile

2010年3月21日日曜日

現状報告

長いこと更新が途絶えていましたが、今月末からこのブログを本格的に始動します。

一応更新に関する基本方針を立てました
1、CoronaSDKに関することなら何でも可
(つまりiPhone関係だろうがLua関係だろうが出てきます)
2、できれば一週間に一回は更新すること
(早めにまとめて日本にできるだけ情報を流通させたいという理由より)
3、日本のCorona普及に向けて努力すること
(とりあえずまずは個人で一アプリつくってみます)

今のところこの3点に基づきしばらく更新する予定です。

基本的に内容に関する質問や疑問等ありましたら、Blogに何らかの形でコメントをくださるか
日本コロナの会までよろしくお願いします。 
keiなのでした。

自分のTwitterID:@muxukeikei

日本コロナの会
http://groups.google.co.jp/group/coronaja
http://twitter.com/JapanCoronaGrp

2010年1月1日金曜日

あけましておめでとうございます。

今年からがんばるよっ