2

嗨,我正在开发带有自定义弹出窗口的谷歌地图演示应用程序。请建议我如何处理 textview 和 image view 点击句柄。我无法获得事件。下面是我的代码。

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


  }
}

请建议我如何进行此活动。谢谢你..

4

3 回答 3

1

您不能放置OnClickListeners信息窗口的内容。信息窗口本身并不显示您的布局,而是Bitmap从布局生成的。这在文档中有所介绍:

如前面关于信息窗口的部分所述,信息窗口不是实时视图,而是将视图呈现为地图上的图像。因此,您在视图上设置的任何侦听器都将被忽略,并且您无法区分视图各个部分的点击事件。建议您不要在自定义信息窗口中放置交互式组件(例如按钮、复选框或文本输入)。

您可以使用它setOnInfoWindowClickListener()来了解何时点击了信息窗口本身。

于 2013-10-11T11:37:03.203 回答
0

正如其他答案中所解释的那样,Google Maps Android API v2 不直接支持您想要实现的目标,但是......

MapFragment您可以通过将自己放在or前面来做您需要的事情MapViewMotionEvents以使您OnClickListener的 s 被调用。

请参阅此答案以获得一个不错的(但 hackish)操作方法:https ://stackoverflow.com/a/15040761/2183804

于 2013-10-11T15:04:09.270 回答
0

是的,您不能在信息窗口的视图中添加侦听器。您可以做的一件事,onInfoWindowClick 显示警报菜单并为用户提供一些选项。

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

于 2013-10-11T11:51:21.647 回答