2010年12月21日

ダイアログに地獄を見た

ダイアログの使い方はとてつもなく面倒じゃないでしょうか?
比べるのは間違いでしょうけど、JavaScriptならwindows.alert()一発のところをAlertDialog.Builderで無名クラスを設定するなんて面倒にしか思えません。
ちょっとだけ警告メッセージを出すだけでもAlertDialog.Builder()を呼び出して、内部クラスでDialogInterface.OnClickListener()を設定して、なんて大変煩わしい。

自分としてはメニューボタンからさらに選択肢を出して、そこから実際の処理を行おうとしたのです。
後でメニューにサブメニューが設定できることに気づきましたが、気づかないまま二回AlertDialog.Builder()を呼び出す処理を書くはめになって、ソースがごちゃごちゃする原因となりました。
まあ自分の間違いなので、ぼやくのがおかしいかも知れませんが、それでもそもそも、

    protected Dialog onCreateDialog(int id){
     switch(id){
     case 条件:
     return new AlertDialog.Builder(クラス名.this)
    .setIcon(android.R.drawable.ic_menu_xxxx)
    .setTitle("タイトル")
    .setView(ViewまたはEditTextなど)
    .setPositiveButton("テキスト",new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
処理;
}
}).show();
}
}
    }

なんて長すぎると思いませんか?
処理がそれぞれ違うものだとこの長いステートメントをいくつも書くはめになり、これだけで自分のソースはかなり長くなりました。
しかも、独自のViewを設定できるということでやっていたら、findViewById()で見つけられないし、変数を呼ぶのにfinalで定義しておかないと見つからないというのも理解するのに時間のかかったポイントでした。

それに、なんといっても一番時間がかかったのは、(だいぶ時間がたったので、あれほど苦労したのにうまく説明できなくなってしまいましたが)DialogInterface.OnClickListener()の後でonClick()イベントを設定する箇所でした。
自分としてはここでOKボタンをクリックした直後にテキストボックスのデータを別メソッドに渡したかったのですが、Dialogクラスがリターンされてしまうので、showDialog()がある呼び出し側のメソッドに処理が戻ってしまってどんどん先へ進んでしまうというところが良く理解できず、理解できても「それじゃあどうする?」となったら全然対策が思いつかないのでした。
ここでかなり長期間の足踏みをして、ようやくEditTextはonCreateDialog()で使うのはやめて別メソッドでreturn new AlertDialog.Builder()にせず、インスタンスを作ってからステートメントを組むことで脳内ループをbreakしました。

   AlertDialog.Builder adb = new AlertDialog.Builder(this);
     adb.setIcon(android.R.drawable.ic_menu_edit).setTitle(message)
.....

しかし、こんな簡単なことも分からないのかと、自分の頭の悪さを不断に思い知らされるのがやりきれないですよ。(今でも良く分かってないですけど)
そんなわけで、「プログラミングは楽しい」などと自分としては全然思えないのでした。ふう……

posted by 白虹 at 23:48| Comment(0) | TrackBack(0) | Android開発

2010年12月16日

SQLiteのデータは外部メモリに置くことができるか

さてはて、メモ帳をつくろうとすると、チュートリアルにもある通りSQLiteデータベースを使うことになるみたいですけど、Androidは基本内部メモリの/data/data/〜パッケージ名/database/にデータが保存されてしまうみたいです。
データベースというからには結構大きいサイズのDBを作りたくなると思うのですが、容量の限られた内部メモリというのはちょっと悲しい。
そもそも、できないはずがない!と思って色々調べましたが、どうもできている人はいるような情報もないではないですが、やり方がまったくといっていい程見つからず十日以上悩みました。
それでもうググるのは諦めて、心細い英語でリファレンスを見ながら、ようやく悟ったのが、直接SQLiteDatabase.openOrCreateDatabaseを使えばいいということ。
ほとんどの参考書ではSQLiteOpenHelperを継承した内部クラスを使うような形で書かれていたのですが、以下のようにすればできることが分かりました。

String sdPath = Environment.getExternalStorageDirectory().getPath().toString();
File dbfile = new File(sdPath + "/" + "my_db_name.db" ); 
SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(dbfile, null);

これでうまくいったので満足して、しばらく先へ進んでいましたが、ふと気になってもう一度調べると、SQLiteOpenHelperを継承したクラスでは排他処理などをちゃんとやってくれるけれど、直接openOrCreateDatabaseを使うとそれがないというような情報が……。
うぅぅぅ!
排他処理を自分でできるほどの技量はないので、ここは涙を呑んで仕様後退。
でも、メモ帳系アプリとはいえ、そこそこ大規模なデータを想定していたため、これは痛い後退。
こうやってどんどん理想から遠ざかっていくとどうなることやら。

しかし、SDカードにアプリを移動できるFroyoとかはこの辺りどうなるんですかね。アプリ本体と一緒にSDに移るのでしょうか?
まだ色々な理由があってSDKをバージョンアップしていないこともあり、ドキュメントを読んでませんけど。
posted by 白虹 at 23:13| Comment(0) | TrackBack(0) | Android開発

2010年12月14日

ビルド・ターゲット

さてと、前口上もあらかた終わったし、そろそろぼやこうかな、と。

数多躓いた事項のうち、最初に躓いたのがインストールの段階。
他の人とちょっと違うところで悩んだと思われるのが、開発用のPCの特性。
故あってeclipseを使うにはちょっと(?)厳しいと思われるネットブックのeeePC S101などというものを使っているですよ。
SSD 16Gで、発熱が少ない(はずだったけど、そうでもない)ところが利点ですが、スペック的には明らかに推奨環境ではないはずです。
しかし、問題はCPUとかではなく、その解像度。
ネットブックとしては一般的な1024*600というレゾがここで伏兵として待ち構えていたのでした。

インストール自体は終わったけれど、新規プロジェクトを作成しようとすると、ビルド・ターゲットの欄が空白。
空白?
これでは完了ボタンが押せない。
そんな馬鹿なと思って何度も入れ直したり、環境を見直したりしたけれど、まったく改善せず。

これで少なくとも3日は悩みましたです。

結局、マシン付属のユーティリティで仮想1024*768にしてみたところ、ビルド・ターゲットの項目が忽然と姿を現したのでした。
しかし、何故中段にあるビルド・ターゲットが見えなかったのか?
変な仕様……とも思えてしまう。

いずれにしても、こんなんで3日も悩んでいたかと思うと、脱力するしかないのでした。
この先続く果てしなく曲がりくねった道を暗示するかのごとき出来事でした。
ちゃんちゃん。
タグ:Android開発
posted by 白虹 at 23:18| Comment(0) | TrackBack(0) | Android開発