Форум программистов, компьютерный форум, киберфорум
Наши страницы

Программирование Android

Войти
Регистрация
Восстановить пароль
 
 
Mail-up
18 / 16 / 5
Регистрация: 07.01.2017
Сообщений: 138
#1

Кнопка "Показать на карте" и MapActivity - Программирование Android

17.05.2017, 18:15. Просмотров 362. Ответов 18
Метки нет (Все метки)

Всем привет, возник такой вопрос. У меня есть список магазинов в RecyclerView во фрагменте.
Хочу сделать под каждым магазином надпись "Показать на карте" и по клику переходить на MapActivity что бы показывало магаз на карте.
Вопрос - как правильно это делать.

Карту сделал, правда пока во фрагменте, фрагмент поместил в Tabbed Activity все работает , ApI получил, c картой немного разобрался.
Я так понимаю надо в адаптере на RV писать OnClick position, непонятно как передавать координаты в MapActivity/и как принимать.
Может быть у кого нибудь есть похожий пример
Всем спасибо)
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.05.2017, 18:15
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Кнопка "Показать на карте" и MapActivity (Программирование Android):

Рандомное появление "предметов" на карте гугл - Программирование Android
Как сделать чтобы на карте гугл рандомно появлялись предметы? Мне нужно только это,я с остальным я сам справлюсь,надеюсь хоть кто-нибудь...

Кнопка "Стереть данные", как от нее защититься? - Программирование Android
В настройках приложения есть кнопка "Стереть данные", она удаляет все данные (в том числе и sql) приложения. 1 Есть ли способ...

Кнопка "домой", смена ориентации и прочее :) - Программирование Android
Добрый вечер уважаемые. не могу решить вот такую проблему: Сделал пример отсюда:...

Свой Launcher. Срабатывает кнопка "назад" - Программирование Android
Здравствуйте! -Пишу свой простенький Laucher(во многом опирался на этот пример). -Тестирую на телефоне(texet). -При загрузке...

Кнопка "Back" для приложения - Программирование Android
у меня есть несколько форм и мне необходима кнопка которая будет возвращать меня к предыдущей форме я не знаю как это сделать кто знает...

Системная кнопка "Назад" - Программирование Android
как научить программу реагировать на нажатие этой самой кнопки?

18
arvalon
21 / 6 / 2
Регистрация: 26.10.2012
Сообщений: 173
Записей в блоге: 1
17.05.2017, 18:52 #2
Создать Bundle, в него положить координаты (два float) и всё остальное, что нужно в карте, Bundle положить в Intent, стартовать Intent - MapActivity, там (в MapActivity) смотреть Intent на предмет нужных значений - достать их и вывести маркер на карте, например...
0
Mail-up
18 / 16 / 5
Регистрация: 07.01.2017
Сообщений: 138
17.05.2017, 22:36  [ТС] #3
В адаптере Recycler делаю вот так:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
BookViewHolder(View view) {
            super(view);
 
            title = (TextView) view.findViewById(R.id.title);
 
            author = (TextView) view.findViewById(R.id.author);
 
            title.setOnClickListener(this);
        }
 
        @Override
        public void onClick(View v) {
            Context context = v.getContext();
 
            LatLng mLongitude = new LatLng(55.028000, 55.028000 );
            LatLng mLatitude = new LatLng(26.539762, 26.539762);
 
            Bundle args = new Bundle();
 
            Intent i = new Intent(context, MapActivity.class);
            i.putExtra("longitude", mLongitude);
            i.putExtra("latitude", mLatitude);
            context.startActivity(i);
            Activity activity = (Activity) context;
            
            }
        }


а в активити принимаю вот так

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;
        Intent intent = getIntent();
        double mLongitude = intent.getExtras().getDouble("longitude");
        double mLatitude = intent.getExtras().getDouble("latitude");
 
 
        // Add a marker in Sydney, Australia, and move the camera.
        LatLng myCity = new LatLng(mLongitude, mLatitude);
        mMap.addMarker(new MarkerOptions().position(myCity).title("Город"));
        mMap.moveCamera(CameraUpdateFactory.newLatLng(myCity));
 
        //начальная позиция
        CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(myCity, 9);
        //анимация
        mMap.animateCamera(cameraUpdate);
        //тип карты
        mMap.setMapType(GoogleMap.MAP_TYPE_TERRAIN);
        //zoom
        googleMap.getUiSettings().setZoomControlsEnabled(true);
    }

и не работает(((
0
arvalon
21 / 6 / 2
Регистрация: 26.10.2012
Сообщений: 173
Записей в блоге: 1
17.05.2017, 22:49 #4
Цитата Сообщение от Mail-up Посмотреть сообщение
Java
1
2
LatLng mLongitude = new LatLng(55.028000, 55.028000 );
LatLng mLatitude = new LatLng(26.539762, 26.539762);
Тут что-то напутано. Объект LatLng уже соделжит оба параметра - широту и долготу. Два раза одно и тоже не надо.

Цитата Сообщение от Mail-up Посмотреть сообщение
Java
1
2
i.putExtra("longitude", mLongitude);
i.putExtra("latitude", mLatitude);
А вообще забыл что у Intent'а уже есть Bundle для аргументов, и создавать свой уже не требуется
Цитата Сообщение от Mail-up Посмотреть сообщение
Java
1
Bundle args = new Bundle();
Тем более вы его так ничем и не наполнили и в Intent не прикрепили. Можете удалить её.

Захардкодьте для начала какие-нибудь координаты
Цитата Сообщение от Mail-up Посмотреть сообщение
Java
1
2
3
4
Intent i = new Intent(context, MapActivity.class);
i.putExtra("longitude", 37);
i.putExtra("latitude", 55);
startActivity(i);
И примите их в onMapReady, по идее уже должно запуститься.
0
Mail-up
18 / 16 / 5
Регистрация: 07.01.2017
Сообщений: 138
17.05.2017, 23:02  [ТС] #5
Да, спасибо, с таким кодом работает
Java
1
2
3
4
Intent i = new Intent(context, MapActivity.class);
            i.putExtra("longitude", 55.028000);
            i.putExtra("latitude", 29.539762);
            context.startActivity(i);
осталось создать показ по позиции
0
arvalon
21 / 6 / 2
Регистрация: 26.10.2012
Сообщений: 173
Записей в блоге: 1
17.05.2017, 23:19 #6
Теперь когда локализовали проблему осталось передавать разные координаты
Java
1
2
3
4
5
6
Intent intent = new Intent(this,null);
        intent.putExtra("lat",37);
        intent.putExtra("lat",55);
        LatLng myLat = new LatLng(37,55);
        intent.putExtra("myLat",myLat);
        startActivity(intent);
Проверил сечас себя, похоже что LatLng парселизуемый, т.е. его можно передать через extras. По крайней мерез IDE не ругается.
Т.е. можно и так и так, как по отдельности передать координаты и потом onMapReady собрать в LatLng, как и заранее LatLng положить в extras.
1
Mail-up
18 / 16 / 5
Регистрация: 07.01.2017
Сообщений: 138
17.05.2017, 23:38  [ТС] #7
Основной для меня вопрос как положить туда массив координат что бы выводило на карту по клику позиции.
я так понимаю мне нужно создать массив с координатами в MapActivity или отдельный класс и делать что то i.putExtra getAdapterPosition() ........
0
arvalon
21 / 6 / 2
Регистрация: 26.10.2012
Сообщений: 173
Записей в блоге: 1
18.05.2017, 00:00 #8
Цитата Сообщение от Mail-up Посмотреть сообщение
массив координат
Не очень понимаю, что в итоге надо передвать? Всего одну точку на карте, т.е. две координаты, или множество точек?

Вот, формально следуя тому что нужно, создаю в первой активити массив из 2 точек, передаю это в другую активити:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        LatLng point1 = new LatLng(1,2);
        LatLng point2 = new LatLng(3,4);
 
        LatLng[] coordArray = new LatLng[2];
        coordArray[0] = point1;
        coordArray[1] = point2;
 
        Intent intent = new Intent(this,SecondActivity.class);
        intent.putExtra("coordArray",coordArray);
        startActivity(intent);
 
    }
Принимаю во второй, вывожу в лог посмотреть что там получилось:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
 
        Intent intent = getIntent();
        Parcelable[] coordArray = intent.getParcelableArrayExtra("coordArray");
 
        for (Parcelable parcelable : coordArray) {
            LatLng point = (LatLng)parcelable;
            Log.d("coord",point.toString());
        }
 
    }
В логе заветная парочка точек:
Код
05-17 20:55:37.776 6272-6272/ru.arvalon.extrasformaps D/coord: lat/lng: (1.0,2.0)
05-17 20:55:37.776 6272-6272/ru.arvalon.extrasformaps D/coord: lat/lng: (3.0,4.0)
1
Mail-up
18 / 16 / 5
Регистрация: 07.01.2017
Сообщений: 138
18.05.2017, 17:58  [ТС] #9
Не могу "доехать" как это вывести не в Лог а на карту. Студия ругается.
0
arvalon
21 / 6 / 2
Регистрация: 26.10.2012
Сообщений: 173
Записей в блоге: 1
18.05.2017, 22:56 #10
Ну вот же ваш код выше - всё работало...
Java
1
mMap.addMarker(new MarkerOptions().position(myCity).title("Город"));
Цитата Сообщение от Mail-up Посмотреть сообщение
Студия ругается.
это очень расплывчатая формулировка...
0
Mail-up
18 / 16 / 5
Регистрация: 07.01.2017
Сообщений: 138
18.05.2017, 23:05  [ТС] #11
Понмаю что туплю дико, но у меня вот так пока((( что не правильно?

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;
        Intent intent = getIntent();
        Parcelable[] coordArray = intent.getParcelableArrayExtra("coordArray");
 
        for (Parcelable parcelable : coordArray) {
            LatLng point = (LatLng)parcelable;
        }
        LatLng myCity = new LatLng(mLongitude, mLatitude);
        mMap.addMarker(new MarkerOptions().position(myCity).title("Город"));
 
        mMap.addMarker(new MarkerOptions().position(myCity).title("Город"));
        mMap.moveCamera(CameraUpdateFactory.newLatLng(myCity));
 
        //начальная позиция
        CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(myCity, 9);
        //анимация
        mMap.animateCamera(cameraUpdate);
        //тип карты
        mMap.setMapType(GoogleMap.MAP_TYPE_TERRAIN);
        //zoom
        googleMap.getUiSettings().setZoomControlsEnabled(true);
    }
0
arvalon
21 / 6 / 2
Регистрация: 26.10.2012
Сообщений: 173
Записей в блоге: 1
18.05.2017, 23:21 #12
Так, всё смешалось.
Сколько элементов в массив кладёте? Если надо передать только ОДНУ точку, массив устраивать не надо. Просто в extas положить один объект LatLng и принять его во второй активити. Или два числа положить в extas, вытащить их во второй активити, собрать LantLng и передать в маркер.
Сейчас же вы в цикле
Цитата Сообщение от Mail-up Посмотреть сообщение
for (Parcelable parcelable : coordArray)
{ LatLng point = (LatLng)parcelable; }
в итоге присваиваете объекту point последний элемент массива. Но если он не пустой, пусть состоящий даже из одного элемента, далее должно сработать.
Что в логах слудии, какая ошибка, чем гадать? Телепатов тут нет...
1
Mail-up
18 / 16 / 5
Регистрация: 07.01.2017
Сообщений: 138
18.05.2017, 23:32  [ТС] #13
короче по порядку: создаю массив таким образом, в него кладу координаты. ТОчек пока 2, далее будет больше.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Override
        public void onClick(View v) {
            Context context = v.getContext();
 
            LatLng point1 = new LatLng(55.507124, 38.681376); //первый адрес
            LatLng point2 = new LatLng(55.507124, 38.681376); // второй адрес
 
            LatLng[] coordArray = new LatLng[2];
            coordArray[0] = point1;
            coordArray[1] = point2;
 
 
            Intent i = new Intent(context, MapActivity.class);
            i.putExtra("coordArray",coordArray);
            context.startActivity(i);

а вот так принимаю, точнее пытаюсь принять))))

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
 MapActivity extends AppCompatActivity implements OnMapReadyCallback {
 
    private GoogleMap mMap;
    Toolbar toolbar;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_map);
        toolbar = (Toolbar)findViewById(R.id.toolbar_av_2);
        setSupportActionBar(toolbar);
        if (getSupportActionBar() != null){
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
            getSupportActionBar().setDisplayShowHomeEnabled(true);
        }
        toolbar.setTitleTextColor(Color.parseColor("#FFFFFF"));
        getSupportActionBar().setTitle("Карта");
        final Drawable upArrow = getResources().getDrawable(R.drawable.ic_menu_arrow);
        upArrow.setColorFilter(Color.parseColor("#FFFFFF"), PorterDuff.Mode.SRC_ATOP);
        getSupportActionBar().setHomeAsUpIndicator(upArrow);
 
 
        SupportMapFragment mapFragment =
                (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
 
    }
 
 
 
 
    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;
        Intent intent = getIntent();
        Parcelable[] coordArray = intent.getParcelableArrayExtra("coordArray");
 
        for (Parcelable parcelable : coordArray)
        { LatLng point = (LatLng)parcelable; }
 
        // Add a marker in Sydney, Australia, and move the camera.
 
        LatLng myCity = new LatLng(point);
        mMap.addMarker(new MarkerOptions().position(myCity).title("Город"));
        mMap.moveCamera(CameraUpdateFactory.newLatLng(myCity));
 
        //начальная позиция
        CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(myCity, 9);
        //анимация
        mMap.animateCamera(cameraUpdate);
        //тип карты
        mMap.setMapType(GoogleMap.MAP_TYPE_TERRAIN);
        //zoom
        googleMap.getUiSettings().setZoomControlsEnabled(true);
    }
 
 
    @Override
    public boolean onSupportNavigateUp() {
        onBackPressed();
        this.finish();
        return true;
    }
 
    @Override
    public void onBackPressed() {
        this.finish();
        overridePendingTransition(R.anim.close,R.anim.closein);
    }

Студия подчеркивает вот эту строчку
LatLng myCity = new LatLng(point); в частности point
0
arvalon
21 / 6 / 2
Регистрация: 26.10.2012
Сообщений: 173
Записей в блоге: 1
18.05.2017, 23:36 #14
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Вот так:
Java
1
mMap.addMarker(new MarkerOptions().position(point).title("Город"));
СРАЗУ передайте point в конструктор маркета!
А строчка 44
Java
1
LatLng myCity = new LatLng(point);
уже не нужна
0
Mail-up
18 / 16 / 5
Регистрация: 07.01.2017
Сообщений: 138
18.05.2017, 23:43  [ТС] #15
Вот так заработало но с одним нюансом
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;
        Intent intent = getIntent();
        Parcelable[] coordArray = intent.getParcelableArrayExtra("coordArray");
 
        for (Parcelable parcelable : coordArray)
        { LatLng point = (LatLng)parcelable;
            
        mMap.addMarker(new MarkerOptions().position(point).title("Город"));
        mMap.moveCamera(CameraUpdateFactory.newLatLng(point));
            
        //начальная позиция
        CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(point, 9);
        //анимация
        mMap.animateCamera(cameraUpdate);
        //тип карты
        mMap.setMapType(GoogleMap.MAP_TYPE_TERRAIN);
        //zoom
        googleMap.getUiSettings().setZoomControlsEnabled(true);}
    }
Отрабатывается только последняя точка
по скольку дело обстоит в RecyclerView , я то я так понимаю надо привязать еще getAdapterPosition?
0
18.05.2017, 23:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.05.2017, 23:43
Привет! Вот еще темы с ответами:

Не работает кнопка "Home" - Программирование Android
Здравствуйте. Аппаратные кнопки можно обрабатывать через KeyEvent например так @Override public boolean onKeyDown(int...

Таймер. Кнопка "Пауза" - Программирование Android
Вобщем, решил попробовать сделать таймер, нашел статью, вроде все получилось, но есть одно НО. Таймер тикает, нажимаю на стоп,...

Работа с БД, связывание таблиц "фильмы", "жанры", "режиссеры" - Программирование Android
Ребят, всем привет! накидайте какие-нить идеи по реализации ситуация такая есть таблицы - "списки_жанров", "фильмы", "режиссеры" мне...

Ошибка "Unknown method "e" of "org.apache.commons.logging.Log" - Программирование Android
Unknown method 'e' of 'org.apache.commons.logging.Log' package com.mycompany.myapp; import android.widget.*; import...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru