更新画面の実装
続いて更新画面の実装を行います。
更新画面へは一覧画面から新規を選択した場合と、参照画面から編集を押した場合の2つのケースで遷移します。そのため、インテントから対象オブジェクトが取得できた場合(更新)と、取得できない場合(新規)を考慮する必要があります。
まずはメニューを設定しましょう。「res/menu」配下に「regist.xml」というファイルを作成し、下記のように「新規」「保存」「削除」のメニューを追加します。
<?xml version="1.0" encoding="utf-8" ?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 保存メニュー -->
<item
android:id="@+id/menu_save"
android:title="@string/menu_save"
android:icon="@android:drawable/ic_menu_save" />
<!-- 削除メニュー -->
<item
android:id="@+id/menu_delete"
android:title="@string/menu_delete"
android:icon="@android:drawable/ic_menu_delete" />
</menu>
また、更新画面で使用する下記のメッセージを「res/values/strings.xml」に追加しておきます。
<string name="saved">保存しました</string> <string name="deleted">削除しました</string> <string name="error_required">必須項目を入力してください</string>
下記に実装が完了した更新画面のソースを示します。
package sample.bizcard;
import sample.bizcard.db.BizCard;
import sample.bizcard.db.BizCardDao;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.Toast;
/**
* 登録アクティビティ
*/
public class RegistActivity extends Activity implements OnClickListener{
// 対象のBizCardオブジェクト
private BizCard bizCard = null;
// UI部品
private EditText personNameText = null;
private EditText companyNameText = null;
private EditText organizationNameText = null;
private EditText positionNameText = null;
private EditText zipCodeText = null;
private EditText addressText = null;
private ImageButton mapButton = null;
private EditText tel1Text = null;
private EditText tel2Text = null;
private EditText mailText = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.regist);
// UI部品の取得
personNameText = (EditText)findViewById( R.id.personNameText);
companyNameText = (EditText)findViewById( R.id.companyNameText);
organizationNameText = (EditText)findViewById( R.id.organizationNameText);
positionNameText = (EditText)findViewById( R.id.positionNameText);
zipCodeText = (EditText)findViewById( R.id.zipCodeText);
addressText = (EditText)findViewById( R.id.addressText);
mapButton = (ImageButton)findViewById( R.id.mapButton);
tel1Text = (EditText)findViewById( R.id.tel1Text);
tel2Text = (EditText)findViewById( R.id.tel2Text);
mailText = (EditText)findViewById( R.id.mailText);
// ボタンにマップ表示用のリスナー追加
mapButton.setOnClickListener( this);
// インテントからオブジェクトを取得
Intent intent = getIntent();
bizCard = (BizCard)intent.getSerializableExtra( BizCard.TABLE_NAME);
if( bizCard != null){
// UI部品に値を設定
personNameText.setText( bizCard.getPersonName());
companyNameText.setText( bizCard.getCompanyName());
organizationNameText.setText( bizCard.getOrganizationName());
positionNameText.setText( bizCard.getPositionName());
zipCodeText.setText( bizCard.getZipCode());
addressText.setText( bizCard.getAddress());
tel1Text.setText( bizCard.getTel1());
tel2Text.setText( bizCard.getTel2());
mailText.setText( bizCard.getMail());
}
}
/**
* オプションメニューの生成
*/
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.regist, menu);
return true;
}
/**
* 画面のクリア
*/
private void clear(){
bizCard = null;
personNameText.setText( null);
companyNameText.setText( null);
organizationNameText.setText( null);
positionNameText.setText( null);
zipCodeText.setText( null);
addressText.setText( null);
tel1Text.setText( null);
tel2Text.setText( null);
mailText.setText( null);
}
/**
* オプションメニューの選択
*/
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int itemId = item.getItemId();
switch (itemId) {
// 新規
case R.id.menu_new:
clear();
break;
// 保存
case R.id.menu_save:
if( bizCard == null){
bizCard = new BizCard();
}
// 入力チェック
String personName = personNameText.getText().toString();
if( personName.length() == 0){
Toast toast = Toast.makeText(this, R.string.error_required, Toast.LENGTH_SHORT);
toast.show();
return false;
}
// BizCardオブジェクトに入力値を反映する
bizCard.setPersonName( personName);
bizCard.setCompanyName( companyNameText.getText().toString());
bizCard.setOrganizationName( organizationNameText.getText().toString());
bizCard.setPositionName( positionNameText.getText().toString());
bizCard.setZipCode( zipCodeText.getText().toString());
bizCard.setAddress( addressText.getText().toString());
bizCard.setTel1( tel1Text.getText().toString());
bizCard.setTel2( tel2Text.getText().toString());
bizCard.setMail( mailText.getText().toString());
// 更新処理
BizCardDao dao = new BizCardDao( this);
bizCard = dao.save( bizCard);
// メッセージ表示
Toast toast = Toast.makeText(this, R.string.saved, Toast.LENGTH_SHORT);
toast.show();
// 保存時に終了し、前のアクティビティへ戻る
setResult( RESULT_OK);
finish();
break;
// 削除
case R.id.menu_delete:
// 確認ダイアログの表示
AlertDialog.Builder builder = new AlertDialog.Builder( this);
// アイコン設定
builder.setIcon(android.R.drawable.ic_dialog_alert);
// タイトル設定
builder.setTitle( R.string.confirm_delete);
// OKボタン設定
builder.setPositiveButton( android.R.string.ok, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
// 削除処理
BizCardDao dao = new BizCardDao( RegistActivity.this);
dao.delete( bizCard);
// 画面の更新
clear();
// メッセージ表示
Toast toast = Toast.makeText(RegistActivity.this, R.string.deleted, Toast.LENGTH_SHORT);
toast.show();
}
});
// キャンセルボタン設定
builder.setNegativeButton( android.R.string.cancel, null);
// ダイアログの表示
builder.show();
break;
}
return true;
}
public void onClick(View v) {
String address = addressText.getText().toString();
// 住所を詰めてMapActivityを起動
Intent mapIntent = new Intent( RegistActivity.this, MapActivity.class);
mapIntent.putExtra( BizCard.COLUMN_ADDRESS, address);
startActivity( mapIntent);
};
}
ほとんどが今まで出てきた内容のため、新たに出てきた内容についてのみ説明します。
メッセージの表示(Toast)
入力チェック、保存、削除処理が正常に行われた際のメッセージ表示にToastを使用しています。Toastを使用すると、下記のように一定時間表示されて、自然に消えるメッセージでユーザーに通知できます。

なお、Toast.LENGTH_SHORTをToast.LENGTH_LONGに変えるとメッセージの表示時間が長くなります。
ダイアログの表示
メニューから[削除]が選択された際に確認のダイアログの表示を行い、ダイアログ上で[OK]が選択された場合のみ削除するようにしてあります。
ダイアログの作成は、AlertDialog.Builderに対してメッセージやボタンを設定して行います。Androidのダイアログはモーダルではないので、ボタン選択時の処理は下記のようにListenerを設定して行います。
// 確認ダイアログの表示
AlertDialog.Builder builder = new AlertDialog.Builder( this);
// アイコン設定
builder.setIcon(android.R.drawable.ic_dialog_alert);
// タイトル設定
builder.setTitle( R.string.confirm_delete);
// OKボタン設定
builder.setPositiveButton( android.R.string.ok, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
// 削除処理
BizCardDao dao = new BizCardDao( RegistActivity.this);
dao.delete( bizCard);
// 画面の更新
clear();
// メッセージ表示
Toast toast = Toast.makeText(RegistActivity.this, R.string.deleted, Toast.LENGTH_SHORT);
toast.show();
}
});
// キャンセルボタン設定
builder.setNegativeButton( android.R.string.cancel, null);
// ダイアログの表示
builder.show();

アクティビティの終了
保存後は結果にRESULT_OKを設定してアクティビティを終了します。このように結果を設定すると、呼び出し元(参照画面)のonActivityResult()が設定したresultCodeで呼び出されます。
// 保存時に終了し、前のアクティビティへ戻る setResult( RESULT_OK); finish();
まとめ
「一覧」「参照」「登録」画面の実装がひとまず完了しました。次回はマップ画面の実装を行います。
