Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
Mail-up
30 / 28 / 8
Регистрация: 07.01.2017
Сообщений: 205
#1

Кнопка "Показать на карте" и MapActivity

17.05.2017, 18:15. Просмотров 944. Ответов 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
Ответы с готовыми решениями:

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

Кнопка "Стереть данные", как от нее защититься?
В настройках приложения есть кнопка "Стереть данные", она удаляет все данные (в...

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

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

Кнопка "Back" для приложения
у меня есть несколько форм и мне необходима кнопка которая будет возвращать...

18
arvalon
21 / 6 / 2
Регистрация: 26.10.2012
Сообщений: 183
Записей в блоге: 1
17.05.2017, 18:52 #2
Создать Bundle, в него положить координаты (два float) и всё остальное, что нужно в карте, Bundle положить в Intent, стартовать Intent - MapActivity, там (в MapActivity) смотреть Intent на предмет нужных значений - достать их и вывести маркер на карте, например...
0
Mail-up
30 / 28 / 8
Регистрация: 07.01.2017
Сообщений: 205
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
Сообщений: 183
Записей в блоге: 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
30 / 28 / 8
Регистрация: 07.01.2017
Сообщений: 205
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
Сообщений: 183
Записей в блоге: 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
30 / 28 / 8
Регистрация: 07.01.2017
Сообщений: 205
17.05.2017, 23:38  [ТС] #7
Основной для меня вопрос как положить туда массив координат что бы выводило на карту по клику позиции.
я так понимаю мне нужно создать массив с координатами в MapActivity или отдельный класс и делать что то i.putExtra getAdapterPosition() ........
0
arvalon
21 / 6 / 2
Регистрация: 26.10.2012
Сообщений: 183
Записей в блоге: 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
30 / 28 / 8
Регистрация: 07.01.2017
Сообщений: 205
18.05.2017, 17:58  [ТС] #9
Не могу "доехать" как это вывести не в Лог а на карту. Студия ругается.
0
arvalon
21 / 6 / 2
Регистрация: 26.10.2012
Сообщений: 183
Записей в блоге: 1
18.05.2017, 22:56 #10
Ну вот же ваш код выше - всё работало...
Java
1
mMap.addMarker(new MarkerOptions().position(myCity).title("Город"));
Цитата Сообщение от Mail-up Посмотреть сообщение
Студия ругается.
это очень расплывчатая формулировка...
0
Mail-up
30 / 28 / 8
Регистрация: 07.01.2017
Сообщений: 205
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
Сообщений: 183
Записей в блоге: 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
30 / 28 / 8
Регистрация: 07.01.2017
Сообщений: 205
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
Сообщений: 183
Записей в блоге: 1
18.05.2017, 23:36 #14
Лучший ответ Сообщение было отмечено Mail-up как решение

Решение

Вот так:
Java
1
mMap.addMarker(new MarkerOptions().position(point).title("Город"));
СРАЗУ передайте point в конструктор маркета!
А строчка 44
Java
1
LatLng myCity = new LatLng(point);
уже не нужна
0
Mail-up
30 / 28 / 8
Регистрация: 07.01.2017
Сообщений: 205
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
arvalon
21 / 6 / 2
Регистрация: 26.10.2012
Сообщений: 183
Записей в блоге: 1
18.05.2017, 23:48 #16
Цитата Сообщение от Mail-up Посмотреть сообщение
по скольку дело обстоит в RecyclerView
Так, ну это уже совсем другая история, не к картам относящаяся. С другой стороны всей этой истории. Стоит заводить новую тему.
И если нет понимания как работают списки и адаптеры к ним стоит, хоть это и откат назад, начать с простого ListView для какой-нибудь простой коллекции List, и без холдера. Что бы пришло понимание что делает BaseAdapter, какие методы и зачем в нём надо оверрайдить, что вообще происходит в getView
1
Mail-up
30 / 28 / 8
Регистрация: 07.01.2017
Сообщений: 205
19.05.2017, 10:04  [ТС] #17
У меня построен список RV во фрагменте, все действие происходит понятно в адаптере. и в принципе меня пуТает только то, что это карты.
Делал точно так же только с текстом , я делал немного иначе.
Создал класс +implmnts serializeble там кидал то , что мне надо, getAdapterPosition а потом выдёргивал нужные позиции и значения через Bundle , все прекрасно работает включая поиск с сохранением позиции. Тут немного по другому, вот пока разбираюсь. С другой стороны можно просто сделать фрагмент с картами и поместить его во вьюПейджер, но хочется сделать так , как задумал)))) В Любом случае спасибо за помощь, вы отлично обьясняете, и многое стало понятным благодаря именно вашим ответам. Но пока копаю до истины))))

Добавлено через 10 часов 3 минуты
А как поступить если по нажатию я хочу бросить не только координаты а "весь набор" то есть описание и подпись?
0
arvalon
21 / 6 / 2
Регистрация: 26.10.2012
Сообщений: 183
Записей в блоге: 1
19.05.2017, 23:38 #18
Цитата Сообщение от Mail-up Посмотреть сообщение
А как поступить если по нажатию я хочу бросить не только координаты а "весь набор" то есть описание и подпись?
В intent можно положить сколько угодно разных extras'ов. Т.е. после координат, допустим, добавляю туда какое-нибудь число. А потом ещё текст. Только имена разные давайте им:
Java
1
2
intent.putExtra("float",5.6);
intent.putExtra("string","qwerty");
Много ещё что можно положить в intent-extras...
1
Миниатюры
Кнопка "Показать на карте" и MapActivity  
Mail-up
30 / 28 / 8
Регистрация: 07.01.2017
Сообщений: 205
21.05.2017, 09:54  [ТС] #19
Не знаю насколько закостылил, но по итогу сделал таким образом:
В своем классе с магазинами добавил строку implements Serializable и добавил свои данные

Java
1
2
3
4
private double Lttd;
    
private double Long;
private String titleMap;
с конструктором, блэкДжеком и женщинами
соответственно добавил данные в RV только не отбражал их.


ну и потом в адаптере сделал на view (показать на карте) клик такого плана
Java
1
2
3
4
5
6
7
 Context context = v.getContext();
            Intent i;
            i = new Intent(context, MapActivity.class);
            i.putExtra("pos1", autoList.get(getAdapterPosition()).getLong());
            i.putExtra("pos2", autoList.get(getAdapterPosition()).getLttd());
            i.putExtra("pos3", autoList.get(getAdapterPosition()).getTitleMap());
            context.startActivity(i);

и поймал таким образом

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
mMap = googleMap;
 
        Bundle bundle = getIntent().getExtras();
 
        String markerText = bundle.getString("pos3");
        Double lat = bundle.getDouble("pos1");
        Double latt = bundle.getDouble("pos2");
        LatLng position2 = new LatLng(lat, latt);
      
//add marker
        assert markerText != null;
        mMap.addMarker(new MarkerOptions().position(position2).
                title(markerText).snippet(markerText));
0
21.05.2017, 09:54
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.05.2017, 09:54

Не работает кнопка "Home"
Здравствуйте. Аппаратные кнопки можно обрабатывать через KeyEvent например так ...

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

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


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

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

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