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

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

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

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

http://www.cyberforum.ru/android-dev/thread1533360.html
Карту сделал, правда пока во фрагменте, фрагмент поместил в 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):

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

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

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

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

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

18
arvalon
21 / 6 / 2
Регистрация: 26.10.2012
Сообщений: 179
Записей в блоге: 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
Сообщений: 179
Записей в блоге: 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
Сообщений: 179
Записей в блоге: 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
Сообщений: 179
Записей в блоге: 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
Сообщений: 179
Записей в блоге: 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
Сообщений: 179
Записей в блоге: 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
Сообщений: 179
Записей в блоге: 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
Сообщений: 179
Записей в блоге: 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
Сообщений: 179
Записей в блоге: 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
Привет! Вот еще темы с решениями:

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

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

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

Ошибка "Unknown method "e" of "org.apache.commons.logging.Log"
Unknown method 'e' of 'org.apache.commons.logging.Log' package...


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

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

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