android - 单击标记时谷歌标记打开 Activity

标签 android google-maps google-maps-api-3 google-maps-markers

我创建了一个应用程序,它通过从 Firebase 数据库中获取的 map 上的标记显示酒吧位置列表。

每个酒吧都有一份饮料 list 。

我希望发生的是,当单击标记时,将打开一个新 Activity ,并在新 Activity 顶部选择栏的名称

我希望发生的是当点击标记时它会打开一个新的 Activity

// field 申报 list

List<Venue> venueList;

//onCreate方法

    venueList = new ArrayList<>();
    mVenues.push().setValue(marker);

//onMapsReady方法,获取 field 入图

  public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;
    googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
    mVenues.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot s : dataSnapshot.getChildren()){
                Venue venue = s.getValue(Venue.class);

                venueList.add(venue);
                for (int i = 0; i < venueList.size(); i++)
                {
                    LatLng latLng = new LatLng(venue.venueLat,venue.venueLong);
                    if (mMap != null) {
                        marker = mMap.addMarker(new MarkerOptions()
                                .position(latLng).title(venue.venueName));
                                           }
                }
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }

    });

//标记点击事件

  //CMarker click event to take user to purchase beverage
    mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener(){
        public boolean onMarkerClick(Marker marker) {
            String title = marker.getTitle();
            {
                for (int i = 0; i < venueList.size();) {
                    //getting the selected venue
                    Venue venue = venueList.get(i);
                    //creating an intent

                    Intent intent = new Intent(getApplicationContext(), viewbeverageActivity.class);

                    //putting venue name and id to intent
                    intent.putExtra(VENUE_ID, venue.getVenueId());
                    intent.putExtra(VENUE_NAME, venue.getVenueName());

                    //starting the activity with intent
                    startActivity(intent);

                }
                return false;
            }
        }
    });

// field 类

package uk.ac.ferry_j2ulster.beerapp;

import com.google.firebase.database.IgnoreExtraProperties;

public class Venue {
    private String venueId;
    public String venueName;
    private String venueType;
    public double venueLat;
    public double venueLong;


    public Venue(){

    }

    public Venue(String venueId, String venueName, String venueType,double venueLat, double venueLong) {
        this.venueId = venueId;
        this.venueName = venueName;
        this.venueType = venueType;
        this.venueLat =  venueLat;
        this.venueLong =  venueLong;


    }

    public String getVenueId() {
        return venueId;
    }

    public String getVenueName() {
        return venueName;
    }

    public String getVenueType() {
        return venueType;
    }

    public double getVenueLong() { return venueLong;
    }

    public double getVenueLat() {return venueLat;
    }
}

我希望打开一个新的activity,上面的bar被选为title

没有错误,不知道如何从这个开始

最佳答案

问题是您正在使用循环遍历每个 field ,并为所有 field 调用 startActivity()

相反,定义一个将每个标记 ID 映射到地点 ID 的 HashMap:

 Map<String, String> mMarkerMap = new HashMap<>();

然后,为每个标记在 HashMap 中放入一个条目:

@Override
public void onDataChange(DataSnapshot dataSnapshot) {
    for (DataSnapshot s : dataSnapshot.getChildren()){
        Venue venue = s.getValue(Venue.class);

        venueList.add(venue);
        for (int i = 0; i < venueList.size(); i++)
        {
            LatLng latLng = new LatLng(venue.venueLat,venue.venueLong);
            if (mMap != null) {
                marker = mMap.addMarker(new MarkerOptions()
                        .position(latLng).title(venue.venueName));
                //Added:
                mMarkerMap.put(marker.getId(), venue.getVenueId());
            }
        }
    }
}

然后,当用户点击一个 Marker 时,从 Marker/HashMap 中获取标题和 Venue ID,并将其发送到新的 Activity:

@Override
public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;

    //...........

    mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
        @Override
        public boolean onMarkerClick(Marker marker) {
            String venueID = mMarkerMap.get(marker.getId());
            String venueName = marker.getTitle();
            Intent intent = new Intent(MapActivity.this, NewActivity.class);
            intent.putExtra(VENUE_NAME, venueName);
            intent.putExtra(VENUE_ID, venueID);
            startActivity(intent);

            return false;
        }
    });
}

在新 Activity 中,只需获取传入的标题和 field ID 字符串:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_new);

    String venueName = getIntent().getStringExtra(MapActivity.VENUE_NAME);
    if (title != null) {
        getSupportActionBar().setTitle(title);
    }

    String venueID = getIntent().getStringExtra(MapActivity.VENUE_ID);
    if (venueID != null) {
        //use venue ID to get the information about this venue
    }

    //.......
 }

关于android - 单击标记时谷歌标记打开 Activity ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47643568/

相关文章:

java - 如何使用 firebase 数据库更新本地对象

google-maps - Google Maps API 区域偏向欧洲

google-maps - 谷歌如何获取城市局部的多边形数据

google-maps - Google Maps v3 getBounds超出了 map 上可见的范围

google-maps - 谷歌地图 : infobox turns up behind markers?

css - 在 SVG 元素中嵌入谷歌地图 iframe

java - RxJava 和长时间运行的监听器

android - 确定 docker 中的操作系统类型

java - 使用 Firebase Realtime 删除帐户

google-maps - 谷歌地图上的标签使用什么字体?