Exemple #1
0
        /// <summary>
        /// Метод, предназначенный для подключения трех основых страниц к приложению.
        /// </summary>
        private void CreatePages()
        {
            LinearLayout General = FindViewById <LinearLayout>(Resource.Id.General);

            // Находим страничку с картой.
            mapPage = General.FindViewById <LinearLayout>(Resource.Id.Map);
            General.RemoveView(mapPage);
            ContextThemeWrapper wrapper  = new ContextThemeWrapper(this, Resource.Style.AppTheme);
            LayoutInflater      inflater = (LayoutInflater)wrapper.GetSystemService(LayoutInflaterService);

            // Страничка с поиском.
            searchPage = inflater.Inflate(Resource.Layout.PageSearch, null) as LinearLayout;
            // Страничка с настройками.
            settingsPage = inflater.Inflate(Resource.Layout.PageSetting, null) as LinearLayout;
            // Привязка страничек к кнопкам переключения.
            viewPager = FindViewById <ViewPager>(Resource.Id.viewPager1);
            TabLayout tab = FindViewById <TabLayout>(Resource.Id.sliding_tabs);

            // Установка основных вкладок для приложения.
            viewPager.Adapter = new MyPagerAdapter(this, searchPage, mapPage, settingsPage);
            // Установка главной страницы для приложения.
            viewPager.CurrentItem = 1;

            // Привязка заголовков к страницам.
            tab.SetupWithViewPager(viewPager);

            // Установка изображений и текста, для отдельных "табов".
            for (int i = 0; i < iconsForTabs.Length; i++)
            {
                tab.GetTabAt(i).SetText(textForTabs[i]);
                Drawable icon = new BitmapDrawable(bitmapFromVector(ApplicationContext, iconsForTabs[i], 1));
                tab.GetTabAt(i).SetIcon(icon);
            }
        }
        /// <summary>
        /// Метод,кастомизирующий окно информации,которое появляется при нажатии на маркер.
        /// </summary>
        /// <param name="marker">Маркер</param>
        /// <returns>View Компонент</returns>
        public View GetInfoWindow(Marker marker)
        {
            // НАходим информацию о месте,привязанному к данному маркеру.
            Human selectedHuman = MainActivity.findHumanFromMarker[marker.Id];
            // Подключение элементов управления.
            ContextThemeWrapper wrapper    = new ContextThemeWrapper(context, Resource.Style.AppTheme);
            LayoutInflater      inflater   = (LayoutInflater)wrapper.GetSystemService(layoutInflaterService);
            LinearLayout        pageForMap = inflater.Inflate(Resource.Layout.SimpleMapMarker, null) as LinearLayout;
            ImageView           second     = pageForMap.FindViewById <ImageView>(Resource.Id.imageView2);
            ImageView           first      = pageForMap.FindViewById <ImageView>(Resource.Id.imageView3);
            ImageView           infoIcon   = pageForMap.FindViewById <ImageView>(Resource.Id.imageView1);
            TextView            textFIO    = pageForMap.FindViewById <TextView>(Resource.Id.FIO);
            TextView            textInfo   = pageForMap.FindViewById <TextView>(Resource.Id.TypePlaces);
            Button button = pageForMap.FindViewById <Button>(Resource.Id.button1);

            // Установка картинок для элементов управления.
            first.SetImageBitmap(MainActivity.bitmapFromVector(context, Resource.Drawable.rozaBlackRight, 4));
            second.SetImageBitmap(MainActivity.bitmapFromVector(context, Resource.Drawable.rozaBlackLeft, 4));
            infoIcon.SetImageBitmap(MainActivity.bitmapFromVector(context, Resource.Drawable.book, 2));
            pageForMap.SetBackgroundResource(Resource.Drawable.styleInfo);
            //Информация на кнопке,для построения маршрута.
            textFIO.Text = textInfo.Text = null;

            // Если место это Основное кладбище, то заполняем окно,соответствующей информацией.
            if (selectedHuman.typePlace == TypePlaces.Основное_Кладбище)
            {
                textFIO.Text   = selectedHuman.fullName;
                textInfo.Text  = $"{selectedHuman.typePlace.ToString().Replace("_", " ")}";
                textInfo.Text += $"\nУчасток:{selectedHuman.plot}";
                textInfo.Text += $"\nРяд:{selectedHuman.row}";
                textInfo.Text += $"\nМесто:{selectedHuman.place}";
            }
            // Аналогично, если место это Колумбарий.
            else
            {
                textFIO.Text   = selectedHuman.fullName;
                textInfo.Text  = $"{selectedHuman.typePlace.ToString().Replace("_", " ")}";
                textInfo.Text += $"\nСекция:{selectedHuman.plot}";
                textInfo.Text += $"\nМесто:{selectedHuman.place}";
            }
            return(pageForMap);
        }
Exemple #3
0
        /// <summary>
        /// Метод,описывающий основную логику,связанную с Google maps.
        /// </summary>
        /// <param name="map">Google карта</param>
        public void OnMapReady(GoogleMap map)
        {
            this.map = map;
            CheckPermissionFineLocation(Manifest.Permission.AccessFineLocation, fineLocationPermissionCode);
            // Установка адаптера для меню,которое появляется при нажатии на маркер.
            map.SetInfoWindowAdapter(new MyInfoWindowAdapter(this, LayoutInflaterService));
            map.MoveCamera(CameraUpdateFactory.NewLatLngZoom(new LatLng(55.724758, 37.554268), 16.5f));
            // Установка кнопок для карты: Зум; найти местоположение.
            map.UiSettings.ZoomControlsEnabled     = true;
            map.UiSettings.MyLocationButtonEnabled = true;

            // Событие, которое при долгом нажатии на карту очищяет ее.
            map.MapLongClick += (sender, e) =>
            {
                map.Clear();
                findHumanFromMarker.Clear();
                findMarkerFromHuman.Clear();
            };

            // Событие срабатывающие при нажатии на маркер.
            map.InfoWindowClick += (sender, e) =>
            {
                Marker ThisMarker = e.Marker;
                // Инициализация основных элементов управления.
                ContextThemeWrapper             wrapper       = new ContextThemeWrapper(this, Resource.Style.AppTheme);
                LayoutInflater                  inflater      = (LayoutInflater)wrapper.GetSystemService(LayoutInflaterService);
                Android.App.AlertDialog.Builder dialogBuilder = new Android.App.AlertDialog.Builder(this);
                LinearLayout window = inflater.Inflate(Resource.Layout.layoutForDialog, null) as LinearLayout;
                dialogBuilder.SetView(window);
                RadioGroup   group                  = window.FindViewById <RadioGroup>(Resource.Id.radioGroup1);
                RadioButton  toThisMarker           = window.FindViewById <RadioButton>(Resource.Id.radioButton1);
                RadioButton  toAllMarkers           = window.FindViewById <RadioButton>(Resource.Id.radioButton2);
                RadioButton  toAllMarkersUserСhoice = window.FindViewById <RadioButton>(Resource.Id.radioButton3);
                ListView     listView1              = window.FindViewById <ListView>(Resource.Id.listView1);
                ListView     listView2              = window.FindViewById <ListView>(Resource.Id.listView2);
                LinearLayout listsForUserChoice     = window.FindViewById <LinearLayout>(Resource.Id.listsWithHumans);
                // Подключения адаптеров для списков для выбора определенного порядка посещения.
                ArrayAdapter <Human> givenTheСhoice = new MyAdapterForList(this, Resource.Layout.simpleListItem, findMarkerFromHuman.Keys.ToList());
                ArrayAdapter <Human> userСhoice     = new MyAdapterForList(this, Resource.Layout.simpleListItem, new List <Human>());
                listView1.Adapter = givenTheСhoice;
                listView2.Adapter = userСhoice;
                // Событие которое скрывает\показывает списки для выбора определенного порядка посещения мест.
                group.CheckedChange += (sender, e) =>
                {
                    if (e.CheckedId == toAllMarkersUserСhoice.Id)
                    {
                        listsForUserChoice.Visibility = ViewStates.Visible;
                    }
                    else
                    {
                        listsForUserChoice.Visibility = ViewStates.Gone;
                    }
                };

                // Событие,срабатывающие при нажатии на элемент списка "givenTheChoice".
                // Событие добавляет выбранный элемент в список "UserChoice" и удаляет его из старого списка.
                listView1.ItemClick += (sender, e) =>
                {
                    Human human = givenTheСhoice.GetItem(e.Position);
                    userСhoice.Add(human);
                    userСhoice.NotifyDataSetChanged();
                    givenTheСhoice.Remove(human);
                    givenTheСhoice.NotifyDataSetChanged();
                };

                // Событие,срабатывающие при нажатии на элемент списка "UserChoice".
                // Событие добавляет выбранный элемент в список "givenTheChoice" и удаляет его из старого списка.
                listView2.ItemClick += (sender, e) =>
                {
                    Human human = userСhoice.GetItem(e.Position);
                    givenTheСhoice.Add(human);
                    givenTheСhoice.NotifyDataSetChanged();
                    userСhoice.Remove(human);
                    userСhoice.NotifyDataSetChanged();
                };

                // Добавление кнопки для подтверждения построения маршрута.
                dialogBuilder.SetPositiveButton(Resource.String.textForPositiveButton, ((sender, e) =>
                {
                    // Если У пользователя включена геолокация, то строится маршут, иначе сообщается пользоваетлю об этом.
                    if (map.MyLocation == null)
                    {
                        CheckPermissionMap();
                    }
                    else
                    {
                        // Если пользователя выбрал построение маршрута к данному маркеру.
                        if (toThisMarker.Checked)
                        {
                            myPosition = new LatLng(map.MyLocation.Latitude, map.MyLocation.Longitude);
                            CreateRoute(myPosition, ThisMarker.Position);
                        }
                        // Если пользователь выбрал построение маршрута по оптимальному маршруту.
                        else if (toAllMarkers.Checked)
                        {
                            List <Human> selectedHumans = findMarkerFromHuman.Keys.ToList();
                            //логика по постройке оптимального маршрута
                            List <Human> minDistance = GetListMinDistance(selectedHumans);
                            CreateRouteFromListHuman(minDistance);
                        }
                        // Если пользователя выбрал построение относительно собственного порядка посещения.
                        else if (toAllMarkersUserСhoice.Checked)
                        {
                            // Маршрут строится, если пользователь выбрал все места для посещения, из раннее его выбранных.
                            if (listView2.Count == findMarkerFromHuman.Count)
                            {
                                List <Human> listWithHuman = new List <Human>();
                                // Получение выбранных полььзователем мест для посещения и запись их в лист.
                                for (int i = 0; i < userСhoice.Count; i++)
                                {
                                    listWithHuman.Add(userСhoice.GetItem(i));
                                }
                                CreateRouteFromListHuman(listWithHuman);
                            }
                            else
                            {
                                Toast.MakeText(this, "Вы не выбрали все места для посещения", ToastLength.Long).Show();
                            }
                        }
                        // Если не был выбран ни один из предложенных вариантов построения маршрута.
                        else
                        {
                            Toast.MakeText(this, "Вы не выбрали ни один из доступных методов прокладывания маршрута", ToastLength.Long).Show();
                        }
                    }
                }));

                // Кнопка отказа от построения маршрута.
                dialogBuilder.SetNegativeButton(Resource.String.textForNegativeButton, (sender, e) =>
                {
                    Toast.MakeText(this, "Вы отменили строительство маршрута.\nЕсли вы хотите очистить карту, сделайте долгое нажатие по ней!", ToastLength.Long).Show();
                });
                dialogBuilder.Show();
            };
        }