途中までの和訳はあるけど、日本語の情報が足りないなぁ。
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個追加されます。
わーい。