I'm stuck with this problem and I hope someone can lead me to a solution, I have spent 3 days on it until now..
The Problem
I have 2 activities, activity A is a listview populated from a JSON list. Activity B is Google maps v2 based with the same json list but its on Map not on list.
on activity A list there is onItemclicklistener
and when I click on it shows another activity and its works fine. no problem here. everything works like is supposed too.
on Activity B there is map fragment, and it's filled with lat-lng values from a JSON list too. So there is 10 +markers on map. So when I click on marker, I am getting the name and address and its working fine too.
This what I Want
When I clicking the item on list it taking me to activity C. and there are some textviews to show which days the company are open. this step is done, its working fine and everything like it supposed too.
When I click on Map, there are markers, So I have onInfoWindowClick()
. It's fine too but how i can get more values from the onInfoWindowClick()
?
What i mean is, i can get (getSnippet and getTitle from marker) But I have other values in the list, like name, days, id's. this what i getting is only .getsnippet and getTitle through the marker.
I am very stuck with this issue. I really want to do the same like on the List. When I press on list its getting all values but when iam on Maps i can only get marker window with Title and Snippet. Iam sorry if I couldnt explain good, pls feel free to ask me if there is more code you want too see.
for (HashMap<String, String> hashMap : contactList) {
map.addMarker(new MarkerOptions()
.position(new LatLng(Double.valueOf(hashMap.get(TAG_LAT)) , Double.valueOf(hashMap.get(TAG_LNG))))
.title(hashMap.get(TAG_ADDRESS))
.snippet(hashMap.get(TAG_NAME)) );
@Override
public void onInfoWindowClick(Marker marker) {
marker.getTitle();
marker.getSnippet();
}
UPDATED CODE
public class MapBased extends AbstractMapActivity implements OnNavigationListener,OnInfoWindowClickListener
{
private static final String TAG_Location = "location_id";
private static final String TAG_Company = "company_id";
private static final String TAG_PLACE = "place";
private static final String TAG_POSTAL = "postal";
private static final String TAG_CITY = "city";
private static final String TAG_MONDAY = "monday";
private static final String TAG_TUESDAY = "tuesday";
private static final String TAG_WEDNESDAY = "wednesday";
private static final String TAG_THURSDAY = "thursday";
private static final String TAG_FRIDAY = "friday";
private static final String TAG_SATURDAY = "saturday";
private static final String TAG_SUNDAY = "sunday";
private static final String TAG_TYPE = "type";
private static final String TAG_NOCAR = "nocar";
private static final String TAG_NAME = "name";
private static final String TAG_LAT = "lat";
private static final String TAG_LNG = "lng";
private static final String TAG_ADDRESS = "address";
private static final String TAG = "Debug of Project"; //
private String a;
private String b;
private double my_lat;
private double my_lng;
private static final String STATE_NAV="nav";
private static final int[] MAP_TYPE_NAMES= { R.string.normal, R.string.hybrid, R.string.satellite, R.string.terrain };
private static final int[] MAP_TYPES= { GoogleMap.MAP_TYPE_NORMAL, GoogleMap.MAP_TYPE_HYBRID, GoogleMap.MAP_TYPE_SATELLITE,
GoogleMap.MAP_TYPE_TERRAIN };
private GoogleMap map=null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SQLiteDatabase db = openOrCreateDatabase("mydb.db", Context.MODE_PRIVATE, null);
db.execSQL("CREATE TABLE IF NOT EXISTS gps_kordinater (ID INTEGER PRIMARY KEY AUTOINCREMENT, Latitude REAL, Longitude REAL);");
String query = "SELECT Latitude,Longitude FROM gps_kordinater WHERE Id = (SELECT MAX(Id) FROM gps_kordinater)";
Cursor cursor = db.rawQuery(query, null);
if(cursor != null)
{
cursor.moveToFirst();
a = cursor.getString(0);
b = cursor.getString(1);
}
String url = "http://example.com";
my_lat = Double.valueOf(a);
my_lng = Double.valueOf(b);
db.close();
// now enabled if disabled = ingen support for jb aka 4.0
if (android.os.Build.VERSION.SDK_INT > 9) {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}
ArrayList<HashMap<String, String>> contactList = new ArrayList<HashMap<String, String>>();
JSONParser jParser = new JSONParser();
JSONArray json = jParser.getJSONFromUrl(url);
try {
for(int i = 0; i < json.length(); i++){
JSONObject c = json.getJSONObject(i);
String lat = c.getString(TAG_LAT);
String lng = c.getString(TAG_LNG);
String name = c.getString(TAG_NAME);
String adresse = c.getString(TAG_ADDRESS);
String location_id = c.getString(TAG_Location);
String company_id = c.getString(TAG_Company);
String place = c.getString(TAG_PLACE) ;
String postal = c.getString(TAG_POSTAL);
String city = c.getString(TAG_CITY);
String monday = c.getString(TAG_MONDAY);
if(c.getString(TAG_MONDAY).isEmpty())
{
monday="Lukket";
}
else
{
monday=c.getString(TAG_MONDAY);
}
String tuesday = c.getString(TAG_TUESDAY);
if(c.getString(TAG_TUESDAY).isEmpty())
{
tuesday="Lukket";
}
else
{
tuesday=c.getString(TAG_TUESDAY);
}
String wednesday = c.getString(TAG_WEDNESDAY);
if(c.getString(TAG_WEDNESDAY).isEmpty())
{
wednesday="Lukket";
}
else
{
wednesday=c.getString(TAG_WEDNESDAY);
}
String thursday = c.getString(TAG_THURSDAY);
if(c.getString(TAG_THURSDAY).isEmpty())
{
thursday="Lukket";
}
else
{
thursday=c.getString(TAG_THURSDAY);
}
String friday = c.getString(TAG_FRIDAY);
if(c.getString(TAG_FRIDAY).isEmpty())
{
friday="Lukket";
}
else
{
friday=c.getString(TAG_FRIDAY);
}
String saturday = c.getString(TAG_SATURDAY);
if(c.getString(TAG_SATURDAY).isEmpty())
{
saturday="Lukket";
}
else
{
saturday=c.getString(TAG_SATURDAY);
}
String sunday=c.getString(TAG_SUNDAY);
if(c.getString(TAG_SUNDAY).isEmpty())
{
sunday="Lukket";
}
else
{
sunday=c.getString(TAG_SUNDAY);
}
String nocar = c.getString(TAG_NOCAR);
String type = c.getString(TAG_TYPE);
// creating new HashMap
HashMap<String, String> map2 = new HashMap<String, String>();
// adding each child node to HashMap key => value
map2.put(TAG_LAT, lat);
map2.put(TAG_LNG, lng);
map2.put(TAG_NAME, name);
map2.put(TAG_ADDRESS, adresse);
map2.put(TAG_Location, location_id);
map2.put(TAG_Company, company_id);
map2.put(TAG_PLACE, place);
map2.put(TAG_POSTAL, postal);
map2.put(TAG_CITY, city);
map2.put(TAG_MONDAY, monday);
map2.put(TAG_TUESDAY, tuesday);
map2.put(TAG_WEDNESDAY, wednesday);
map2.put(TAG_THURSDAY, thursday);
map2.put(TAG_FRIDAY, friday);
map2.put(TAG_SATURDAY, saturday);
map2.put(TAG_SUNDAY, sunday);
map2.put(TAG_TYPE, type);
map2.put(TAG_NOCAR, nocar);
// adding HashList to ArrayList
contactList.add(map2);
Log.d(TAG, "Hashmap 1: " + map2);
Log.d(TAG, "Hashmap 2: " + map2.values());
Log.d(TAG, "array 4: " + contactList);
}
Log.d(TAG, "array 5: " + contactList);
} catch (JSONException e) {
e.printStackTrace();
Log.e("JSON Parser", "Error parsing data " + e.toString());
}
if (readyToGo()) {
setContentView(R.layout.map_based);
SupportMapFragment mapFrag=
(SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map2);
initListNav();
map=mapFrag.getMap();
CameraUpdate center= CameraUpdateFactory.newLatLng(new LatLng(my_lat , my_lng));
CameraUpdate zoom=CameraUpdateFactory.zoomTo(10);
map.moveCamera(center);
map.animateCamera(zoom);
for (HashMap<String, String> hashMap : contactList) {
map.addMarker(new MarkerOptions()
.position(new LatLng(Double.valueOf(hashMap.get(TAG_LAT)) , Double.valueOf(hashMap.get(TAG_LNG))))
.title(hashMap.get(TAG_ADDRESS))
.snippet(hashMap.get(TAG_NAME))
);
}
map.setInfoWindowAdapter(new PopupMapBasedAdapter(getLayoutInflater()));
map.setOnInfoWindowClickListener(this);
}
Button btn_web = (Button) findViewById(R.id.footer_list_btn);
btn_web.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//myVib.vibrate(50);
finish();
}
});
}
@Override
public boolean onNavigationItemSelected(int itemPosition, long itemId) {
map.setMapType(MAP_TYPES[itemPosition]);
return(true);
}
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
savedInstanceState.putInt(STATE_NAV,getSupportActionBar().getSelectedNavigationIndex());
}
@Override
public void onInfoWindowClick(Marker marker) {
marker.getTitle();
marker.getSnippet();
}
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
getSupportActionBar().setSelectedNavigationItem(savedInstanceState.getInt(STATE_NAV));
}
private void initListNav() {
ArrayList<String> items=new ArrayList<String>();
ArrayAdapter<String> nav=null;
ActionBar bar=getSupportActionBar();
for (int type : MAP_TYPE_NAMES) {
items.add(getString(type));
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
nav=
new ArrayAdapter<String>(
bar.getThemedContext(),
android.R.layout.simple_spinner_item,
items);
}
else {
nav=
new ArrayAdapter<String>(
this,
android.R.layout.simple_spinner_item,
items);
}
nav.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
bar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
bar.setListNavigationCallbacks(nav, this);
}
}
You cannot add anymore data to the marker, unless you all put it in the snippet.
So if you want to add more data to your marker, you will have to store it in an external variable which is linked to your marker.
Each made marker has an unique ID.
You can use this information to save any additional data mapped to this ID in a separate variable.
Example:
Create a variable you can access:
OPTION 1 Change your marker code so you add extra data to this variable
EASY OPTION 2 Just save the entire map in the external variable
Now you can access that extraMarkerInfo whenever you want, you know the Marker id by using
getID()
.This is just a small example using HashMaps, but you can use different solutions whatever you prefer.
Then your can work based on Which marker is clicked(which operation you want). Here you know which marker is clicked...
I guess you have to have a list with all the info that you also have in your ListAcivity in the MapActivity. When a user clicks a marker, you look up that particular object (I guess it's contacts) in your list and get the rest of the info you need.
A really nice and easy way of doing this is - whenever you add a marker to your map, make a reference to it in something like
HashMap<Marker, <WhateverDataYouNeed> extraMarkerData
Then whenever you want its data, all you have to do is call
extraMarkerData.get(<yourMarker>)
to return it. simples.Thanks to this kind chap who wrote a tutorial, I found it to be quite extensive for what I needed but it provided the simple idea:
http://bon-app-etit.blogspot.be/2012/12/add-informationobject-to-marker-in.html
My extra data looks like this:
Then whenever I add a marker to my map, I make sure I make a reference to its data using the marker as a key
And since I have my own class to handle
OnInfoWindowClickListener
, I've made a public getterOnInfoWindowClickListener: