Fragment 中的可点击 Google 地图标记
Clickable Google Maps marker in Fragment
我在这里试图完成的是能够在我单击加载时动态添加的标记时显示 AlertDialog(调用 API,获取位置并在地图上显示它们)。这是在 onCreateView
.
片段中完成的
地图在此处加载:
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
FragmentManager fm = getChildFragmentManager();
mapFragment = (SupportMapFragment) fm.findFragmentById(R.id.map_container);
if (mapFragment == null) {
mapFragment = SupportMapFragment.newInstance();
fm.beginTransaction().replace(R.id.map_container, mapFragment).commit();
}
}
稍后,我从 SupportMapFragment
切换到 GoogleMap
:
@Override
public void onResume() {
super.onResume();
if (mMap == null && mapFragment != null) {
mapFragment.getMapAsync(new OnMapReadyCallback() {
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = Tools.configBasicGoogleMap(googleMap);
mMap.setMapType(sharedPref.getMapType());
}
});
}
}
因此,从逻辑上讲,我的地图应该准备就绪 mMap
。现在,我想显示一个 AlertDialog,所以我在片段的 class 定义中执行 implements GoogleMap.OnMarkerClickListener
并在此处实现它:
@Override
public boolean onMarkerClick(final Marker marker) {
Toast.makeText(getContext(), "Hello world", Toast.LENGTH_SHORT).show();
AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
builder.setTitle("Confirmation");
builder.setMessage("Pour confirmer le rapport, appuyez sur + 1.\nSi le rapport est faux, cliquez sur - 1.");
builder.setPositiveButton("+ 1", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id){
URL link = null;
try {
link = new URL(S.base_url + "report/increment/" + marker.getTag().toString());
} catch (MalformedURLException e) {
e.printStackTrace();
}
try {
BufferedReader in = new BufferedReader(
new InputStreamReader(
link.openStream()));
} catch (IOException e) {
e.printStackTrace();
}
}
});
AlertDialog ab = builder.create();
ab.show();
return false;
}
但连 Toast 都没有显示...当我点击一个标记时,我得到了方向和在 Google 地图按钮中打开,并且地图以标记为中心,但是我的方法未启动。
总而言之,从逻辑上讲,当我单击我加载的这些标记之一时,onMarkerClick 方法应该会自行触发,但这从未发生过!知道为什么吗?谢谢。
我不知道为什么 Google 地图 API 不能用作片段的工具。以下代码可能适合您。你只需要为本地分配markerClickListener,而不是实现MarkerClickListener。
//Detect location and set on map
mMapView.getMapAsync(new OnMapReadyCallback() {
@SuppressLint("MissingPermission")
@Override
public void onMapReady(GoogleMap mMap) {
googleMap = mMap;
// Bla
// Bla
// Bla your codes about map
googleMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
@Override
public boolean onMarkerClick(Marker marker) {
// Triggered when user click any marker on the map
return false;
}
});
}
});
我在这里试图完成的是能够在我单击加载时动态添加的标记时显示 AlertDialog(调用 API,获取位置并在地图上显示它们)。这是在 onCreateView
.
地图在此处加载:
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
FragmentManager fm = getChildFragmentManager();
mapFragment = (SupportMapFragment) fm.findFragmentById(R.id.map_container);
if (mapFragment == null) {
mapFragment = SupportMapFragment.newInstance();
fm.beginTransaction().replace(R.id.map_container, mapFragment).commit();
}
}
稍后,我从 SupportMapFragment
切换到 GoogleMap
:
@Override
public void onResume() {
super.onResume();
if (mMap == null && mapFragment != null) {
mapFragment.getMapAsync(new OnMapReadyCallback() {
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = Tools.configBasicGoogleMap(googleMap);
mMap.setMapType(sharedPref.getMapType());
}
});
}
}
因此,从逻辑上讲,我的地图应该准备就绪 mMap
。现在,我想显示一个 AlertDialog,所以我在片段的 class 定义中执行 implements GoogleMap.OnMarkerClickListener
并在此处实现它:
@Override
public boolean onMarkerClick(final Marker marker) {
Toast.makeText(getContext(), "Hello world", Toast.LENGTH_SHORT).show();
AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
builder.setTitle("Confirmation");
builder.setMessage("Pour confirmer le rapport, appuyez sur + 1.\nSi le rapport est faux, cliquez sur - 1.");
builder.setPositiveButton("+ 1", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id){
URL link = null;
try {
link = new URL(S.base_url + "report/increment/" + marker.getTag().toString());
} catch (MalformedURLException e) {
e.printStackTrace();
}
try {
BufferedReader in = new BufferedReader(
new InputStreamReader(
link.openStream()));
} catch (IOException e) {
e.printStackTrace();
}
}
});
AlertDialog ab = builder.create();
ab.show();
return false;
}
但连 Toast 都没有显示...当我点击一个标记时,我得到了方向和在 Google 地图按钮中打开,并且地图以标记为中心,但是我的方法未启动。
总而言之,从逻辑上讲,当我单击我加载的这些标记之一时,onMarkerClick 方法应该会自行触发,但这从未发生过!知道为什么吗?谢谢。
我不知道为什么 Google 地图 API 不能用作片段的工具。以下代码可能适合您。你只需要为本地分配markerClickListener,而不是实现MarkerClickListener。
//Detect location and set on map
mMapView.getMapAsync(new OnMapReadyCallback() {
@SuppressLint("MissingPermission")
@Override
public void onMapReady(GoogleMap mMap) {
googleMap = mMap;
// Bla
// Bla
// Bla your codes about map
googleMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
@Override
public boolean onMarkerClick(Marker marker) {
// Triggered when user click any marker on the map
return false;
}
});
}
});