android-如何显示标记的位置作为谷歌地图上的地址 [英] android- How to display marker's location as an address on google maps
问题描述
我已经尝试了commonsware google mapsv2教程,特别是在地图上拖动标记。但现在另一个问题陷入了我的想法。问题是,我怎样才能将标记的当前位置显示为地图下方或上方的地址(字符串)?
这是我使用的代码:
public class MainActivity扩展AbstractMapActivity实现
OnNavigationListener,OnInfoWindowClickListener,
OnMarkerDragListener {
private static final String STATE_NAV =nav;
private static final int [] MAP_TYPE_NAMES = {R.string.normal,
R.string.hybrid,R.string.satellite,R.string.terrain};
private static final int [] MAP_TYPES = {GoogleMap.MAP_TYPE_NORMAL,
GoogleMap.MAP_TYPE_HYBRID,GoogleMap.MAP_TYPE_SATELLITE,
GoogleMap.MAP_TYPE_TERRAIN};
私人GoogleMap地图= null;
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
if(readyToGo()){
setContentView(R.layout.activity_main);
SupportMapFragment mapFrag =
(SupportMapFragment)getSupportFragmentManager()。findFragmentById(R.id.map);
mapFrag.setRetainInstance(true);
initListNav();
map = mapFrag.getMap();
if(savedInstanceState == null){
CameraUpdate center =
CameraUpdateFactory.newLatLng(new LatLng(40.76793169992044,
-73.98180484771729));
CameraUpdate zoom = CameraUpdateFactory.zoomTo(15);
map.moveCamera(center);
map.animateCamera(zoom);
addMarker(地图,40.748963847316034,-73.96807193756104,
R.string.un,R.string.united_nations);
addMarker(地图,40.76866299974387,-73.98268461227417,
R.string.lincoln_center,
R.string.lincoln_center_snippet);
addMarker(地图,40.765136435316755,-73.97989511489868,
R.string.carnegie_hall,R.string.practice_x3);
addMarker(地图,40.70686417491799,-74.01572942733765,
R.string.downtown_club,R.string.heisman_trophy);
}
map.setInfoWindowAdapter(new PopupAdapter(getLayoutInflater()));
map.setOnInfoWindowClickListener(this);
map.setOnMarkerDragListener(this);
}
}
@Override
public boolean onNavigationItemSelected(int itemPosition,long itemId){
map.setMapType(MAP_TYPES [itemPosition]);
return(true);
}
@Override
public void onSaveInstanceState(Bundle savedInstanceState){
super.onSaveInstanceState(savedInstanceState);
savedInstanceState.putInt(STATE_NAV,
getSupportActionBar()。getSelectedNavigationIndex());
}
@Override
public void onRestoreInstanceState(Bundle savedInstanceState){
super.onRestoreInstanceState(savedInstanceState);
getSupportActionBar()。setSelectedNavigationItem(savedInstanceState.getInt(STATE_NAV));
}
@Override
public void onInfoWindowClick(Marker marker){
Toast.makeText(this,marker.getTitle(),Toast.LENGTH_LONG).show( );
}
@Override
public void onMarkerDragStart(Marker marker){
LatLng position = marker.getPosition();
Log.d(getClass()。getSimpleName(),String.format(从%f拖动到%f,
position.latitude,
position.longitude) );
}
@Override
public void onMarkerDrag(Marker marker){
LatLng position = marker.getPosition();
$ b $ Log.d(getClass()。getSimpleName(),
String.format(拖动到%f:%f,position.latitude,
position.longitude) );
}
@Override
public void onMarkerDragEnd(Marker marker){
LatLng position = marker.getPosition();
Log.d(getClass()。getSimpleName(),String.format(拖到%f:%f,
position.latitude,
position.longitude) );
}
private void initListNav(){
ArrayList< String> items = new ArrayList< String>();
ArrayAdapter< String> NAV = NULL;
ActionBar bar = getSupportActionBar(); (int类型:MAP_TYPE_NAMES){
items.add(getString(type));
if(Build.VERSION.SDK_INT> = Build.VERSION_CODES.ICE_CREAM_SANDWICH){
nav =
new ArrayAdapter< String>(
bar.getThemedContext(),
android.R.layout.simple_spinner_item,
items);
}
else {
nav =
新的ArrayAdapter< String>(
this,
android.R.layout.simple_spinner_item,
items );
}
nav.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
bar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
bar.setListNavigationCallbacks(nav,this);
private void addMarker(GoogleMap map,double lat,double lon,
int title,int snippet){
map.addMarker(new MarkerOptions()。 position(new LatLng(lat,lon))
.title(getString(title))
.snippet(getString(snippet))
.draggable(true));
$ b $ p
$ b这是一个名为Uber的应用程序截图,它显示上面的当前标记位置的确切地址..那么如何实现它像那样,任何想法?谢谢..
解决方案首先,您需要在xml中设置一个textview,并在其中放置您的地图片段,现在将文本设置为您需要执行反转地理编码的当前位置的地址,以获得确切地址从您当前的纬度和经度,使用此: - $ / $>
字符串filterAddress =;
Geocoder geoCoder = new Geocoder(getBaseContext(),Locale.getDefault());
尝试{
列表<地址>地址=
geoCoder.getFromLocation(yourLatitude,yourLongitude,1);
$ b $ if(addresses.size()> 0){
for(int i = 0; i< addresses.get(0).getMaxAddressLineIndex(); i ++)
filterAddress + = addresses.get(0).getAddressLine(i)+;
}
} catch(IOException ex){
ex.printStackTrace();
} catch(Exception e2){
// TODO:处理异常
e2.printStackTrace();
}
写这样的xml: - $ /
< RelativeLayout
android:id =@ + id / layout1
android:layout_width =match_parent
android:layout_height =match_parent
android:layout_below =@ + id / img_header>
片段
android:id =@ + id / map
android:layout_width =match_parent
android:layout_height =match_parent
class =com.google.android.gms.maps.SupportMapFragment/>
android:id =@ + id / test
android:layout_width =match_parent
android:layout_height =40dp
android: text =Test
android:layout_centerHorizontal =true
android:textSize =22sp/>
< / RelativeLayout>
现在,您的filterAddress变量中的当前位置的地址已设置为我们已初始化的textview以上。希望它能奏效。
谢谢。
I've tried commonsware google mapsv2 tutorial's especially dragging marker on a map. But now another issue got stuck on my mind .. The thing is how can I display the marker's current location as an address(string) below or above the map ?
This is the code that I use:
public class MainActivity extends AbstractMapActivity implements
OnNavigationListener, OnInfoWindowClickListener,
OnMarkerDragListener {
private static final String STATE_NAV="nav";
private static final int[] MAP_TYPE_NAMES= { R.string.normal,
R.string.hybrid, R.string.satellite, R.string.terrain };
private static final int[] MAP_TYPES= { GoogleMap.MAP_TYPE_NORMAL,
GoogleMap.MAP_TYPE_HYBRID, GoogleMap.MAP_TYPE_SATELLITE,
GoogleMap.MAP_TYPE_TERRAIN };
private GoogleMap map=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (readyToGo()) {
setContentView(R.layout.activity_main);
SupportMapFragment mapFrag=
(SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map);
mapFrag.setRetainInstance(true);
initListNav();
map=mapFrag.getMap();
if (savedInstanceState == null) {
CameraUpdate center=
CameraUpdateFactory.newLatLng(new LatLng(40.76793169992044,
-73.98180484771729));
CameraUpdate zoom=CameraUpdateFactory.zoomTo(15);
map.moveCamera(center);
map.animateCamera(zoom);
addMarker(map, 40.748963847316034, -73.96807193756104,
R.string.un, R.string.united_nations);
addMarker(map, 40.76866299974387, -73.98268461227417,
R.string.lincoln_center,
R.string.lincoln_center_snippet);
addMarker(map, 40.765136435316755, -73.97989511489868,
R.string.carnegie_hall, R.string.practice_x3);
addMarker(map, 40.70686417491799, -74.01572942733765,
R.string.downtown_club, R.string.heisman_trophy);
}
map.setInfoWindowAdapter(new PopupAdapter(getLayoutInflater()));
map.setOnInfoWindowClickListener(this);
map.setOnMarkerDragListener(this);
}
}
@Override
public boolean onNavigationItemSelected(int itemPosition, long itemId) {
map.setMapType(MAP_TYPES[itemPosition]);
return(true);
}
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
savedInstanceState.putInt(STATE_NAV,
getSupportActionBar().getSelectedNavigationIndex());
}
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
getSupportActionBar().setSelectedNavigationItem(savedInstanceState.getInt(STATE_NAV));
}
@Override
public void onInfoWindowClick(Marker marker) {
Toast.makeText(this, marker.getTitle(), Toast.LENGTH_LONG).show();
}
@Override
public void onMarkerDragStart(Marker marker) {
LatLng position=marker.getPosition();
Log.d(getClass().getSimpleName(), String.format("Drag from %f:%f",
position.latitude,
position.longitude));
}
@Override
public void onMarkerDrag(Marker marker) {
LatLng position=marker.getPosition();
Log.d(getClass().getSimpleName(),
String.format("Dragging to %f:%f", position.latitude,
position.longitude));
}
@Override
public void onMarkerDragEnd(Marker marker) {
LatLng position=marker.getPosition();
Log.d(getClass().getSimpleName(), String.format("Dragged to %f:%f",
position.latitude,
position.longitude));
}
private void initListNav() {
ArrayList<String> items=new ArrayList<String>();
ArrayAdapter<String> nav=null;
ActionBar bar=getSupportActionBar();
for (int type : MAP_TYPE_NAMES) {
items.add(getString(type));
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
nav=
new ArrayAdapter<String>(
bar.getThemedContext(),
android.R.layout.simple_spinner_item,
items);
}
else {
nav=
new ArrayAdapter<String>(
this,
android.R.layout.simple_spinner_item,
items);
}
nav.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
bar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
bar.setListNavigationCallbacks(nav, this);
}
private void addMarker(GoogleMap map, double lat, double lon,
int title, int snippet) {
map.addMarker(new MarkerOptions().position(new LatLng(lat, lon))
.title(getString(title))
.snippet(getString(snippet))
.draggable(true));
}
}
Here is a screenshot an app named Uber , it displays the exact address of current marker position on above.. So how to implement it like that , any ideas? thanks..
解决方案 First you need to set a textview inside your xml in which you have placed your map fragment, now to set the text as address of the current location you need to do Reverse Geo-Coding, to get exact address from your current Latitude and Longitude, use this:-
String filterAddress = "";
Geocoder geoCoder = new Geocoder(getBaseContext(), Locale.getDefault());
try {
List<Address> addresses =
geoCoder.getFromLocation(yourLatitude, yourLongitude, 1);
if (addresses.size() > 0) {
for (int i = 0; i < addresses.get(0).getMaxAddressLineIndex(); i++)
filterAddress += addresses.get(0).getAddressLine(i) + " ";
}
} catch (IOException ex) {
ex.printStackTrace();
} catch (Exception e2) {
// TODO: handle exception
e2.printStackTrace();
}
Write xml like this :-
<RelativeLayout
android:id="@+id/layout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/img_header" >
<fragment
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"
class="com.google.android.gms.maps.SupportMapFragment" />
<TextView
android:id="@+id/test"
android:layout_width="match_parent"
android:layout_height="40dp"
android:text="Test"
android:layout_centerHorizontal="true"
android:textSize="22sp"/>
</RelativeLayout>
Now you have address of current location in your filterAddress variable, just set to the textview that we have initialized above. Hope it will work.
Thank you.
这篇关于android-如何显示标记的位置作为谷歌地图上的地址的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!