参照画面の実装
参照画面では、一覧画面上で選択されたデータを表示するためにインテントから表示対象のオブジェクトを取得し、UI部品に値を設定します。
package sample.bizcard;
import sample.bizcard.db.BizCard;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
/**
* 参照アクティビティ
*/
public class ShowActivity extends Activity {
// 現在表示中のBizCardオブジェクト
private BizCard bizCard = null;
// UI部品
private TextView personNameLabel = null;
private TextView companyNameLabel = null;
private TextView organizationNameLabel = null;
private TextView positionNameLabel = null;
private TextView addressLabel = null;
private TextView tel1Label = null;
private TextView tel2Label = null;
private TextView mailLabel = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 自動生成されたR.javaの定数を指定してXMLからレイアウトを生成
setContentView(R.layout.show);
// Intentから対象のBizCardオブジェクトを取得
bizCard = (BizCard)getIntent().getSerializableExtra( BizCard.TABLE_NAME);
// UI部品の取得
personNameLabel = (TextView)findViewById( R.id.personNameLabel);
companyNameLabel = (TextView)findViewById( R.id.companyNameLabel);
organizationNameLabel = (TextView)findViewById( R.id.organizationNameLabel);
positionNameLabel = (TextView)findViewById( R.id.positionNameLabel);
addressLabel = (TextView)findViewById( R.id.addressLabel);
tel1Label = (TextView)findViewById( R.id.tel1Label);
tel2Label = (TextView)findViewById( R.id.tel2Label);
mailLabel = (TextView)findViewById( R.id.mailLabel);
// 表示内容の更新
updateView();
}
/**
* 画面の表示内容を更新する
*/
private void updateView(){
personNameLabel.setText( bizCard.getPersonName());
companyNameLabel.setText( bizCard.getCompanyName());
organizationNameLabel.setText( bizCard.getOrganizationName());
positionNameLabel.setText( bizCard.getPositionName());
tel1Label.setText( bizCard.getTel1());
tel2Label.setText( bizCard.getTel2());
mailLabel.setText( bizCard.getMail());
addressLabel.setText( bizCard.getAddress());
}
}
この時点で実行してみると、電話番号とメールアドレスにリンクが付いているのが確認できます。

このリンクはレイアウトファイルの中で、android:autoLink="phone"やandroid:autoLink="email"の指定をしているため、自動で設定されます。
メールのリンクをクリックすると「現在サポートされていない操作です」と表示されますが、実機では正しく動作します。
autoLinkにはphoneやemailの他にもmap、webなどを指定できますが、mapは日本の住所形式には対応しておらず、さらに今回は独自で作成したマップ画面に遷移したいため、リンク処理は独自で実装します。
SpannableStringを使ってリンク処理の実装
任意のリンクを設定するにはSpannableStringを利用します。
SpannableStringにベースとなる文字列、リンク範囲、クリックされた際の処理を設定する事で任意のリンク処理が実現できます。先ほどのソースに下記の太字部分を追加してください。
/**
* 画面の表示内容を更新する
*/
private void updateView(){
personNameLabel.setText( bizCard.getPersonName());
companyNameLabel.setText( bizCard.getCompanyName());
organizationNameLabel.setText( bizCard.getOrganizationName());
positionNameLabel.setText( bizCard.getPositionName());
tel1Label.setText( bizCard.getTel1());
tel2Label.setText( bizCard.getTel2());
mailLabel.setText( bizCard.getMail());
// 日本の住所ではandroid:autoLinkが利用できないので自前でリンク処理を実装
String address = bizCard.getZipCode() + " " + bizCard.getAddress();
SpannableString addressSpan = new SpannableString( address);
// リンク選択時の処理、リンク箇所を設定
addressSpan.setSpan(new AddressSpan(), 0, address.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
addressLabel.setText( addressSpan);
addressLabel.setMovementMethod( LinkMovementMethod.getInstance());
}
/**
* 住所のリンクがクリックされた際の処理
*/
class AddressSpan extends ClickableSpan{
@Override
public void onClick(View widget) {
// 住所を詰めてMapActivityを起動
Intent mapIntent = new Intent( ShowActivity.this, MapActivity.class);
mapIntent.putExtra( BizCard.COLUMN_ADDRESS, bizCard.getAddress());
startActivity( mapIntent);
}
}
最後に参照画面にもオプションメニューを追加して、編集画面への遷移を追加しましょう。まず、「res/menu」配下に「show.xml」というファイルを作成し、下記のように編集メニューを追加します。
<?xml version="1.0" encoding="utf-8" ?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 編集メニュー -->
<item
android:id="@+id/menu_edit"
android:title="@string/menu_edit"
android:icon="@android:drawable/ic_menu_edit" />
</menu>
次に、先ほどの「ListActivity.java」と同様にメニュー表示および選択時の処理を実装しますが、今回は、アクティビティの開始にstartActivity()ではなく、startActivityForResult()を使用します。
startActivityForResult()でアクティビティを開始すると、遷移先のアクティビティの結果をonActivityResult()で受け取る事ができます。今回の例では、遷移した編集画面で更新が行われた場合(RESULT_OKの場合)に参照画面をリフレッシュする処理を行っています。
/**
* オプションメニューの生成
*/
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.show, menu);
return true;
}
/**
* オプションメニューの選択
*/
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int itemId = item.getItemId();
switch (itemId) {
// 更新
case R.id.menu_edit:
// 現在表示中のエンティティを詰めて編集画面へ
Intent registIntent = new Intent( this, RegistActivity.class);
registIntent.putExtra( BizCard.TABLE_NAME, bizCard);
startActivityForResult( registIntent, -1);
}
return true;
};
/**
* 編集画面の結果に応じて画面をリフレッシュ
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if( resultCode == RESULT_OK){
// データベースから再読み込み
BizCardDao dao = new BizCardDao( this);
bizCard = dao.load( bizCard.getRowid());
// 表示を更新
updateView();
}
}
