http://codezine.jp/article/detail/4842?p=3
前回の続き。
現在、一覧画面から各名刺をクリックするとShowActivityが起動し、クリックしたBizCardオブジェクトがインテントで渡されるようになっています。
ShowActivityはテンプレートを作っただけでロジックは何もしていませんでしたので、インテントから投稿内容を受け取るようにしてみましょう。
/src/com.example.bizcard/ShowActivity.java
その後は、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()を修正。
次にsetSpan()で任意のスタイルをセットします。
ここの第一引数には本来UnderlineSpanとかStrikethroughSpanといったスタイルをセットするようなクラスが入りますが、中でもClickableSpanではリンクを設定することができます。
ClickableSpan.onClick()はabstractなので、AddressSpanクラスにおいて、クリックされたら住所をインテントに突っ込んでMapActivityを起動するという実装を行っています。
これでめでたしめでたしと思ったら、リンクをクリックしても何も起こりません。
実はClickableSpanには、肝心のそのクリックを感知する機能が用意されていないらしいです。
感知するには、リスナー的なものとしてTextView.setMovementMethod( LinkMovementMethod.getInstance())という決まり文句を書けばいいみたいです。
意味がわからん。
Androidの記事
前回の続き。
現在、一覧画面から各名刺をクリックすると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
トラックバック
トラックバックURL: