2012年7月30日月曜日

BloggerにSyntax Highlighterを導入してソースコードを貼り付けたくて四苦八苦

前のエントリでSyntax Highlighterのウィジェットがうまく導入できなかったと書いたが、現在使えないようになっているというより、Chrome(自分はメインで使用)やFirefoxでは導入時に色々トラブルトラブルがつきものらしい。

試しにGoogleで「blogger syntax highlighter "Add to Blogger"」で検索してみると、出るわ出るわ。
皆さん苦労してらっしゃる様子。

それでも、こちらあたりのページを見てみると、一旦blogger.htmlをダウンロードして、それをブラウザで開けばうまくいくらしい。
http://blog2.k05.biz/2011/07/bloggersyntaxhighlighter.html
http://blog.prunus.jp/2010/06/blogger-syntax-highlighter.html


Bloggerにソースコード貼り付け

Bloggerにはもともとソースコードをちょちょいと見栄え良く貼り付けるのはあまり向いていないらしく、ソースコードを貼り付ける時に、もうちょっと見やすく出来ないかと思って調べてみたら、Syntax Highlighterというものがあった。

http://www.kuribo.info/2008/06/blogger-syntax-highlighter.html
http://yan-note.blogspot.jp/2008/12/yan-note-bloggersyntaxhighliter.html


2012年7月29日日曜日

onCreateOptionsMenuとonPrepareOptionsMenuについてメモ

メニューボタンが押された時にオプションメニューを表示するには↓のような感じでonCreateOptionsMenuメソッドをオーバーライドしてメニューを読みこめばいいわけなんだが、


        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
                MenuInflater mi = getMenuInflater();
                mi.inflate(R.menu.menu, menu);


                // TODO 自動生成されたメソッド・スタブ
                return super.onCreateOptionsMenu(menu);
        }


ゲームなんかの場合、メニューボタンが押されたらゲームをポーズしたい、ということがある。

それならばと、onCreateOptionsMenuの中にゲームをポーズさせる処理を入れてみても一度しかポーズにならない。調べてみると、onCreateOptionsMenuはそもそも初めてメニューボタンを押した時の一度しか呼び出されないものなのだそうだ。

ならばどうするか、ということだが、onPrepareOptionsMenuというメソッドがあり、こちらはメニューボタンが押されるたびに毎回呼び出される。なので、こいつをオーバーライドしてゲームをポーズさせる処理を入れるとうまくいった。




        @Override
        public boolean onPrepareOptionsMenu(Menu menu) {

                //メニューボタンが押されたらゲームをポーズ状態にする
                mGameView.setMode(GameView.PAUSE);

                // TODO 自動生成されたメソッド・スタブ
                return super.onPrepareOptionsMenu(menu);
        }


今回参考にさせていただいたページはこちら。

2012年7月23日月曜日

Androidアプリ、有料版と無料版のソース共有化(だいたいまとめ)

以前からのエントリ(これとかこれとか)でも検証していた、有料版のアプリと無料版のアプリでソースを共有する手法について、手順などをあらかたまとめてみた。

使用しているEclipseはバージョン3.7.2。

まず前提として、有料版のソースがあるものとする(仮の名前としてプロジェクト名をMyApp、パッケージ名をcom.blogspot.uc1991.myappとする)。
そして、これを参照して無料版を作成するものとする(こちらはプロジェクト名をMyAppFree、パッケージ名をcom.blogspot.uc1991.myappfreeとする)。

利便性のため、有料版には無料版の処理やリソースも入れておく(プログラム上で処理を切り分けるにはgetPackageName()でパッケージ名を判定することで行う)。


2012年7月17日火曜日

Androidアプリ、有料版と無料版のソース共有化(番外編(いわゆるひとつのやっちまったよおい…(追記アリ))

前回前々回のエントリでソースの共有化について試行錯誤していたのだけど、無料版側からの有料版のソース(srcフォルダ以下)の参照の仕方がおかしいっぽいことに気付いた。

で、一度src以下の参照を解除しようとしたのだけれど…ここで問題が起きた。

パッケージエクスプローラで無料版のsrc以下のパッケージを右クリックし、削除を選択。
確認ダイアログが出るので、一度プレビューのボタンを押してみると、「リンクが解除されるが元のファイルは残る」という旨のメッセージ。うん。
改めて確認ダイアログでOKのボタンをクリック。え…?

なんと、無料版側のsrc以下はもとより、オリジナルの有料版側のsrc以下のソースファイルまで綺麗に削除されてしまった…。

ええ~!?

しかも悪いことに、まだソースのバックアップを取っていなかった…。

もう頭の中真っ白。顔には冷や汗がダラダラ。

急遽、ファイナルデータ試供版やPC INSPECTORなどの復元ツールを導入してソースのサルベージを試みるも、雀の涙ほどしかサルベージできず。


結局ソースをまた書き直さくてはならなくなった。
やってしまってから改めて思い知らされる、バックアップの重要性…なのだった…。OTL



2012年7月15日日曜日

Androidアプリ、有料版と無料版のソース共有化(続き)

前回のエントリで、「Rを変数に解決できません」のエラーが出てビルドが通らない件について、更に調べてみた経過。


Androidの無料アプリ・有料アプリを切り替えてビルドする方法 - eaglesakuraのメモ帳
Android プログラミング x どーもどーも - AndroidプログラミングTips


この辺りの記事を参考に、genフォルダ以下のRクラス(R.java)を元のフォルダからコピーするバッチファイルを入れてみる。
(バッチファイルを入れるとかっていうのはあまりスマートな方法ではないように思うけど)


また、初回のビルドではEclipseのメニューから「プロジェクト」→「クリーン」を実行しておくのを忘れないようにする。
(Eclipse側があずかり知らぬところでファイルの移動が発生したりすると、×マークがついたりエラーが出ることがある。そんな時にも「プロジェクト」→「クリーン」は有効。その他、プロジェクト右クリックからリフレッシュ、Eclipseのクリーン起動など。)

2012年7月14日土曜日

Androidアプリ、有料版と無料版のソース共有化

有料版のアプリと無料版のアプリを作成するとして、ソースは有料版の方にだけ置いて、なるべく一元化するようにしたい。

ということでEclipse 3.7.2の環境で何とかできないか試している。

この辺の記事
猫と一緒に一休み eclipse で Android の有料版、無料版のパッケージを同じソースで管理
Androidの無料アプリ・有料アプリを切り替えてビルドする方法 - eaglesakuraのメモ帳
を参考にしつつ試しているのだけど。


  1. 有料版(仮にTest)が既にあって、無料版のプロジェクトをTestFreeとして作成する。
  2. 必要なライブラリがあればlibsに追加し、プロジェクトプロパティにも追加。
  3. TestFreeのresフォルダを削除し、Testのresを参照するようにする。
  4. TestFreeのsrcフォルダにTestのsrcフォルダの参照を追加する。
  5. TestFreeのプロジェクトプロパティにTestのビルドを追加する。
  6. TestからTestFreeにAndroidManifest.xmlをコピーしてパッケージ名などを修正する。


手順としてはおおよそこんなところだと思うんだけど、TestFreeのアクティビティを作成せずにTestのアクティビティをそのままAndroidManifest.xmlに指定すると、「Rを変数に解決できません」のエラーが出てビルドが通らない。

それならということで、Testのアクティビティを継承したTestFreeActivityを作成し、AndroidManifest.xmlに指定すると、プロジェクトのエラーが無くなってビルドが通るところまでは行く。しかし実行するとアクティビティの初期化に失敗して例外になってしまう。

うーん、もうちょっと調べてみないと良くわからないな・・・。

2012年6月29日金曜日

onActivityResultとsetResultについてメモ

Activityから設定画面などの別のIntentを呼び出した際の流れについて調べてみた。

呼び出したIntent(=Intent B)から結果を受け取るとき、呼び出したActivity(=Activity A)のonActivityResultをハンドリングして受け取るのだけど、Intent BでsetResultで結果をセットするのはどこが適切なのか、というのが気になって。

初め、Intent BのonStopで実行してみたのだけど、デバッガで処理を追ってみるとIntent BのonStopよりもActivity AのonActivityResultの方が先に呼び出されてることがわかった。

もっと詳しく調べてみると、Intent BでBACKボタンをタップした時、

Intent BのonKeyDownメソッド

Intent BのonBackPressedメソッド

Intent BのonWindowFocusChangedメソッド

Intent BのonPauseメソッド

Activity AのonActivityResultメソッド

Intent BのonStopメソッド

と、こんな順に呼び出されてる。なのでIntent BのonStop内でsetResultで結果をセットしても、Activity AのActivity AのonActivityResultメソッドではその結果を受け取る事が出来ない。

onWindowFocusChangedやonPauseメソッドは別アプリに切り替わった時などでも呼ばれるので却下。そこで、onBackPressedメソッドで


  @Override
  public void onBackPressed() {


      Intent intent = new Intent();
      intent.putExtra(KEY, VALUE);


      setResult(RESULT_OK, intent);
      finish();


      // TODO 自動生成されたメソッド・スタブ
      //super.onBackPressed();
  }


というようにすることでActivity AのonActivityResultメソッドで結果を受け取る事ができた。

2012年6月19日火曜日

Androidアプリの勉強中

こんな開設したばかりブログ、誰も見ていないと思うけど…。 昨年某会社からリストラされてから、就職活動を続ける傍ら、Androidアプリの作り方について勉強してみようと思ったわけです。 Androidアプリでは他のアプリとかぶらないpackage名を使用することになっていますが、Android Developersで登録するよりもブロクのアドレス(ドメイン名)を使ったほうがはるかに楽そうだったのでブロクを登録してみようと思ったわけです。 今は簡単なアプリの一本があらかた出来上がってきて、微調整する傍らGoogle Playに登録する方法について調べているところです。

2012年6月18日月曜日

登録してみた

一意なドメイン名が使えるようになるということで、登録だけしてみた。