CodeZine(コードジン)

特集ページ一覧

アクティビティ実装時の勘どころ
~速習! Androidアプリケーション開発(5)~

第5回 アクティビティの実装その1

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2010/01/27 14:00
目次

更新画面の実装

 続いて更新画面の実装を行います。

 更新画面へは一覧画面から新規を選択した場合と、参照画面から編集を押した場合の2つのケースで遷移します。そのため、インテントから対象オブジェクトが取得できた場合(更新)と、取得できない場合(新規)を考慮する必要があります。

 まずはメニューを設定しましょう。「res/menu」配下に「regist.xml」というファイルを作成し、下記のように「新規」「保存」「削除」のメニューを追加します。

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>

 下記に実装が完了した更新画面のソースを示します。

RegistActivity.java
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
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();

まとめ

 「一覧」「参照」「登録」画面の実装がひとまず完了しました。次回はマップ画面の実装を行います。



  • LINEで送る
  • このエントリーをはてなブックマークに追加

バックナンバー

連載:速習! Androidアプリケーション開発

著者プロフィール

  • 横井 朗(ヨコイ アキラ)

    株式会社ビーブレイクシステムズにて業務システムのパッケージソフト(MA-EYES)の製品開発から導入までを手掛けるとともに、オープンソースソフトウェア(ExCella)の開発リーダも務める。 オープンソース関連について多くの執筆経験を持つ。 &nbsp; &nbsp;

あなたにオススメ

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5