2013-06-02 146 views
4

我有一個代碼,當你點擊infowindow時,一個標記開始一個活動。它工作得很好。但是當我嘗試添加另一個標記和另一個@override時,它總是打開所有標記infowindows中的最後一個類。所以實質上,所有標記infowindows在點擊時都會打開相同的活動,而不是打開我打算使用的單獨的類。Android谷歌地圖V2 - 在幾個標記上的OnInfoWindowClick點擊

這是下面的代碼,成功地在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無效的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年7月6日):

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

} 

上面^^^ ^是在我的「保護無效onCreate(Bundle savedInstanceState){」。沒有錯誤,當我調試時,我可以看到標記但不能點擊InfoWindow。該警告是:

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

我兩次看到此警告的一流水平,並一度在字上「類」的公共無效onInfoWindowClick。我試着像「添加類型參數的‘類’一些不同的東西,但沒有奏效。在標記標記在公共無效我改變標記MARKER1和下面allMarkersMap行。得到(標記);改變(標記)(標誌1)只是嘗試,但它沒有工作還有什麼我可以做的嘗試和初始化onInfoWindowClick功能

+0

你有沒有註冊' OnInfoWindowClickListener'就像在原來的代碼? –

+0

是的,我有。我在頂部的'MainActivity extends Activity implements'中放入了OnInfoWindowClickListener。我已經嘗試了公共無效onInfoWindowClick(標記標記)與上面沒有@Override。我不知道爲什麼它不註冊。我已經取出了googlemap.setOnInfoWindowClickListener(新的OnInfoWindowClickListener(){和原來一樣)。 – user1977908

+0

並調用'googlemap.setOnInfoWindowClickListener(this);'? –

回答

7

從這裏MaciejGórski的幫助是具有不同類別的活動(例如頁)打開,當你點擊GoogleMapsV2單獨標記信息窗口的例子:

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

在GoogleMap的一流水平添加此

Under 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等...它在中要求.class的位置allMarkersMap.put(marker,.class);輸入你想要的班級,所以它打開你想要的。在標記下方有公共無效的OnInfoWindowClick代碼,這是回調。

就是這樣。當你點擊標記中的InfoWindows時,他們應該打開你放在MarkerOptions代碼中的活動類!

信用此去MaciejGórski

+2

您不需要調用googlemap.setOnInfoWindowClickListener(this);多次。 –

1

set?在setOnInfoWindowClickListener表示它覆蓋之前爲set的任何值。在上調用此函數對象,並且因爲有一個GoogleMap對象,所以有一個活動的OnInfoWindowClickListener

你使用它的決定基於使用if elseswitch也許Map<Marker, Class>回調onInfoWindowClick(Marker marker)參數會發生什麼方式:

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

感謝您的幫助MaciejGórski!,我試圖實現您給我的代碼,並且我有一些錯誤,您可以查看我對上述問題所做的編輯,並且看到代碼我'已經改變了。如果你有一分鐘​​請幫我出來 – user1977908

+0

@ user1977908我的代碼中的'map'不是'GoogleMap'類,而是'Map '或'HashMap '。您需要創建它並在創建它們時放置所有標記。 –

+0

嗨MaciejGorski它一直說地圖無法解決。請你能給我看一個例子,那真的會有幫助 – user1977908

0

針對問題:

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

如果你已經在一個片段類工作(如happend對我來說)你會改變:

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