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講座は、まだまだ続きます!
コメントを残す