忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



2024/11/23 11:31 |
Android2.2 名刺管理アプリケーションを作ってみる5日目その5
http://codezine.jp/article/detail/4842?p=3

前回の続き。

現在、一覧画面から各名刺をクリックするとShowActivityが起動し、クリックしたBizCardオブジェクトがインテントで渡されるようになっています。
ShowActivityはテンプレートを作っただけでロジックは何もしていませんでしたので、インテントから投稿内容を受け取るようにしてみましょう。

/src/com.example.bizcard/ShowActivity.java
    @Override
    public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            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(){
    	//各部品にbizCardを突っ込んでるだけ
		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());
	}
Activity.getIntent()で渡されたインテントオブジェクトを取得します。
その後は、Intent.putExtra()時に使用したメソッドに対応する取得メソッドで中身を取り出すことができます。
今回はSerializableなオブジェクトBizCardを突っ込んだのでgetSerializableExtra()で取り出せます。

この取得するメソッド、取り出す型によって使い分けが必要です。
文字列だったらgetStringExtra()だったり数値であればgetIntExtra()等です。
突っ込むときにはputExtra()が大量にオーバーロードされており、個別のputStringExtra()やputIntExtra()なんかは存在しないのに、何故かgetExtra()はありません。
さらに何故かgetIntegerArrayListExtra()には特別にputStringArrayListExtra()が用意されていたりするという。
何故こんな非対称な作りになってるんでしょうか。

どうにかして取り出せれば、後は普通にBizCardオブジェクトとして扱うことができます。
これで名刺をクリックすると詳細が表示されるようになりました。

なお、電話番号やメールアドレスには自動的にリンクが張られています。
これはandroid:autoLinkによるもので、android:autoLink="phone"とだけ書いておくと、それっぽい文字列に自動的にリンクが張られ、該当のリンクをクリックしたら自動的に電話が立ち上がります。
http://developer.android.com/intl/ja/reference/android/widget/TextView.html
"web"や"email"等一部の機能だけですが、わざわざリスナーを用意したりしなくても別アプリを起動できる便利な属性です。

さて、本来なら住所部分にandroid:autoLink="map"を指定するとGoogleMapを使えるのですが、残念ながら"map"は日本語に対応していません。
ていうか" The White House 1600 Pennsylvania Avenue, NW Washington, DC 20500 "って入れても駄目だったのでなんか使い方がおかしいのかもしれませんが。

ということで任意にリンクを作成したいと思いますが、それにはSpannableStringを使用します
元々文字列を修飾するクラスらしいのですが、SpannableString.setSpan()TextView.setMovementMethod()でリンクを踏んだときの行き先を設定することができます。


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());

		//住所をStringとして取得
	    String address = bizCard.getZipCode() + " " + bizCard.getAddress();
	    // SpannableStringインスタンスにセット
	    SpannableString addressSpan = new SpannableString( address);
	    // スタイルとしてAddressSpanをセット
	    addressSpan.setSpan(new AddressSpan(), 0, address.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
	    // ベタテキストのかわりに、SpannableStringテキストをセット
	    addressLabel.setText( addressSpan);
	    // ClickableSpan.onClick()を呼び出すための決まり文句みたい
	    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);
        }
    }
まず住所としてaddress文字列を取得し、SpannableStringインスタンスに投入します。
次にsetSpan()で任意のスタイルをセットします。
ここの第一引数には本来UnderlineSpanとかStrikethroughSpanといったスタイルをセットするようなクラスが入りますが、中でもClickableSpanではリンクを設定することができます。
ClickableSpan.onClick()はabstractなので、AddressSpanクラスにおいて、クリックされたら住所をインテントに突っ込んでMapActivityを起動するという実装を行っています。

これでめでたしめでたしと思ったら、リンクをクリックしても何も起こりません。
実はClickableSpanには、肝心のそのクリックを感知する機能が用意されていないらしいです。
感知するには、リスナー的なものとしてTextView.setMovementMethod( LinkMovementMethod.getInstance())という決まり文句を書けばいいみたいです。
意味がわからん。


Androidの記事
PR


2010/08/27 23:57 | Comments(0) | TrackBack() | Android

トラックバック

トラックバックURL:

コメント

コメントを投稿する






Vodafone絵文字 i-mode絵文字 Ezweb絵文字 (絵文字)



<<買ったものリスト 2010/08/29 | HOME | Android2.2 名刺管理アプリケーションを作ってみる5日目その4>>
忍者ブログ[PR]