途中までの和訳はあるけど、日本語の情報が足りないなぁ。
Notepad Exercise 1
キーワード
- ListActivities
- SQLite
- ArrayAdapter
- ListView
Step 1
eclipseを立ち上げて、新規->プロジェクト で Android/Android Project を選ぶ
ダイアログ内のラジオボタン「Create project from existing source」を選ぶ
「Browse」ボタンを押して上記で解凍したフォルダまでいって、Notepadv1 フォルダを選択。
すると、空白だった部分が埋まる。「終了」を選択。
これでノートパッドプロジェクトを開くことができた。
ところで、このまま進める前に先にできあがりをみたほうが、理解しやすいかも。
そのためには Notepadv1 ではなくて Notepadv1Solutionを選んでプロジェクトを開いた後、Step 13の通りに実行してみて。
Step 2
ここは NotesDbAdapter.java の解説。
こいつが SQLiteデータベースのデータの保存、参照、更新の詳細の面倒をみてくれる とのこと。
- open()
- DB開く
- close()
- DB閉じる
- createNote()
- ノートを新規生成。
- deleteNote()
- ノートを削除
- fetchAllNotes()
- 全ノートのクエリ(query)を返す
今回はこれらの中は深く追わない。
データベースを使ってノートのデータを管理するんだなー程度でOK。
Step 3
こんどは notepad_list.xml の解説。このファイルのお約束が説明されている。
画面レイアウトはxmlで書くんだそうで。GUIツールないと辛いよなぁ。
DroidDrawってのはあるんだけど、MyPCではうまく動作せず。javaの具合が悪いのかな?
Step 4
ノートの一覧を表示する画面を定義しよう。
notepad_list.xmlを編集しよう。
を
と、しましょう。
これでListViewとTextViewが定義されました。
このエクササイズではノートのリストを表示するだけなので、
ListViewだけでいいような気がするんだけど、なぜTextViewも追加してるのかは分からないなぁ。
試しに消してみても変化なし。後のエクササイズで使うのかな?
Step 5
Step4で作ったListViewで管理するノートそのものを定義しまっせ。
TextViewというのを使うよ。
TextViewのリストをListViewで管理するってイメージ。
res/layout に notes_row.xml というファイルを追加。
中身はこんな感じにします。
ところで、こうやってlayoutのxmlをいじると、勝手にR.javaというのが更新されていく。
実はこのxmlは自動的にjavaコードに変換されているのだ。
実機でこのxmlを読み込んで表示するワケじゃないだ。
Step 6
画面周りの定義をXMLで済ませたので、
今度は実際のコードを書いていこう。
こんどは Notepadv1.java を開く。すでにいくつか関数が定義されている。
- onCreate()
- このクラスが生成されるときに呼ばれる関数。
- このクラスはActivityっていうクラスを継承して作られてます。
- ActivityってのはAndroidの4大基本クラスの一つ。
- onCreateOptionsMenu()
- メニューボタン押したときなどに呼ばれる関数
- Activityにはメニューに関する機能が標準で実装されているみたい
- onOptionsItemSelected()
- メニューでなにか選択したとき呼ばれる関数
Step 7
継承しているクラスをActivityからListActivityに書き換えます。
つまりNotepadv1.javaはこんな感じになります。
public class Notepadv1 extends ListActivity { private int mNoteNumber = 1; /** Called when the activity is first created. */ @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); } @Override public boolean onCreateOptionsMenu(Menu menu) { // TODO Auto-generated method stub return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(Item item) { // TODO Auto-generated method stub return super.onOptionsItemSelected(item); } }
書き換えたら、eclipse上で Ctrl + Alt + O を押そう。
すると importが必要なものに自動で書き換えられます。便利だなぁ。
ところでなぜ ListActivity にするのかは不明。
ノートをリストで扱うには ListActivity のAPIが必要なのかな?
Step 8
起動して最初に呼ばれるOnCreate()関数で、初期化処理をしよう。
追記してこんな感じに。
public void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.notepad_list); mDbHelper = new NotesDbAdapter(this); mDbHelper.open(); fillData(); }
mDbHelperの定義も追加する。これはOnCreate()の外に書きますよ
private NotesDbAdapter mDbHelper;
これで、
- setContentView(R.layout.notepad_list)で画面レイアウトを設定し
- NotesDbAdapter をnewすることで DBアクセスの準備
ができました。
この段階では fillData() にびっくりマークがついてますが、あとで解決します。
Step 9
メニューボタンを押されたときの処理をonCreateOptionsMenu()に書こう
まず出てくるメニューアイテムの文字である"Add Item"という文字列を生成します。
直接コードに書いてもできるけど、ちゃんとリソースファイルとして別にしておくと、多言語展開で便利なのだ。
res/values の string.xmlに追記してこんな感じにする
Notepad v1 No Notes Yet Add Item
んでjavaに戻って、onCreateOptionsMenu()の外に
メニューの先頭にこのメニューアイテムを追加するよーというIDを定義を追記。
public static final int INSERT_ID = Menu.FIRST;
んで onCreateOptionsMenu() を以下のように変更。
メニューアイテムを追加するわけですね。
@Override public boolean onCreateOptionsMenu(Menu menu) { boolean result = super.onCreateOptionsMenu(menu); menu.add(0, INSERT_ID, R.string.menu_insert); return result; }
Step 10
今度はonOptionsItemSelected() 関数です。
”Add Note”というメニューが押されたときの動作を記述します。
CreateNote()をコールして、ノートを追加するわけですね。
@Override public boolean onOptionsItemSelected(Item item) { switch (item.getId()) { case INSERT_ID: createNote(); return true; } return super.onOptionsItemSelected(item); }
この段階では createNote()にびっくりマークがついてますが気にしないでください。
Step 11
createNote() を作ります。
Notepadv1に追記します。
private void createNote() { String noteName = "Note " + mNoteNumber++; mDbHelper.createNote(noteName, ""); fillData(); }
mNoteNumberがノートの数ですね。
mDbHelperを使ってDBにノートを作るわけです。
fillData(); はまだびっくりマーク付きです。
Step 12
やっとこさ fillData() 関数を追加します。
この関数は SimpleCursorAdapter を使います。
なにやら Cursor ってのがキーワードみたいだけど、なんのことだろう。DB用語かな?
SimpleCursorAdapterをつかってデータベース内のノートを取り出して、画面上のリストを更新しているんだろうけれども。
private void fillData() { // Get all of the notes from the database and create the item list Cursor c = mDbHelper.fetchAllNotes(); startManagingCursor(c); String from = new String { NotesDbAdapter.KEY_TITLE }; int to = new int { R.id.text1 }; // Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this, R.layout.notes_row, c, from, to); setListAdapter(notes); }
書いたら、Ctrl + Alt + O をお忘れ無く。
これで、びっくりマークが全部無くなるはず。
R.id.text1 は notes_row.xml に定義したTextView。
NotesDbAdapter.KEY_TITLE は NotesDbAdapter.java 内に定義してある"title"っていう文字列。
Step 13
Run!
Notepadv1プロジェクトを右クリックして、メニューの中から 実行->Android Application を選択
エミュレータが立ち上がるには時間がかかりますが、一度立ち上げたら終了させなくていいものなので、ゆっくり待ちましょう。
立ち上がったら、menuを押してみましょう。すると Add Item がでてきて、押すと、ノートが1個追加されます。
わーい。