前回の続き。
さて、住所のマップボタンにリスナーを追加したのでOnClickListenerをimplementsしてonClickを実装する必要があります。
/src/com.example.bizcard/RegistActivity.java
以上で「名刺一覧画面から新規登録」「名刺詳細画面から編集」をクリックしたときに正しく表示されるようになりました。
次に必要なのは保存のロジックとテンプレートです。
閲覧画面とちがって編集前提なので最下段に保存ボタンとかでいい気がしますが、サンプルがメニューボタンから操作を行うようになっているので倣います。
個人的にこのswitch内に長大ロジックって作りが大嫌いなんだがみんな平気なの?
まずonCreateOptionsMenu()でメニューを押したらregist.xmlが表示されるようにします。
次にonOptionsItemSelected()でメニューボタンが押されたときの処理を記述します。
最初にあるのはR.id.menu_newですが、現在メニューボタンにR.id.menu_newはないのでここに来ることはありません。
次にR.id.menu_save、保存ボタンを押したときの処理です。
必須なのが名前だけなので、length()で長さが0だった場合はエラーメッセージを表示します。
このToastは一定時間だけダイアログを表示するという便利なクラスです。
お手軽に実績のポコンみたいなものを実装できます。
第三引数で表示時間を指定することができ、Toast.LENGTH_SHORTは短時間(2、3秒)、Toast.LENGTH_LONGは長時間(4、5秒)ってあんまり変わらねえ。
何故か任意の時間を渡すことはできません。
その後は単にBizCardオブジェクトに入力値を突っ込んでsave()メソッドを呼んでるだけです。
編集の場合一番最初の一覧画面で取得したBizCardオブジェクトをずっと引き回しているので、IDが入っていてUPDATEになり、新規作成の場合は直前にnewで作成されているのでIDがなくINSERTになります。
めでたし。
Activity.finish()すると現在のアクティビティを終了します。
Activity.setResult()で値を入れると呼び出し元のアクティビティに値を返すことができます。
でだ、前ShowActivity.onActivityResult()でRESULT_OKだったら表示を更新、というメソッドを実装したはずなんだが更新されない。何故?
ifを外して常時更新にしても駄目だったので根本的に呼ばれてすらいないみたいなんだが。
いろいろ触ってみたところ、startActivityForResult()の第二引数を正の値にしたら正しく動作するようになりました。
なにそれ。
サンプルでは間違いなく-1って書いてあるのに。
削除ボタンを押したときはR.id.menu_deleteの動作になります。
まずAlertDialogでアラートのポップアップを作成します。
AlertDialog.Builder.setIcon()とAlertDialog.setIcon()が一体どう違うのか私にはわからない。
ダイアログ内にsetNegativeButton()でキャンセルボタン、setPositiveButton()でOKボタンを実装します。
setPositiveButtonのリスナーはこの場かぎりの無名クラスで実装されています。
中身はデータベースから現在のBizCardを削除し、テキストを削除し、インスタンス内のBizCardオブジェクトも削除し、削除した旨のメッセージを表示する、となっています。
以上で、マップ関係以外の名刺管理アプリケーションの機能が完成しまし・・・実はひとつ問題があります。
Androidの記事
さて、住所のマップボタンにリスナーを追加したのでOnClickListenerをimplementsしてonClickを実装する必要があります。
/src/com.example.bizcard/RegistActivity.java
//mapButtonをクリックした
public void onClick(View v) {
//住所を取得してインテントに詰めてMapActivityを起動
String address = addressText.getText().toString();
Intent mapIntent = new Intent( RegistActivity.this, MapActivity.class);
mapIntent.putExtra( BizCard.COLUMN_ADDRESS, address);
startActivity( mapIntent);
};
やってることはコメントに書いてあるとおりで、ShowActivityの住所リンクをクリックしたときと全く同じです。以上で「名刺一覧画面から新規登録」「名刺詳細画面から編集」をクリックしたときに正しく表示されるようになりました。
次に必要なのは保存のロジックとテンプレートです。
閲覧画面とちがって編集前提なので最下段に保存ボタンとかでいい気がしますが、サンプルがメニューボタンから操作を行うようになっているので倣います。
//テキストの削除を行うサブルーチン
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 onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.regist, menu);
return true;
}
//メニューボタンをクリックした
@Override
public boolean onOptionsItemSelected(MenuItem item) {
//押したメニューボタンを取得
int itemId = item.getItemId();
switch (itemId) {
// 新規("@+id/menu_new")
case R.id.menu_new:
clear();
break;
// 保存("@+id/menu_save")
case R.id.menu_save:
//新規作成の場合BizCardオブジェクトができてないので作成
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;
// 削除("@+id/menu_delete")
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;
}
さあ一気に長くなりました。個人的にこのswitch内に長大ロジックって作りが大嫌いなんだがみんな平気なの?
まずonCreateOptionsMenu()でメニューを押したらregist.xmlが表示されるようにします。
次にonOptionsItemSelected()でメニューボタンが押されたときの処理を記述します。
最初にあるのはR.id.menu_newですが、現在メニューボタンにR.id.menu_newはないのでここに来ることはありません。
次にR.id.menu_save、保存ボタンを押したときの処理です。
必須なのが名前だけなので、length()で長さが0だった場合はエラーメッセージを表示します。
このToastは一定時間だけダイアログを表示するという便利なクラスです。
お手軽に実績のポコンみたいなものを実装できます。
第三引数で表示時間を指定することができ、Toast.LENGTH_SHORTは短時間(2、3秒)、Toast.LENGTH_LONGは長時間(4、5秒)ってあんまり変わらねえ。
何故か任意の時間を渡すことはできません。
その後は単にBizCardオブジェクトに入力値を突っ込んでsave()メソッドを呼んでるだけです。
編集の場合一番最初の一覧画面で取得したBizCardオブジェクトをずっと引き回しているので、IDが入っていてUPDATEになり、新規作成の場合は直前にnewで作成されているのでIDがなくINSERTになります。
めでたし。
Activity.finish()すると現在のアクティビティを終了します。
Activity.setResult()で値を入れると呼び出し元のアクティビティに値を返すことができます。
でだ、前ShowActivity.onActivityResult()でRESULT_OKだったら表示を更新、というメソッドを実装したはずなんだが更新されない。何故?
ifを外して常時更新にしても駄目だったので根本的に呼ばれてすらいないみたいなんだが。
いろいろ触ってみたところ、startActivityForResult()の第二引数を正の値にしたら正しく動作するようになりました。
なにそれ。
サンプルでは間違いなく-1って書いてあるのに。
削除ボタンを押したときはR.id.menu_deleteの動作になります。
まずAlertDialogでアラートのポップアップを作成します。
AlertDialog.Builder.setIcon()とAlertDialog.setIcon()が一体どう違うのか私にはわからない。
ダイアログ内にsetNegativeButton()でキャンセルボタン、setPositiveButton()でOKボタンを実装します。
setPositiveButtonのリスナーはこの場かぎりの無名クラスで実装されています。
中身はデータベースから現在のBizCardを削除し、テキストを削除し、インスタンス内のBizCardオブジェクトも削除し、削除した旨のメッセージを表示する、となっています。
以上で、マップ関係以外の名刺管理アプリケーションの機能が完成しまし・・・実はひとつ問題があります。
Androidの記事
PR
トラックバック
トラックバックURL: