谷歌地图-75个标记-对话框片段

3
我在地图上有75个标记,每当点击一个标记时,就会弹出我定义的 DialogFragment。Fragment 使用了 Strings.xml 中存储的 3 个字符串(共计 3x75 个字符串)。
是否有更好的方法来识别已点击的标记,并带出相应信息的 DialogFragment,而不是编写 75 个 if 语句(将其位置与我的所有位置的 List 进行比较)?
        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 ... } 

-->这个方法在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);
       }

--> 这是在OnMapReady中调用的。

最终编辑:

您的解决方案可行:

var indexPlus = mLokacije.FindIndex(position => position.Latitude == pos.Latitude && position.Longitude == pos.Longitude) + 1;

感谢您的帮助 :)

好的,你可以为此创建一个大的哈希映射表。 - Evgeniy Strepetov
1个回答

1
对于字符串部分,很容易。创建一个通过名称获取资源字符串的方法:
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");

为了让IndexOf正常工作,我假设数组中的位置对象是您添加到标记的相同对象:

var position = new LatLng(50.379444, 2.773611);
mLokacije.Add(position);

MarkerOptions options = new MarkerOptions();
options.SetPosition(position);
map.AddMarker(marker1);

如果IndexOf因任何原因无法工作,您可以按如下方式找到索引:
var index = mLokacije.FindIndex(position => position.Lat == pos.Lat && position.Lng == pos.Lng);

你的解决方案很好,但我有一个问题。var index = mLokacije.IndexOf(pos); 总是将index设置为0。即使 var indexplus = mLokacije.IndexOf(pos) + 1; 和 var indexplus = mLokacije.LastIndexOf(pos) + 1; ...都返回0。 - user5699033
这让我想到mLokacije列表中的对象与从e.Marker.Position获取的对象不是同一个实例。List.IndexOf仅在比较相同实例而不仅仅是值时才有效。 - xleon
1
是的,这就是我想说的。IndexOf无法工作的唯一原因是在数组中找不到该对象。你可能正在使用重复的标记吗?你可以编辑你的问题并添加更多关于如何填充mLokacije数组的信息。然后我可以更好地帮助你。 - xleon
1
我使用相同的List<LatLng>来绘制标记,该列表也用于在单击事件上比较位置。(for循环) (...) options.SetPosition(mLokacije[i]); (...) - user5699033
1
好的,所以比较出现了问题。正如你所说,2个位置不能相等,你可以编写一个for()语句并比较纬度/经度来获取索引。 - xleon
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接