Android谷歌地图V2 - 在多个标记上实现OnInfoWindowClick功能

5

我有一段代码可以让一个标记在单击信息窗口时启动一个活动。它完全正常运行。但是当我尝试添加另一个标记和另一个@override时,它总是在所有标记的信息窗口中打开最后一个类。因此,实质上,所有标记的信息窗口在单击时都打开相同的活动,而不是打开我打算打开的单独类。

以下是成功打开1个InfoWindowClicked活动的代码。我称之为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 代码。

确保在代码中的某个地方也有(通常在一个私有的 void 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);
        }  });
}}


}

Edit (07/06/2013):

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){" 下。没有错误,当我调试时,我可以看到标记,但无法单击 InfoWindow。警告信息如下:

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

我在类级别上看到了这个警告两次,在公共void onInfoWindowClick中的单词'Class'上也看到了一次。我尝试了一些不同的方法,比如“为'Class'添加类型参数”,但它没有起作用。在公共void中的Marker marker上,我将marker更改为marker1,并在下面的行allMarkersMap.get(marker);中将(marker)更改为(marker1),只是为了尝试一下,但它没有起作用。还有其他什么我可以做来尝试初始化onInfoWindowClick函数吗?


你是否像原始代码中一样注册了 OnInfoWindowClickListener - MaciejGórski
是的,我已经把OnInfoWindowClickListener放在了顶部的'MainActivity extends Activity implements'中。我尝试过在public void onInfoWindowClick(Marker marker)上方加上和不加@Override。我不知道为什么它没有注册。我已经像原来一样取出了googlemap.setOnInfoWindowClickListener(new OnInfoWindowClickListener() {。 - user1977908
而调用 googlemap.setOnInfoWindowClickListener(this); 呢? - MaciejGórski
好的,它正在工作!让我再试着添加几个! - user1977908
它适用于1个标记,但当我尝试添加两个标记时,我的地图实际上无法加载。我遇到了AndroidRuntime错误,包括.handleLaunchActivity和IBitmapDescriptorFactory未初始化。致命异常:主要的。 - user1977908
显示剩余2条评论
3个回答

8

以下是MaciejGórski在此处提供的示例,演示如何在单击GoogleMapsV2上的不同标记infowindows时打开不同的类(活动,例如页面):

在GoogleMap类级别中添加以下内容:

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

在受保护的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,以输入您想要的类,这样它就能打开您想要的内容。将public void OnInfoWindowClick的代码放在某个标记下面,这是回调。
就是这样。当您单击标记中的InfoWindows时,它们应该会打开您在MarkerOptions代码中放置的活动类!
此技术来自MaciejGórski

2
您不需要多次调用googlemap.setOnInfoWindowClickListener(this)。 - MaciejGórski

1

setOnInfoWindowClickListener中,set这个词的意思是它会覆盖之前所设置的任何值。此函数被调用于GoogleMap对象上,因为只有一个GoogleMap对象,所以只有一个激活的OnInfoWindowClickListener

你可以通过使用回调函数onInfoWindowClick(Marker marker)中的参数来决定发生什么,可以使用if elseswitch或者Map<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);

Edit:

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

感谢您的帮助,MaciejGórski!我尝试实现了您给我的代码,但出现了一些错误。您能否看一下我在上面编辑过的问题并检查我所更改的代码?如果您有时间,请帮帮我。 - user1977908
@user1977908 我代码中的 map 不是 GoogleMap 类型,而是 Map<Marker, Class> 或者 HashMap<Marker, Class>。在创建标记时,你需要创建它并将所有标记放入其中。 - MaciejGórski
嗨,MaciejGorski,它一直说无法解析地图。请你能否给我展示一个例子,那真的会很有帮助。 - user1977908
再次感谢您的帮助MaciejGorski,您真是个传奇!我已经实现了代码,没有错误,只有一些警告。但是当我点击信息窗口时,什么也没有发生。现在就是最后冲刺,我们非常接近了!我将编辑我的问题并附上代码,请在方便时最后检查一下。 - user1977908

0

针对问题:

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

我在Class:旁边添加了< ? >

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接