2013-10-11 30 views
2

嗨,我工作的谷歌地圖與自定義彈出的演示應用程序。 請教我如何處理textview &圖片查看點擊處理。 我無法獲得活動。以下是我的代碼。Google Maps api V2 InfoWindowAdapter具有textview&Imageview事件!,如何處理兩個事件?

class PopupAdapter implements InfoWindowAdapter { 
    LayoutInflater inflater=null; 
     Context context; 
     PopupAdapter(LayoutInflater inflater, Context context) { 
      this.inflater=inflater; 
      this.context = context; 
     } 

     public View getInfoWindow(Marker marker) { 
      return(null); 
     } 

     public View getInfoContents(Marker marker) { 

      MyModel mapItem = (MyModel) MainActivity.markers.get(marker.getId()); 
      View popup=inflater.inflate(R.layout.popup, null); 

      TextView tv=(TextView)popup.findViewById(R.id.title); 
      ImageView im = (ImageView)popup.findViewById(R.id.icon); 
      tv.setText(marker.getTitle()); 
      tv=(TextView)popup.findViewById(R.id.snippet); 
      tv.setText(marker.getSnippet()); 


      im.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 

     Log.e("POPUP", "Image Click"); 
     } 
     }); 

      tv.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 

     Log.e("POPUP", "HI"); 
     Toast.makeText(context, "HI", Toast.LENGTH_SHORT).show(); 
    } 
    }); 

    return(popup); 
    } 
} 

主要活動

public class MainActivity extends AbstractMapActivity implements 
OnNavigationListener, OnInfoWindowClickListener { 
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; 
    public static HashMap<String, MyModel> markers= new HashMap<String, MyModel>(); 

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

    if (readyToGo()) { 
     setContentView(R.layout.activity_main); 

     SupportMapFragment mapFrag= 
      (SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map); 

     initListNav(); 

     map=mapFrag.getMap(); 

     if (savedInstanceState == null) { 
     CameraUpdate center= 
      CameraUpdateFactory.newLatLng(new LatLng(40.76793169992044, 
                -73.98180484771729)); 
     CameraUpdate zoom=CameraUpdateFactory.zoomTo(15); 

     map.moveCamera(center); 
     map.animateCamera(zoom); 
     } 
     MyModel item = new MyModel(); 
     item.setId("1"); 
     item.setName("Bhavesh"); 
     item.setAdd("Krishnanagar"); 
     addMarker(map, 40.748963847316034, -73.96807193756104,R.string.un, R.string.united_nations,item); 
     item = new MyModel(); 
     item.setId("2"); 
     item.setName("Kunal"); 
     item.setAdd("Bhavnagar"); 
     addMarker(map, 40.76866299974387, -73.98268461227417,R.string.lincoln_center,R.string.lincoln_center_snippet,item); 
     item = new MyModel(); 
     item.setId("3"); 
     item.setName("Ravi"); 
     item.setAdd("Ahmedabad"); 
     addMarker(map, 40.765136435316755, -73.97989511489868,R.string.carnegie_hall, R.string.practice_x3,item); 
     item = new MyModel(); 
     item.setId("3"); 
     item.setName("Binitbhai"); 
     item.setAdd("Shivranjani"); 
     addMarker(map, 40.70686417491799, -74.01572942733765,R.string.downtown_club, R.string.heisman_trophy,item); 

     map.setInfoWindowAdapter(new PopupAdapter(getLayoutInflater(),MainActivity.this)); 
     map.setOnInfoWindowClickListener(this); 

    } 
    } 

    @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 onRestoreInstanceState(Bundle savedInstanceState) { 
    super.onRestoreInstanceState(savedInstanceState); 

    getSupportActionBar().setSelectedNavigationItem(savedInstanceState.getInt(STATE_NAV)); 
    } 

    @Override 
    public void onInfoWindowClick(Marker marker) { 




// MyModel mapItem = (MyModel) markers.get(marker.getId()); 

// Toast.makeText(this,marker.getSnippet()+ marker.getTitle() + " "+mapItem.getName() +" "+mapItem.getAdd() , Toast.LENGTH_LONG).show(); 
    } 

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

    private void addMarker(GoogleMap map, double lat, double lon, int title, int snippet,MyModel item) { 
    markers.put(map.addMarker(new MarkerOptions().position(new LatLng(lat, lon)).title(getString(title)).snippet(getString(snippet)).icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE))).getId(), item); 
// map.addMarker(new MarkerOptions().position(new LatLng(lat, lon)).title(getString(title)).snippet(getString(snippet)).icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE))); 


    } 
} 

請建議我如何做到這一點的事件。 謝謝你..

回答

0

如你想達到不直接通過谷歌地圖的Android API v2的支持哪些其他的答案解釋,但是......

,你可以做你的需要通過把自己的MapFragmentMapView前,處理MotionEvents以使您的OnClickListener被調用。

看到這個答案的一個不錯的(但hackish的)操作方法:https://stackoverflow.com/a/15040761/2183804

1

你不能把OnClickListeners上的信息窗口的內容。信息窗口本身不顯示您的佈局,而是從佈局生成的Bitmap。這是覆蓋在the documentation

由於在信息窗口的一節中提到,信息窗口不是實時取景,而視圖被呈現爲圖片到地圖上。因此,您在視圖上設置的所有偵聽器都被忽略,並且無法區分視圖各個部分的點擊事件。建議您不要在自定義信息窗口中放置交互式組件(如按鈕,複選框或文本輸入)。

您可以use setOnInfoWindowClickListener()找出何時點擊信息窗口本身。

+0

onInfoWindowClick得到標記點擊。但我想要特定的圖像和textview點擊比如何做? –

+0

@BhaveshVadalia:你不需要支持。 – CommonsWare

+0

好吧...非常感謝你 比我無法獲得textview和圖像點擊事件。 –

0

是的,你不能在信息窗口的視圖添加監聽器。有一件事你可以做,在InfoWindowClick上顯示警報菜單並給用戶一些選擇。

mMap.setOnInfoWindowClickListener(new OnInfoWindowClickListener() { 

     @Override 
     public void onInfoWindowClick(Marker arg0) { 
      final CharSequence[] items = { "message", "call"}; 

    AlertDialog.Builder builder = new AlertDialog.Builder(this); 
    builder.setTitle("Call"); 
    builder.setItems(items, new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int item) { 
      if (item == 0) { 
       sendMessage(); 
      } else { 
       makeCall(); 

      } 

     } 
    }); 
    AlertDialog alert = builder.create(); 
    alert.show(); 
     } 
    }); 

或者你可以嘗試這樣的事情.. 我不知道是否它的工作與否。 https://stackoverflow.com/a/15040761/1792228

+0

這是另一種使用方式。 –

相關問題