谷歌地图 - 75个标记 - DialogFragments

时间:2015-12-25 21:12:18

标签: c# android google-maps xamarin

我在地图上有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;

感谢您的帮助:)

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);