我在地图上有75个标记,每个标记在单击时都会显示我的DialogFragment子类。 Fragment使用存储在Strings.xml(3x75)中的3个字符串。
是否有更好的方法来识别单击的标记并使用相应的信息调出DialogFragment,而不是像这样编写75 if
个语句(将其位置与我所有位置的List<LatLng>
进行比较)
var pos = e.Marker.Position;
FragmentTransaction transaction = FragmentManager.BeginTransaction();
if (pos.Equals(mLokacije[0]))
{
dialog_Informacije informacijeDialog = new dialog_Informacije(GetString(Resource.String.lok1_naslov),
GetString(Resource.String.lok1_sitno),
GetString(Resource.String.lok1_opis),
GetString(Resource.String.dialog_green));
informacijeDialog.Show(transaction, "dialog fragment");
}
else if (pos.Equals(mLokacije[1]))
{
dialog_Informacije informacijeDialog = new dialog_Informacije(GetString(Resource.String.lok2_naslov),
GetString(Resource.String.lok2_sitno),
GetString(Resource.String.lok2_opis),
GetString(Resource.String.dialog_red));
informacijeDialog.Show(transaction, "dialog fragment");
}
else if
{ ...
编辑:
像这样添加地点
private void AddLocations()
{
mLokacije = new List<LatLng>();
mLokacije.Add(new LatLng(43.511095, 16.436985)); //1
mLokacije.Add(new LatLng(43.5095654, 16.4392571)); //2
mLokacije.Add(new LatLng(43.5095598, 16.4393218)); //3
mLokacije.Add(new LatLng(43.509010, 16.440499)); //4
mLokacije.Add(new LatLng(43.509029, 16.440431)); //5
mLokacije.Add(new LatLng(43.508883, 16.440532)); //6
mLokacije.Add(new LatLng(43.508732, 16.440807)); //7
mLokacije.Add(new LatLng(43.508815, 16.440154)); //8 ... }
- &gt;此方法在OnCreate中调用
标记是这样绘制的:
private void DrawMarkersAndFillColors()
{
mColors = new List<string>(new string[mLokacije.Count]);
MarkerOptions options = new MarkerOptions();
for (int i = 0; i < mLokacije.Count; i++)
{
options.SetPosition(mLokacije[i]);
switch (i)
{
case 55:
case 57:
case 60:
options.SetIcon(BitmapDescriptorFactory.DefaultMarker(BitmapDescriptorFactory.HueGreen));
mColors[i] = GetString(Resource.String.dialog_green);
break;
case 43:
case 46:
case 52:
options.SetIcon(BitmapDescriptorFactory.DefaultMarker(BitmapDescriptorFactory.HueRed));
mColors[i] = GetString(Resource.String.dialog_red);
break;
.....}
mMap.AddMarker(options);
}
- &GT;这在OnMapReady
中调用最终编辑:
您的解决方案有效:
var indexPlus = mLokacije.FindIndex(position => position.Latitude == pos.Latitude && position.Longitude == pos.Longitude) + 1;
感谢您的帮助:)
答案 0 :(得分:2)
对于琴弦部分,很容易。创建一个按名称获取资源字符串的方法:
[FBSDKAccessToken currentAccessToken]
对于颜色,我不知道比创建列表更好的方法(如果您愿意,还可以使用hashset):
private string GetStringByName(string name)
{
var id = Resources.GetIdentifier(name, "string", PackageName);
return id == 0 ? string.Empty : Resources.GetText(id);
}
然后你可以得到如下对话框:
var colors = new List<int>
{
Resource.String.dialog_green,
Resource.String.dialog_red,
Resource.String.dialog_green,
Resource.String.dialog_green,
Resource.String.dialog_green,
Resource.String.dialog_red,
etc...
};
为了使IndexOf起作用,我假设数组中的位置对象与您添加到标记中的对象相同:
var index = mLokacije.IndexOf(pos); // assuming mLokacije is a List<>
var lok_naslov = GetStringByName($"lok{index}_naslov");
var lok_sitno = GetStringByName($"lok{index}_sitno");
var lok_opis = GetStringByName($"lok{index}_opis");
dialog_Informacije informacijeDialog = new dialog_Informacije(lok_naslov,
lok_sitno,
lok_opis,
GetString(colors.IndexOf(index)));
informacijeDialog.Show(transaction, "dialog fragment");
如果IndexOf因任何原因无效,您可以按如下方式找到索引:
var position = new LatLng(50.379444, 2.773611);
mLokacije.Add(position);
MarkerOptions options = new MarkerOptions();
options.SetPosition(position);
map.AddMarker(marker1);