Notepad Tutorialで学ぶAndroidアプリのSQLite講座2

SQLite講座1の続き。

がんばって今回の講座で、Notepad Exercise 1を終わらせましょう!

[ad#336×280]

Step3: レイアウトを眺めよう

res/layoutフォルダに入っているnotepad_list.xml

// レイアウトファイルは <?xml version="1.0" encoding="utf-8"?>
// を最初に付けるべし!
<?xml version="1.0" encoding="utf-8"?>
// 次はたいていレイアウトの定義を加える、ここではLinearLayoutを使う
// LinearLayoutは縦または横に部品を並べていくレイアウトだよ
// xmlns:android=...は名前空間。
// 何かの決まり事みたいな、簡単に言うと呪文です
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    // wrap_contentは最大化、幅を最大にして高さも最大にするレイアウトを作るよ
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

</LinearLayout>

Step4: レイアウトの中に部品を入れよう

LinearLayoutの中にListViewとTextViewを入れよう。
ListViewはノートのリストを表示して、TextViewはリストが空のときに表示されるよ。

notepad_list.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <ListView android:id="@android:id/list"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    <TextView android:id="@android:id/empty"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/no_notes"/>
</LinearLayout>

android:id=”@android:id…
この部分、プログラムからレイアウトの部品を呼び出すときに必要になるidだよ。
これがないと、ListViewやTextViewという部品をプログラムから呼び出して操作できないよ。

android:text=”@string/no_notes
これはres/values/strings.xmlに記載しているnameがno_notesの値を取ってくるよ。

Listが空のとき、ListAdapterが自動的にempty idの部品を表示するよ。
empty以外のidの部品が良い場合は、ListViewにsetEmptyView(View)を指定してあげると、その部品が表示されるとか。

Step5: リストの列を作ろう

レイアウトにListViewを作ったけど、これだけじゃ足りないよ。
リストの列を表示するレイアウトファイルを作ろう!

res/layoutフォルダの中にnotes_row.xmlを新しく作ろう。
notes_row.xmlにはTextViewを配置しよう。

notes_row.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView android:id="@+id/text1"
     xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>     

android:id=”@+id/text1
この+idの部分、text1というリソースがなければ作れっていう意味、
リソースを作ると、プログラムコードからアクセスできるようになるのです。

gen/R.javaという場所にリソース一覧があります。
notes_rowとtext1が自動的に作られてますよ。

Step6とStep 7: Notepadv1.javaにいろいろ組み込む(1)

Notepadv1.javaを開いて、Notepadv1クラスを変更しよう!
リストアダプターにして、ノートの一覧を表示して、新しいノートを追加する機能を付けるぞ。

ちゃっちゃと変更しよう。

Activityを継承していたけど、ListActivityを継承しよう。
ListActivityは、とにかくリストの操作に便利なんですって。

ActivityをListActivityに変更して、
import android.app.Activityを削除して、
import android.app.ListActivityを追加するっと。

mNoteNumberはノートのタイトルの番号を振るのに必要だからスルー。

変更後のNotepadv1.java

package com.android.demo.notepad1;

import android.app.ListActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;

public class Notepadv1 extends ListActivity {
    private int mNoteNumber = 1;

    // onCreateはactivityが呼ばれたときに最初に呼ばれるよ
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    // onCreateOptionsMenuはメニューを追加するのに使うよ
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // TODO Auto-generated method stub
        return super.onCreateOptionsMenu(menu);
    }

    // onOptionsItemSelectedはメニューを選択したときに呼ばれるよ
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // TODO Auto-generated method stub
        return super.onOptionsItemSelected(item);
    }
}

Step 8: Notepadv1.javaにいろいろ組み込む(2)

onCreateに色々追加するよ。
layoutを設定して、ノートデータにアクセするNotesDbAdapterを作って、リストを表示するだ。

    @Override
    public void onCreate(Bundle savedInstanceState) {
        // onCreateのデフォルト設定を親玉に引き渡す、決まり事です!
        super.onCreate(savedInstanceState);

        // レイアウトを設定する
        setContentView(R.layout.notepad_list);

        // NotesDbAdapterを作ってdbのノートデータにアクセスできるようにする
        // this(自分自身)をDBHelperのコンストラクタに渡そう
        mDbHelper = new NotesDbAdapter(this);

        // dbを開こう
        mDbHelper.open();

        // fillData(まだ作ってないメソッドだよ)でリストの一覧を手に入れて
        // ListViewに表示するよ
        fillData();
    }

private int mNoteNumber = 1;
このmNoteNumberの下にmDbHelperを定義しておこう!

private NotesDbAdapter mDbHelper;

Step 9: Notepadv1.javaにいろいろ組み込む(3)

onCreateOptionsMenuがらみで色々追加するよ。
“Add Item”ボタンをメニューに追加するプログラムを作ろう。

まずはstrings.xmlに”Add Item”を追加しよう。

<string name="menu_insert">Add Item</string>

Notepadv1に戻って、Notepadv1クラスの初めに、メニューの場所を指定する変数を書こう。

public final static int INSERT_ID = Menu.FIRST;

本命のonCreateOptionsMenuに、下記のようにAdd Itemを追加しよう。

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // 一旦booleanで受けて、
        // メニューを追加した後にbooleanを渡して上げる
        boolean result = super.onCreateOptionsMenu(menu);

        // 最初の引数はグループID(0はなし)、次はユニークID
        // 次は並び順(0はなんでもいい)、最後に表示する文字
        menu.add(0, INSERT_ID, 0, R.string.menu_insert);
        return result;
    }

Step 10: Notepadv1.javaにいろいろ組み込む(4)

onOptionsItemSelectedがちゃんと動くように追加しよう。

メニューの”Add Note”を押したときにonOptionsItemSelectedが呼ばれるので、
ちゃんと動くように下記のように追加しよう。

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // returnは最後に持っていって、
        // どのメニューアイテムが呼ばれたかまず確認しよう。
        // 押されたのがINSERT_IDのアイテムだったら、
        // 新しいノートを作ってtrueをリターンして終了だ
        switch (item.getItemId()) {
        case INSERT_ID:
             createNote(); // まだ作ってないメソッドだよ
             return true;
        }
        return super.onOptionsItemSelected(item);
    }

Step 11: まだ作ってないメソッドを作ろう(1)

まず最初は、Add Noteを押したときに呼ばれるcreateNoteを作ろう、
といっても、まだタイトルだけしかないノートを作るだけだけどね。

onOptionsItemSelectedを書き終わった下に、下記のコードを追加しよう。

    private void createNote() {
        // ノートの名前
        String noteName = "Note " + mNoteNumber++;

        // ノートを作る、""の部分はノートの本文、今は空っぽ
        mDbHelper.createNote(noteName, "");

        // ノートのリストを表示する(まだ作っていないメソッド)
        fillData();
    }

Step 12: まだ作ってないメソッドを作ろう(2)

最後にノートの一覧を表示するfillDataを作ろう。

createNoteの下に、下記のコードを追加しよう。

     private void fillData() {
          // ノートのリスト一覧を示すcursorをゲットする
          Cursor c = mDbHelper.fetchAllNotes();

          // startManagingCursorにcursorを渡すと
          // cursorの寿命をうまくやってくれるらしい
          startManagingCursor(c);

          // ビューに渡すコラム名を作って、
          // どのビューにそのコラム名を結びつけるかを指定するっと
          // ...[]{ ... } 配列に初期値をいれて各配列を作ると。
          String[] from = new String[] { NotesDbAdapter.KEY_TITLE }; 
          int[] to = new int[] { R.id.text1 };

          // SimpleCursorAdapterはcursorをもらい、
          // それをレイアウトの要素と結びつける働きをするよ
          // ちなみにthisはcontextとして渡してます。何かと必要なんだって。
          SimpleCursorAdapter notes = new SimpleCursorAdapter(this, R.layout.notes_row, c, from, to);

          // 作ったアダプター(notes)をリストに設定して
          // ListViewにノートの一覧を表示するなり
          setListAdapter(notes);
     }

ちなみに、importに下記を足しておきましょう。
import android.database.Cursor;
import android.widget.SimpleCursorAdapter;

Step 13: さっそく実行しよう

実行してMenuボタンを押した結果

おー成功です!

Add Itemを押すと、Note 1、Note 2…とノートがリストに追加されていきました!

とうことで、今回のSQLite講座2はここまで。
SQLite講座は、まだまだ続きます!

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください