Android谷歌地图V2 - OnInfoWindow点击几个标记

时间:2013-06-02 17:31:44

标签: android maps

我有一个代码,当你点击infowindow时,让一个标记启动一个活动。它工作得非常好。但是当我尝试添加另一个标记和另一个@override时,它总是在所有Markers infowindows上打开最后一个类。因此,实质上所有标记infowindows在单击时打开相同的活动,而不是打开我打算使用的单独类。

以下代码在InfoWindowClicked上成功打开了1个活动。我称之为example.class,这适用于需要此示例的每个人

 public class MainActivity extends Activity implements OnInfoWindowClickListener {

 private GoogleMap googlemap;


 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);

if(isGooglePlay()){
setContentView(R.layout.activity_main);
setUpMap();

{    }    }


googlemap.addMarker(new MarkerOptions()
.position(new LatLng(0,-0))
.title("Title")
.snippet("Snippet")    
.icon(BitmapDescriptorFactory.fromResource(R.drawable.star)));
googlemap.setOnInfoWindowClickListener(new OnInfoWindowClickListener() {

@Override
public void onInfoWindowClick(Marker marker) {
 Intent intent = new Intent(MainActivity.this,Example.class);
 startActivity(intent);
          } });
{

所以 GoogleMap googlemap / mMap (或任何你称之为你的)和 @override void Oncreate (我的应用程序仅在GooglePlayServices可用时启动,你的应用程序可能不是像这样)你可以把标记和infowindowclick代码。

确保代码中的某处还有(通常在私有的空集setUpMap(){)

    googlemap = ((MapFragment)getFragmentManager().findFragmentById(R.id.map)).getMap();

现在下面是带有两个标记的代码,但是当它们被单击时它们都会打开example2.class。有人可以帮我解决这个问题,这样我就可以将它们分开并让它们打开不同的类吗?

 googlemap.addMarker(new MarkerOptions()
.position(new LatLng(0,-0))
.title("Title")
.snippet("Snippet")    
.icon(BitmapDescriptorFactory.fromResource(R.drawable.star)));
googlemap.setOnInfoWindowClickListener(new OnInfoWindowClickListener() {

@Override
public void onInfoWindowClick(Marker marker) {
 Intent intent = new Intent(MainActivity.this,Example.class);
 startActivity(intent);
          } });
{

      {
googlemap.addMarker(new MarkerOptions()
.position(new LatLng(  0, -0))
.title("Title")
.snippet("Snippet")
.icon(BitmapDescriptorFactory.fromResource(R.drawable.star)));
googlemap.setOnInfoWindowClickListener(new OnInfoWindowClickListener() {


@Override
public void onInfoWindowClick(Marker marker) {
Intent intent = new Intent(MainActivity.this,Example2.class);
startActivity(intent);
        }  });
}}


}

编辑(2013年6月7日):

private GoogleMap googlemap; 
private Map<Marker, Class> allMarkersMap = new HashMap<Marker, Class>();

以上是在班级^^^

 Marker marker1 = googlemap.addMarker(new MarkerOptions()
.position(new LatLng(0,0))
.title("England")
.snippet("London")    
.icon(BitmapDescriptorFactory.fromResource(R.drawable.star)));
allMarkersMap.put(marker1, Contact.class);

}

public void onInfoWindowClick(Marker marker) {
Class cls = allMarkersMap.get(marker);
Intent intent = new Intent(MainActivity.this, cls);
startActivity(intent);

}

以上^^^^在我的“protected void onCreate(Bundle savedInstanceState){”下。没有错误,当我调试时我可以看到Marker但无法点击InfoWindow。警告是:

Class is a raw type. References to generic type Class<T> should be parameterized    

我在课程级别上看到了这个警告两次,并且在公共虚空中看到了一次onInfoWindow点击了 'Class' 这个词。我尝试了一些不同的东西,比如“为'Class'添加类型参数但它不起作用。在公共空白中标记标记我将标记更改为< strong> marker1 并在 allMarkersMap.get(marker); 下面的行上将(标记)更改为(marker1)尝试但它没有用。我还能做些什么来尝试初始化onInfoWindowClick函数吗?

3 个答案:

答案 0 :(得分:8)

来自MaciejGórski的帮助是在GoogleMapsV2上点击单独的Marker infowindows时打开不同类(活动,例如页面)的示例:

在GoogleMap课程级别添加此内容:

private GoogleMap googlemap/mMap (or whatever you call yours); 
private Map<Marker, Class> allMarkersMap = new HashMap<Marker, Class>();

在protected void onCreate(Bundle savedInstanceState)下面{     super.onCreate(savedInstanceState); 放入你的标记:

    Marker marker = googlemap.addMarker(new MarkerOptions()
    .position(new LatLng(0,-0))
    .title("London")
    .snippet("North London")    
    .icon(BitmapDescriptorFactory.fromResource(R.drawable.star)));
    allMarkersMap.put(marker, NorthLondon.class);
    googlemap.setOnInfoWindowClickListener(this);



    Marker marker1 = googlemap.addMarker(new MarkerOptions()
    .position(new LatLng(0244534,-1232312))
    .title("USA")
    .snippet("Washington")    
    .icon(BitmapDescriptorFactory.fromResource(R.drawable.star)));
    allMarkersMap.put(marker1, Washington.class);
    googlemap.setOnInfoWindowClickListener(this);


    Marker marker2 = googlemap.addMarker(new MarkerOptions()
    .position(new LatLng(42343244,-0.334322))
    .title("Italy")
    .snippet("Rome"));
    allMarkersMap.put(marker2, Rome.class);
    googlemap.setOnInfoWindowClickListener(this);

    }

    public void onInfoWindowClick(Marker marker) {
    Class cls = allMarkersMap.get(marker);
    Intent intent = new Intent(MainActivity.this, cls);
    startActivity(intent);

}

以上是单独的标记。如果我要创建另一个,我会称之为Marker marker3,然后是4,5等...它在 allMarkersMap.put(marker,.class)中要求.class; 输入你的类想要,所以它打开你想要的东西。公共无效的OnInfoWindowClick代码下面的标记代码,这是回调。

就是这样。当您在标记中单击InfoWindows时,他们应该打开您在MarkerOptions代码中放置的活动类!

归功于MaciejGórski

答案 1 :(得分:1)

set中的setOnInfoWindowClickListener一词意味着它会覆盖之前set的任何值。此函数在GoogleMap对象上调用,因为有一个GoogleMap个对象,所以有一个OnInfoWindowClickListener处于活动状态。

使用它的方式是根据回调onInfoWindowClick(Marker marker)中使用if elseswitchMap<Marker, Class>的参数来决定会发生什么:

public void onInfoWindowClick(Marker marker) {
    Class cls = map.get(marker);
    Intent intent = new Intent(MainActivity.this, cls);
    startActivity(intent);
}

当然,您需要提前初始化此地图:

Marker marker1 = googlemap.addMarker...
map.put(marker1, Example.class);

修改

// on the class level:
private Map<Marker, Class> allMarkersMap = new HashMap<Marker, Class>();

// in the onCreate or elsewhere
Marker marker1 = googlemap.addMarker(new MarkerOptions()
    .position(new LatLng(0,-0))
    .title("Netherlands")
    .snippet("Amsterdam")    
    .icon(BitmapDescriptorFactory.fromResource(R.drawable.star)));
allMarkersMap.put(marker1, Example.class);

// callback
public void onInfoWindowClick(Marker marker) {
    Class cls = allMarkersMap.get(marker);
    Intent intent = new Intent(MainActivity.this, cls);
    startActivity(intent);
}

答案 2 :(得分:0)

问题:

Class is a raw type. References to generic type Class<T> should be parameterized  

我添加&lt; ? Class:

旁边的&gt;
private Map<Marker, Class<?>> allMarkersMap = new HashMap<Marker, Class<?>>();

Class<?> cls = allMarkersMap.get(marker);

如果您已经在片段课程中工作(就像发生在我身上一样),您将会改变:

public void onInfoWindowClick(Marker marker) {
    Class<?> cls = allMarkersMap.get(marker);
    Intent intent = new Intent(getActivity(), cls);
    startActivity(intent);
}