Android 中的 GoogleMap 未显示标记
GoogleMap in Android not displaying Markers
我正在为我的 类 开发一个应用程序,我需要在地图上显示标记。发生了两件奇怪的事情:首先,onMapReady 被执行了两次,其次,标记没有显示在地图上。这是我的代码:
public class MapFragment extends SupportMapFragment implements OnMapReadyCallback {
private GoogleMap mMap;
private Event mEventSelected;
private Person mPersonSelected;
private Map<Marker, Event> mMapMarkers;
private List<Polyline> mLines;
private TextView mPersonFullName;
private TextView mEventDescription;
private LinearLayout mMapEvent;
private ImageView mEventIcon;
private MenuItem searchIcon;
private MenuItem filterIcon;
private MenuItem settingsIcon;
private MenuItem topIcon;
private String EVENT_ID;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
mMapMarkers = new HashMap<>();
mLines = new ArrayList<>();
mEventSelected = null;
mPersonSelected = null;
getMapAsync(this);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
super.onCreateView(inflater, container, savedInstanceState);
View v = inflater.inflate(R.layout.fragment_map, container, false);
drawDefaultLayout(v);
return v;
}
private void pinEvents() {
mMap.clear();
Map <String, Event> events = FamilyMapData.getEvents();
for (Event event : events.values())
{
LatLng coordinates = new LatLng(event.getLatitude(), event.getLongitude());
String description = event.getDescription();
float color = 0;
switch (description){
case "baptism":{
color = BitmapDescriptorFactory.HUE_CYAN;
break;
}
case "birth":{
color = BitmapDescriptorFactory.HUE_BLUE;
break;
}
case "death":{
color = BitmapDescriptorFactory.HUE_AZURE;
break;
}
case "marriage":{
color = BitmapDescriptorFactory.HUE_RED;
break;
}
case "christening":{
color = BitmapDescriptorFactory.HUE_ORANGE;
break;
}
case "census":
{
color = BitmapDescriptorFactory.HUE_GREEN;
break;
}
}
mMapMarkers.put(mMap.addMarker(new MarkerOptions().position(coordinates).icon(BitmapDescriptorFactory.defaultMarker(color))), event);
}
}
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
pinEvents();
}
我希望你们中的一些人能够帮助我弄清楚为什么标记没有显示在地图上。
提前谢谢你,
编辑
这是xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<fragment
android:id="@+id/map"
android:layout_width="wrap_content"
android:layout_height="0dp"
class="com.google.android.gms.maps.SupportMapFragment"
android:layout_weight="5"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:orientation="horizontal"
android:layout_weight="1"
android:clickable="true"
android:baselineAligned="false"
android:id="@+id/map_event">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:id="@+id/icon_event_divisor">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingTop="40dp"
android:paddingBottom="40dp"
android:paddingStart="20dp"
android:paddingEnd="20dp"
android:clickable="false"
android:layout_gravity="center"
android:id="@+id/event_icon"/>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_gravity="center"
>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/person_full_name"
android:textSize="30sp"
android:id="@id/person_full_name"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="25sp"
android:text="@string/event_description"
android:layout_below="@id/person_full_name"
android:id="@+id/event_description"/>
</RelativeLayout>
</LinearLayout>
</LinearLayout>
我猜你的 onMapReady 函数根本没有被触发。
所以你的pinEvents函数也没有被触发。
您必须调用 getMapAsync() 来触发您在 onCreate 中完成的 onMapReady() 此处视图尚未创建,因此请在 onCreateView 中执行。
我建议您更改 class 的名称,因为有与 google 地图相关的 MapFragment 和 SupportMapFragment 以避免混淆。
如果您使用的是支持片段,您需要更改代码如下。
SupportMapFragment mapFragment = ((SupportMapFragment)getActivity().getSupportFragmentManager())
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
否则使用这个:
MapFragment mapFragment = (MapFragment) getFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
希望对您有所帮助。
我正在为我的 类 开发一个应用程序,我需要在地图上显示标记。发生了两件奇怪的事情:首先,onMapReady 被执行了两次,其次,标记没有显示在地图上。这是我的代码:
public class MapFragment extends SupportMapFragment implements OnMapReadyCallback {
private GoogleMap mMap;
private Event mEventSelected;
private Person mPersonSelected;
private Map<Marker, Event> mMapMarkers;
private List<Polyline> mLines;
private TextView mPersonFullName;
private TextView mEventDescription;
private LinearLayout mMapEvent;
private ImageView mEventIcon;
private MenuItem searchIcon;
private MenuItem filterIcon;
private MenuItem settingsIcon;
private MenuItem topIcon;
private String EVENT_ID;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
mMapMarkers = new HashMap<>();
mLines = new ArrayList<>();
mEventSelected = null;
mPersonSelected = null;
getMapAsync(this);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
super.onCreateView(inflater, container, savedInstanceState);
View v = inflater.inflate(R.layout.fragment_map, container, false);
drawDefaultLayout(v);
return v;
}
private void pinEvents() {
mMap.clear();
Map <String, Event> events = FamilyMapData.getEvents();
for (Event event : events.values())
{
LatLng coordinates = new LatLng(event.getLatitude(), event.getLongitude());
String description = event.getDescription();
float color = 0;
switch (description){
case "baptism":{
color = BitmapDescriptorFactory.HUE_CYAN;
break;
}
case "birth":{
color = BitmapDescriptorFactory.HUE_BLUE;
break;
}
case "death":{
color = BitmapDescriptorFactory.HUE_AZURE;
break;
}
case "marriage":{
color = BitmapDescriptorFactory.HUE_RED;
break;
}
case "christening":{
color = BitmapDescriptorFactory.HUE_ORANGE;
break;
}
case "census":
{
color = BitmapDescriptorFactory.HUE_GREEN;
break;
}
}
mMapMarkers.put(mMap.addMarker(new MarkerOptions().position(coordinates).icon(BitmapDescriptorFactory.defaultMarker(color))), event);
}
}
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
pinEvents();
}
我希望你们中的一些人能够帮助我弄清楚为什么标记没有显示在地图上。
提前谢谢你,
编辑
这是xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<fragment
android:id="@+id/map"
android:layout_width="wrap_content"
android:layout_height="0dp"
class="com.google.android.gms.maps.SupportMapFragment"
android:layout_weight="5"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:orientation="horizontal"
android:layout_weight="1"
android:clickable="true"
android:baselineAligned="false"
android:id="@+id/map_event">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:id="@+id/icon_event_divisor">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingTop="40dp"
android:paddingBottom="40dp"
android:paddingStart="20dp"
android:paddingEnd="20dp"
android:clickable="false"
android:layout_gravity="center"
android:id="@+id/event_icon"/>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_gravity="center"
>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/person_full_name"
android:textSize="30sp"
android:id="@id/person_full_name"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="25sp"
android:text="@string/event_description"
android:layout_below="@id/person_full_name"
android:id="@+id/event_description"/>
</RelativeLayout>
</LinearLayout>
</LinearLayout>
我猜你的 onMapReady 函数根本没有被触发。 所以你的pinEvents函数也没有被触发。
您必须调用 getMapAsync() 来触发您在 onCreate 中完成的 onMapReady() 此处视图尚未创建,因此请在 onCreateView 中执行。
我建议您更改 class 的名称,因为有与 google 地图相关的 MapFragment 和 SupportMapFragment 以避免混淆。
如果您使用的是支持片段,您需要更改代码如下。
SupportMapFragment mapFragment = ((SupportMapFragment)getActivity().getSupportFragmentManager())
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
否则使用这个:
MapFragment mapFragment = (MapFragment) getFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
希望对您有所帮助。