【问题标题】:Android Google Maps V2 - OnInfoWindowClick on several markersAndroid Google Maps V2 - OnInfoWindow点击几个标记
【发布时间】:2013-05-28 22:25:53
【问题描述】:

当您单击信息窗口时,我有代码可以让一个标记开始一项活动。它工作得很好。但是当我尝试添加另一个标记和另一个@override 时,它​​总是会在所有标记信息窗口上打开最后一个类。因此,本质上,所有标记信息窗口在单击时都会打开相同的活动,而不是打开我想要打开的单独类。

这是成功打开 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 代码。

确保代码中的某处也存在(通常在私有 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);
        }  });
}}


}

编辑 (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) {”下。没有错误,当我调试时我可以看到标记但无法单击信息窗口。警告是:

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

我在类级别看到此警告两次,一次在公共 void onInfoWindow 中单击单词 'Class'。我尝试了一些不同的方法,例如“将类型参数添加到 'Class' 但它不起作用。在公共无效的 Marker marker 上,我将 ma​​rker 更改为 ma​​rker1 并在 allMarkersMap.get(marker); 下的行将 (marker) 更改为 (marker1) 只是为了尝试了,但没有成功。我还能做些什么来尝试初始化 onInfoWindowClick 函数?

【问题讨论】:

  • 你注册OnInfoWindowClickListener和原码一样吗?
  • 是的,我有。我已将 OnInfoWindowClickListener 放入顶部的“MainActivity 扩展 Activity 实现”中。我已经尝试了 public void onInfoWindowClick(Marker marker) 上面有和没有@Override 。我不知道为什么它没有注册。我已经取出了 googlemap.setOnInfoWindowClickListener(new OnInfoWindowClickListener() { 就像原来的一样。
  • 然后打电话给googlemap.setOnInfoWindowClickListener(this);?
  • 好的,它的工作!让我尝试添加更多!
  • 它适用于 1 个标记,当我尝试添加两个标记时,我的地图实际上不再加载。我收到 AndroidRuntime 错误,包括 .handleLaunchActivity 和 IBitmapDescriptorFactory 未初始化。致命异常:主要。

标签: android maps


【解决方案1】:

来自 MaciejGórski 的帮助是当您在 GoogleMapsV2 上单击单独的标记信息窗口时打开不同的类(活动,例如页面)的示例:

将此添加到您的 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

【讨论】:

  • 你不需要调用 googlemap.setOnInfoWindowClickListener(this);多次。
【解决方案2】:

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

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

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

【讨论】:

  • 感谢您的帮助 MaciejGórski!,我已尝试实现您给我的代码,但出现了一些错误,您能否看看我对上述问题所做的编辑和仔细查看我更改的代码。如果你有时间请帮帮我
  • @user1977908 map 在我的代码中不是GoogleMap 类,而是Map&lt;Marker, Class&gt;HashMap&lt;Marker, Class&gt;。您需要创建它并在创建它们时将所有标记放在那里。
  • 嗨,MaciejGorski,它一直说地图无法解析。请你给我举个例子,这真的很有帮助
  • 再次感谢您的帮助 MaciejGorski,您是一个壁架!我已经实现了代码并且没有错误,只有一些警告。但是当我点击信息窗口时,什么也没有发生。现在真的是回家的路,我们是如此接近!我将用代码编辑我的问题,请在可以的时候再看一下
【解决方案3】:

针对问题:

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

我添加 类旁边:

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

【讨论】:

    猜你喜欢
    • 2014-01-20
    • 1970-01-01
    • 1970-01-01
    • 2012-12-22
    • 2013-05-05
    • 2013-06-14
    • 1970-01-01
    • 1970-01-01
    • 2013-03-07
    相关资源
    最近更新 更多