==[[Android Notepad チュートリアル]]==
[[Android]] | [[Java]] | [[Eclipse]] |
==(1) 簡単なノートリストの作成==
*新しいノートを追加する(まだ編集はできない)
*ListActivity ListActi[[vi]]ty を使ってみる*SQLiteを使ってみる[[SQL]]iteを使ってみる
===プロジェクトの作成===
===NotesDbAdapter===
====用途====
*NotesDbAdapterはSQLiteへのデータアクセスをカプセル化する。NotesDbAdapterは[[SQL]]iteへのデータアクセスをカプセル化する。
====宣言====
*クラスの先頭で、テーブルのフィールドおよびデータベースが存在しない場合に生成する文字列を定義
*データベースは data という名前で、notes という _id、title、bodyの3つのフィールドをもつテーブルを一つ持つ。
====コンストラクタ====
*コンストラクタは、Context パラメータを取り、それにより [[Android ]] OS との通信を許可。これは [[Android ]] にアクセスする一般的な方法*Activity Acti[[vi]]ty クラスは Context を実装しているため、Contextが必要な時に渡すことができる。
====メソッド====
=====open()=====
*open()メソッドは、DatabaseHelper メソッドは、[[Database]]Helper のインスタンスを呼び出す。*DatabaseHelper [[Database]]Helper は SQLiteOpenHelper のローカル実装。*getWritableDatabasegetWritable[[Database]]() で、データベースを作成、オープン
=====close() =====
=====fetchAllNotes()=====
*クエリーを発行して、カーソルを得る
*query() には、データベーステーブル名、取得したいカラムリスト、残りのフィールドは順に、selection、selectionArgs、 groupBy、 having、orderByha[[vi]]ng、orderBy
*fetchNote()は、fetchAllNotes() と同様だが、行IDで1つの note を取得する
====LinearLayout の設定====
=====すべての [[Android ]] のXMLレイアウトのヘッダーは以下で始まらなければいけない=====
<?xml version="1.0" encoding="utf-8"?>.
=====次に、たいていの場合、以下の様なレイアウトを置く=====
LinearLayout
=====トップレベルのコンポーネントまたはレイアウトで [[Android ]] のネームスペースを宣言する=====
xmlns:android="http://schemas.android.com/apk/res/android"
===LinearLayout ===
====オーバーライドメソッド====
=====onCreate() =====
*Activityが開始されたときに呼び出される。Acti[[vi]]tyが開始されたときに呼び出される。
*リソースの設定、ステートの設定を実施
=====onCreateOptionsMenuonCreateOptions[[Menu]]() =====*Activity Acti[[vi]]ty メニューの有効化
*ユーザーがメニューボタンをたたいた時に呼び出される
=====onOptionsItemSelected() =====
*メニューから生成されるイベントを制御
====基底クラスの変更====
*Activity Acti[[vi]]ty を ListActivity ListActi[[vi]]ty に public class Notepadv1 extends ListActivityListActi[[vi]]ty
====onCreate()====
private NotesDbAdapter mDbHelpermDb[[Help]]er;
/** Called when the activity acti[[vi]]ty is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView([[R]].layout.notepad_list); mDbHelper mDb[[Help]]er = new NotesDbAdapter(this); mDbHelpermDb[[Help]]er.open();
fillData();
}
*fillData() はまだ未作成
====onCreateOptionsMenuonCreateOptions[[Menu]]()====
<?xml version="1.0" encoding="utf-8"?>
<resources>
public class Notepadv1 extends ListActivity ListActi[[vi]]ty { public static final int INSERT_ID = [[Menu]].FIRST;
:
@Override
public boolean onCreateOptionsMenuonCreateOptions[[Menu]]([[Menu ]] menu) {
// TODO Auto-generated method stub
boolean result = super.onCreateOptionsMenuonCreateOptions[[Menu]](menu); menu.add(0, INSERT_IDINSE[[R]]T_ID, 0, [[R]].string.menu_insert);
return result;
}
====onOptionsItemSelected()====
@Override
public boolean onOptionsItemSelected(MenuItem [[Menu]]Item item) {
// TODO Auto-generated method stub
switch (item.getItemId()) {
case INSERT_IDINSE[[R]]T_ID:
createNote();
return true;
public void createNote() {
String noteName = "Note " + mNoteNumber++;
mDbHelpermDb[[Help]]er.createNote(noteName, "");
fillData();
}
====fillData()====
private void fillData() {
Cursor c = mDbHelpermDb[[Help]]er.fetchAllNotes();
startManagingCursor(c);
SimpleCursorAdapter notes =
new SimpleCursorAdapter(this, [[R]].layout.notes_row, c, from, to);
setListAdapter(notes);
}
===ここまでで、起動===
[[File:0147_android_notepad02.jpg]]
==(2) Activity Acti[[vi]]ty の追加、高度なレイアウトの使用など==
*http://developer.android.com/resources/tutorials/notepad/notepad-ex2.html
*2つめのActivityを作成しマニフェストに追加2つめのActi[[vi]]tyを作成しマニフェストに追加*startActivityForResultstartActi[[vi]]tyForResult()を使って非同期で別のActivityを呼び出すを使って非同期で別のActi[[vi]]tyを呼び出す*Bundle オブジェクトで Activity Acti[[vi]]ty 間でデータを受け渡す
*他のさらに高度なレイアウトの使用
*コンテキストメニューの作成
*fillData()では、mNotesCursor カーソルフィールドを使うようになっている。
*onCreate()は変更なし。
*いくつかのオーバーライドメソッドが記述されている(onCreateContextMenuonCreateContext[[Menu]](), onContextItemSelected(), onListItemClick() and onActivityResult())
===表示されている note を削除するためのコンテキストメニューを追加する===
====registerForContextMenuregisterForContext[[Menu]]()====*ListView のアイテムそれぞれに順にコンテキストメニューにregisterForContextMenuのアイテムそれぞれに順にコンテキストメニューにregisterForContext[[Menu]]()を呼び出して登録
*onCreate() の最後に以下を追加
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView([[R]].layout.notes_list); mDbHelper mDb[[Help]]er = new NotesDbAdapter(this); mDbHelpermDb[[Help]]er.open();
fillData();
registerForContextMenuregisterForContext[[Menu]](getListView());
}
====onCreateContextMenuonCreateContext[[Menu]]()====
@Override
public void onCreateContextMenuonCreateContext[[Menu]](ContextMenu Context[[Menu]] menu, View v, ContextMenuInfo Context[[Menu]]Info menuInfo) { super.onCreateContextMenuonCreateContext[[Menu]](menu, v, menuInfo);
// TODO: fill in rest of method
super.onCreateContextMenuonCreateContext[[Menu]](menu, v, menuInfo); menu.add(0, DELETE_ID, 0, [[R]].string.menu_delete);
}
====onContextItemSelected()====
@Override
public boolean onContextItemSelected(MenuItem [[Menu]]Item item) {
// TODO: fill in rest of method
switch(item.getItemId()) {
case DELETE_ID:
AdapterContextMenuInfo AdapterContext[[Menu]]Info info = (AdapterContextMenuInfoAdapterContext[[Menu]]Info) item.getMenuInfoget[[Menu]]Info(); mDbHelpermDb[[Help]]er.deleteNote(info.id);
fillData();
return true;
}
====onActivityResultonActi[[vi]]tyResult()====
@Override
protected void onActivityResultonActi[[vi]]tyResult(int requestCode, int resultCode, Intent intent) {
// TODO Auto-generated method stub
super.onActivityResultonActi[[vi]]tyResult(requestCode, resultCode, intent);
Bundle extras = intent.getExtras();
switch(requestCode) {
case ACTIVITY_CREATEACTIVITY_C[[R]]EATE:
String title = extras.getString(NotesDbAdapter.KEY_TITLE);
String body = extras.getString(NotesDbAdapter.KEY_BODY);
mDbHelpermDb[[Help]]er.createNote(title, body);
fillData();
break;
case ACTIVITY_EDIT:
Long mRowId m[[R]]owId = extras.getLong(NotesDbAdapter.KEY_ROWIDKEY_[[R]]OWID); if (mRowId m[[R]]owId != null) {
String editTitle = extras.getString(NotesDbAdapter.KEY_TITLE);
String editBody = extras.getString(NotesDbAdapter.KEY_BODY);
mDbHelpermDb[[Help]]er.updateNote(mRowId, editTitle, editBody);
}
fillData();
// TODO: fill in implementation
Intent i = new Intent(this, NoteEdit.class);
startActivityForResultstartActi[[vi]]tyForResult(i, ACTIVITY_CREATE);
}
c.moveToPosition(position);
Intent i = new Intent(this, NoteEdit.class);
i.putExtra(NotesDbAdapter.KEY_ROWIDKEY_[[R]]OWID, id);
i.putExtra(NotesDbAdapter.KEY_TITLE,
c.getString(c.getColumnIndexOrThrow(NotesDbAdapter.KEY_TITLE)));
c.getString(c.getColumnIndexOrThrow(NotesDbAdapter.KEY_BODY)));
startActivityForResultstartActi[[vi]]tyForResult(i, ACTIVITY_EDIT);
}
====onActivityResultonActi[[vi]]tyResult()====
@Override
protected void onActivityResultonActi[[vi]]tyResult(int requestCode, int resultCode, Intent intent) { super.onActivityResultonActi[[vi]]tyResult(requestCode, resultCode, intent);
// TODO: fill in rest of method
switch(requestCode) {
case ACTIVITY_CREATEACTIVITY_C[[R]]EATE:
String title = extras.getString(NotesDbAdapter.KEY_TITLE);
String body = extras.getString(NotesDbAdapter.KEY_BODY);
mDbHelpermDb[[Help]]er.createNote(title, body);
fillData();
break;
case ACTIVITY_EDIT:
Long mRowId m[[R]]owId = extras.getLong(NotesDbAdapter.KEY_ROWIDKEY_[[R]]OWID); if (mRowId m[[R]]owId != null) {
String editTitle = extras.getString(NotesDbAdapter.KEY_TITLE);
String editBody = extras.getString(NotesDbAdapter.KEY_BODY);
mDbHelpermDb[[Help]]er.updateNote(mRowId, editTitle, editBody);
}
fillData();
}
===NoteEdit クラスの追加===
public class NoteEdit extends Activity Acti[[vi]]ty {
private EditText mTitleText;
private EditText mBodyText;
private Long mRowIdm[[R]]owId;
@Override
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView([[R]].layout.note_edit); mTitleText = (EditText) findViewById([[R]].id.title); mBodyText = (EditText) findViewById([[R]].id.body); Button confirmButton = (Button) findViewById([[R]].id.confirm);
confirmButton.setOnClickListener(
bundle.putString(NotesDbAdapter.KEY_TITLE, mTitleText.getText().toString());
bundle.putString(NotesDbAdapter.KEY_BODY, mBodyText.getText().toString());
if (mRowId m[[R]]owId != null) { bundle.putLong(NotesDbAdapter.KEY_ROWIDKEY_[[R]]OWID, mRowIdm[[R]]owId);
}
Intent mIntent = new Intent();
mIntent.putExtras(bundle);
setResultset[[R]]esult(RESULT_OK[[R]]ESULT_OK, mIntent);
finish();
}
);
mRowId m[[R]]owId = null;
Bundle extras = getIntent().getExtras();
if (extras != null) {
String title = extras.getString(NotesDbAdapter.KEY_TITLE);
String body = extras.getString(NotesDbAdapter.KEY_BODY);
mRowId m[[R]]owId = extras.getLong(NotesDbAdapter.KEY_ROWIDKEY_[[R]]OWID);
if (title != null) {
}
===AndroidManifest[[Android]]Manifest.xml の編集===*<activity acti[[vi]]ty android:name=".NoteEdit"></activityacti[[vi]]ty>を追加
<activity acti[[vi]]ty android:name=".Notepadv2" android:label="@string/app_name">
:
</activityacti[[vi]]ty> <activity acti[[vi]]ty android:name=".NoteEdit"></activityacti[[vi]]ty>
===ここまでで起動===
====onCreate()====
*メンバ変数の宣言
private NotesDbAdapter mDbHelpermDb[[Help]]er;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mDbHelper mDb[[Help]]er = new NotesDbAdapter(this); mDbHelpermDb[[Help]]er.open();
setContentView([[R]].layout.note_edit);
mTitleText = (EditText) findViewById([[R]].id.title); mBodyText = (EditText) findViewById([[R]].id.body);
Button confirmButton = (Button) findViewById([[R]].id.confirm);
mRowId m[[R]]owId = savedInstanceState != null ? savedInstanceState.getLong(NotesDbAdapter.KEY_ROWIDKEY_[[R]]OWID)
: null;
if (mRowId m[[R]]owId == null) {
Bundle extras = getIntent().getExtras();
mRowId m[[R]]owId = extras != null ? extras.getLong(NotesDbAdapter.KEY_ROWIDKEY_[[R]]OWID)
: null;
}
confirmButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View view[[vi]]ew) { setResultset[[R]]esult(RESULT_OK[[R]]ESULT_OK);
finish();
}
private void populateFields() {
if (mRowId m[[R]]owId != null) { Cursor note = mDbHelpermDb[[Help]]er.fetchNote(mRowId);
startManagingCursor(note);
mTitleText.setText(note.getString(note.getColumnIndexOrThrow(NotesDbAdapter.KEY_TITLE)));
// TODO Auto-generated method stub
super.onSaveInstanceState(outState);
outState.putLong(NotesDbAdapter.KEY_ROWIDKEY_[[R]]OWID, mRowIdm[[R]]owId);
}
=====onPause()=====
saveState();
}
=====onResumeon[[R]]esume()=====
@Override
protected void onResumeon[[R]]esume() {
// TODO Auto-generated method stub
super.onResumeon[[R]]esume();
populateFields();
}
String body = mBodyText.getText().toString();
if (mRowId m[[R]]owId == null) { long id = mDbHelpermDb[[Help]]er.createNote(title, body);
if (id > 0) {
mRowId m[[R]]owId = id;
}
} else {
mDbHelpermDb[[Help]]er.updateNote(mRowId, title, body);
}
}
===Notepadv3 ===
====onActivityResultonActi[[vi]]tyResult()====
@Override
protected void onActivityResultonActi[[vi]]tyResult(int requestCode, int resultCode, Intent intent) { super.onActivityResultonActi[[vi]]tyResult(requestCode, resultCode, intent);
fillData();
}
Intent i = new Intent(this, NoteEdit.class);
i.putExtra(NotesDbAdapter.KEY_ROWIDKEY_[[R]]OWID, id); startActivityForResultstartActi[[vi]]tyForResult(i, ACTIVITY_EDIT);
}