2015-12-25 3 views
3

У меня есть 75 маркеров на карте, и каждый из них при нажатии вызывает мой подкласс DialogFragment. Фрагмент использует 3 строки, хранящиеся в Strings.xml (3x75).Карты Google - 75 маркеров - Диалог Фрагменты

Есть ли лучший способ распознавания Clicked маркера и воспитывая 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 
     { ... 

EDIT:

Локации добавлены как этот

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 ... } 

-> Этот метод вызывается в OnCr ЭАТС

Маркеры рисуются так:

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

FINAL EDIT:

Ваше решение работает:

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

Спасибо за вашу помощь :)

+0

Ну, вы можете сделать большой hash_map для этого –

ответ

2

Для части струн это легко. Сделать метод для получения строки ресурсов по имени:

private string GetStringByName(string name) 
{ 
    var id = Resources.GetIdentifier(name, "string", PackageName); 
    return id == 0 ? string.Empty : Resources.GetText(id); 
} 

Для цветов я не знаю лучшего способа, чем создание списка (или HashSet если вы предпочитаете):

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

Вашего решения является большим, но у меня есть 1 проблема. var index = mLokacije.IndexOf (pos); всегда устанавливает индекс в 0. Даже var indexplus = mLokacije.IndexOf (pos) + 1; и var indexplus = mLokacije.LastIndexOf (pos) + 1; ... оба возвращаются 0 – Sensei

+0

Это заставляет меня думать, что объекты в списке mLokacije - это не то же самое, что вы получаете от e.Marker.Position. List.IndexOf будет работать только в том случае, если вы сравниваете одни и те же экземпляры, а не только значения – xleon

+0

Если я правильно понял вас, вы говорите, что маркеры LatLng не являются полностью такими же объектами, что и мои LatLngs? BTW Я нашел обходное решение, используя два массива double []. Это не идеальный вариант: я могу найти IndexOf только широту или долготу, а также 2 местоположения не имеют одинаковых значений lat или long. Возможно ли реализовать это по-другому, поэтому я могу сравнить оба значения LatLng (2D-массив?)? – Sensei

Смежные вопросы