目的地の描画~Geocorderの利用~
続いて、地図上に目的地を表示します。マップで任意の場所を指定するには緯度(latitude)と経度(longitude)を指定する必要があります。しかし、登録画面で入力するのは住所なので、住所から緯度/経度への変換を行う必要があります。そのような機能を提供してくれるのがGeocorderです。
Geocorderから複数の結果が返ってきた場合には、ダイアログで候補を表示して対象を選択するようにします。
@Override public void onCreate(Bundle savedInstanceState) { : :中略 : // 座標取得用のGeocoder取得 Geocoder geocoder = new Geocoder( this, Locale.getDefault()); // インテントから住所の文字列を取得 Intent intent = getIntent(); String strAddress = intent.getStringExtra( BizCard.COLUMN_ADDRESS); try { // 住所からAddressへ変換 List<Address> addressList = geocoder.getFromLocationName(strAddress, 10); Address address = null; if( addressList.isEmpty()){ String message = getResources().getString( R.string.cannot_get_address); Toast toast = Toast.makeText(this, message + "[" + strAddress + "]", Toast.LENGTH_SHORT); toast.show(); } else if( addressList.size() == 1){ address = addressList.get( 0); } else{ // 複数のアドレスが見つかった場合はダイアログで対象を選択する AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder( this); alertDialogBuilder.setTitle( R.string.select_target); // ダイアログ表示用の文字列の生成 List<String> strAddressList = new ArrayList<String>(); for( Address element: addressList){ int maxAddressLineIdx = element.getMaxAddressLineIndex(); strAddressList.add( element.getAddressLine( maxAddressLineIdx)); } // ダイアログに表示するリストの生成 AddressSelectionListener listener = new AddressSelectionListener( addressList); ListView listView = new ListView( this); ArrayAdapter<String> listAdaptor = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, strAddressList); listView.setAdapter(listAdaptor); listView.setOnItemClickListener( listener); // ダイアログにリストを生成 alertDialogBuilder.setView( listView); // ダイアログの表示 AlertDialog dialog = alertDialogBuilder.create(); listener.setDialog( dialog); dialog.show(); } if( address != null){ setDist(address); } } catch (IOException e) { Toast toast = Toast.makeText(this, R.string.cannot_get_address, Toast.LENGTH_SHORT); toast.show(); } } /** * 住所の候補が複数あった場合にリストで選択された住所を表示するリスナ */ class AddressSelectionListener implements OnItemClickListener{ private List<Address> listAddress = null; private AlertDialog dialog = null; private AddressSelectionListener( List<Address> listAddress){ this.listAddress = listAddress; } public AlertDialog getDialog() { return dialog; } public void setDialog(AlertDialog dialog) { this.dialog = dialog; } public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // 選択された住所を目的地として設定 Address address = listAddress.get( position); setDist( address); // ダイアログを閉じる dialog.dismiss(); } } /** * 目的地の設定 * * @param address 住所 */ protected void setDist( Address address){ // TODO:後ほど実装 }
ここでも新たに使用する文字列が登場したので、「res/values/strings.xml」に追加します。
<string name="select_target">対象を選択してください</string> <string name="cannot_get_address">住所の取得に失敗しました</string>