【问题标题】:get other values from marker从标记中获取其他值
【发布时间】:2013-03-11 08:23:48
【问题描述】:

我被这个问题困住了,我希望有人能引导我找到解决方案,到目前为止我已经花了 3 天时间..

问题

我有 2 个活动,活动 A 是从 JSON 列表填充的列表视图。 Activity B 是基于相同 json 列表的 Google maps v2,但它在 Map 上而不是在列表上。

在活动 A 列表中有onItemclicklistener,当我点击它时,它会显示另一个活动并且它工作正常。这里没问题。一切正常。

在活动B上有地图片段,它也填充了来自 JSON 列表的 lat-lng 值。所以地图上有10个+标记。因此,当我单击标记时,我会得到名称和地址,并且它也可以正常工作。

这就是我想要的

当我点击列表中的项目时,它会将我带到活动 C。并且有一些文本视图可以显示公司营业的日期。这一步完成了,它工作正常,一切都像它应该的那样。

当我点击地图时,有标记,所以我有onInfoWindowClick()。这也很好,但我怎样才能从onInfoWindowClick() 获得更多价值?

我的意思是,我可以得到(getSnippet 和 getTitle from marker)但我在列表中有其他值,比如姓名、日期、id。我得到的只是 .getsn-p 和 getTitle 通过标记。

我非常纠结这个问题。 我真的很想在名单上做同样的事情。当我按下列表时,它会获取所有值,但是当我在地图上时,我只能获得带有标题和片段的标记窗口。对不起,如果我不能很好地解释,请随时问我是否有更多你想看的代码。

                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(); 
}

更新代码

    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);  
}


    }

【问题讨论】:

    标签: android marker


    【解决方案1】:

    你不能再向标记添加数据,除非你都把它放在sn-p中。

    因此,如果您想向标记添加更多数据,则必须将其存储在与标记链接的外部变量中。

    Each made marker has an unique ID.

    您可以使用此信息将映射到此 ID 的任何其他数据保存在单独的变量中。

    示例:

    创建一个您可以访问的变量:

     /**
      * Create your variable where you store all your data mapped to the marker ID, 
      * make it accessible where you want.
      * The key of this hashmap is your marker ID, the value is another Map with extra data
      */
     HashMap<String, HashMap> extraMarkerInfo = new HashMap<String, HashMap>();
    

    选项 1 更改标记代码,以便向此变量添加额外数据

    for (HashMap<String, String> hashMap : contactList) {
         // Create your marker like normal, nothing changes
         Marker marker = 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)));
    
         // When you created the marker you store the extra data from your JSON in another variable (HashMap for example)
         HashMap<String, String> data = new HashMap<String, String>();
    
         data.put(TAG_Location,hashMap.get(TAG_Location));
         data.put(TAG_Company,hashMap.get(TAG_Company));
         data.put(TAG_PLACE,hashMap.get(TAG_PLACE));
         data.put(TAG_POSTAL,hashMap.get(TAG_POSTAL));
         data.put(TAG_CITY,hashMap.get(TAG_CITY));
         data.put(TAG_MONDAY,hashMap.get(TAG_MONDAY));
         data.put(TAG_TUESDAY,hashMap.get(TAG_TUESDAY));
         data.put(TAG_WEDNESDAY,hashMap.get(TAG_WEDNESDAY));
         data.put(TAG_THURSDAY,hashMap.get(TAG_THURSDAY));
         data.put(TAG_FRIDAY,hashMap.get(TAG_FRIDAY));
         data.put(TAG_SATURDAY,hashMap.get(TAG_SATURDAY));
         data.put(TAG_SUNDAY,hashMap.get(TAG_SUNDAY));
         data.put(TAG_TYPE,hashMap.get(TAG_TYPE));
         data.put(TAG_NOCAR,hashMap.get(TAG_NOCAR));
    
         // Save this marker data in your previously made HashMap mapped to the marker ID. So you can get it back based on the marker ID
         extraMarkerInfo.put(marker.getId(),data);
    
    }
    

    EASY OPTION 2 只需将整个地图保存在外部变量中

    for (HashMap<String, String> hashMap : contactList) {
         // Create your marker like normal, nothing changes
         Marker marker = 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)));
    
         // Just save the entire json hashmap into the external variable
         extraMarkerInfo.put(marker.getId(),hashMap);
    
    }
    

    现在您可以随时访问该 extraMarkerInfo,您可以使用 getID() 知道标记 ID。

    @Override
    public void onInfoWindowClick(Marker marker) {
    
        String title = marker.getTitle();
        String snippet = marker.getSnippet(); 
    
        // Get extra data with marker ID
        HashMap<String, String> marker_data = extraMarkerInfo.get(marker.getId());
    
        // Getting the data from Map
        String location = marker_data.get(TAG_Location);
        String company = marker_data.get(TAG_Company);
        String place = marker_data.get(TAG_PLACE);
        //.. etc etc
    }
    

    这只是一个使用 HashMaps 的小例子,但您可以使用任何您喜欢的不同解决方案。

    【讨论】:

    • 是的,但我有一个来自 JSON 的列表,所有数据都已经在哈希图中。您的示例是带有自添加值的标记,但我已经在 hashmap 上有了它,我如何将它添加到标记中?
    • 我想你不明白我的意思。再次阅读整个答案。您不要将其添加到标记中,但不能。但是您可以将它映射到其他东西并使用标记 ID 作为键。您从 JSON 中获取额外数据,而不是将其放入标记中。将其放入外部变量中,并将标记 ID 作为键,将所有额外数据作为值。
    • 肯定对你很有帮助。我只是为你提供了完整的代码,这样你会更容易理解我的意思。
    • 我非常感谢你,它很容易粘贴,但很难理解如何获取数据。我能理解你做了什么,从哈希图中获取所有数据。对于 ,将其放入新的哈希图中,以 Tag_ 为值,键为结果。再次感谢您提供的最佳解释。
    • 没问题,重要的是你明白发生了什么;)祝你好运!
    【解决方案2】:

    这样做的一个非常好的和简单的方法是 - 每当您向地图添加标记时,请以 HashMap&lt;Marker, &lt;WhateverDataYouNeed&gt; extraMarkerData 之类的方式引用它

    然后,当您想要它的数据时,您所要做的就是调用extraMarkerData.get(&lt;yourMarker&gt;) 来返回它。简单。

    感谢这位编写教程的好心人,我发现它对于我需要的东西来说非常广泛,但它提供了简单的想法:

    http://bon-app-etit.blogspot.be/2012/12/add-informationobject-to-marker-in.html

    我的额外数据如下所示:

    private HashMap<Marker,HashMap<String,String>> markerUserData;
    

    然后,每当我向地图添加标记时,我都会确保使用标记作为键来引用其数据

    Marker marker = map.addMarker(new MarkerOptions()
            .position(new LatLng(<lat>,<lng>)
            .title(<markerTitle>)
            .snippet(<markerSnippet>)
    );
    
    markerUserData.put(marker,<myExtraMarkerDataHashMap>);    //add reference to marker data
    

    因为我有自己的班级来处理OnInfoWindowClickListener,所以我创建了一个公共 getter

    public HashMap<String,String> getDataforMarker(Marker marker){
        return extraMarkerData.get(marker);
    }
    

    OnInfoWindowClickListener:

    @Override
    public void onInfoWindowClick(Marker marker) {
        Log.i("SFCT","Data for marker = "+activity.getDataforMarker(marker));
    }
    

    【讨论】:

      【解决方案3】:

      我想您必须有一个列表,其中包含您在 MapActivity 的 ListAcivity 中也拥有的所有信息。当用户单击标记时,您会在列表中查找该特定对象(我猜是联系人)并获取所需的其余信息。

      【讨论】:

        【解决方案4】:
        @Override
            public boolean onMarkerClick(Marker marker) {
                // TODO Auto-generated method stub
                String selected_marker=marker.getTitle();
                return false;
            }
        

        然后您可以根据单击的标记(您想要的操作)来工作。在这里你知道点击了哪个标记...

        【讨论】:

          猜你喜欢
          • 2018-07-16
          • 2022-12-05
          • 1970-01-01
          • 2022-01-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多