Tutorial: A Notepad Application をやってみる

途中までの和訳はあるけど、日本語の情報が足りないなぁ。

準備

まず、エクササイズ用ファイルのつまったzipをダウンロード。

どこかに解凍して置いておきます。

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個追加されます。

わーい。