C# 谷歌地图-75个标记-对话片段
我在地图上有75个标记,每一个都会在单击时显示我的DialogFragment子类。片段使用存储在strings.xml(3x75)中的3个字符串 有没有更好的方法来识别单击的标记并使用相应的信息显示DialogFragment,而不是像这样编写75个C# 谷歌地图-75个标记-对话片段,c#,android,google-maps,xamarin,C#,Android,Google Maps,Xamarin,我在地图上有75个标记,每一个都会在单击时显示我的DialogFragment子类。片段使用存储在strings.xml(3x75)中的3个字符串 有没有更好的方法来识别单击的标记并使用相应的信息显示DialogFragment,而不是像这样编写75个if语句(将其位置与所有位置的我的列表进行比较) 编辑: 位置是这样添加的 private void AddLocations() { mLokacije = new List<LatLng>();
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 ... }
谢谢你的帮助:)至于弦乐部分,很简单。创建一个按名称获取资源字符串的方法:
private string GetStringByName(string name)
{
var id = Resources.GetIdentifier(name, "string", PackageName);
return id == 0 ? string.Empty : Resources.GetText(id);
}
对于颜色,我不知道比创建列表(或哈希集,如果您愿意)更好的方法:
如果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");
var index = mLokacije.FindIndex(position => position.Lat == pos.Lat && position.Lng == pos.Lng);
好吧,你可以为此制作一个大的散列图。你的解决方案很好,但我有一个问题。var指数=mLokacije.IndexOf(pos);始终将索引设置为0。偶数var indexplus=mLokacije.IndexOf(pos)+1;和var indexplus=mLokacije.LastIndexOf(pos)+1。。。两者都返回0,这使我认为mLokacije列表中的对象与从e.Marker.Position获得的实例不同。只有在比较相同的实例时,List.IndexOf才会起作用,而不仅仅是值eah,这就是我要说的。IndexOf无法工作的唯一原因是在数组中找不到该对象。你可能会使用重复的标记吗?您可以编辑您的问题并添加有关如何实际填充mLokacije数组的更多信息。然后我可以帮助betterI使用我用来比较点击事件位置的相同列表绘制标记。(用于循环)(…)选项。设置位置(mLokacije[i]);(…)好吧,所以不管什么原因,它都不起作用。正如您所说的,两个位置不能相等,您可以编写一个for()语句并比较lat/long以获得索引
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...
};
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");
var position = new LatLng(50.379444, 2.773611);
mLokacije.Add(position);
MarkerOptions options = new MarkerOptions();
options.SetPosition(position);
map.AddMarker(marker1);
var index = mLokacije.FindIndex(position => position.Lat == pos.Lat && position.Lng == pos.Lng);