【问题标题】:google marker open activity when marker is clicked单击标记时的谷歌标记打开活动
【发布时间】:2018-05-18 12:30:05
【问题描述】:

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

每个酒吧都有一份饮料清单。

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

我希望发生的是,当单击标记时,它将打开一个新活动

//场地申报清单

List<Venue> venueList;

//onCreate方法

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

//onMapsReady方法,获取场地进入地图

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

//场地类

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

我希望在顶部打开一个带有被选为标题的栏的新活动

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

【问题讨论】:

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


    【解决方案1】:

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

    相反,定义一个 HashMap 将每个 Marker ID 映射到一个 Venue ID:

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

    然后,在 HashMap 中为每个 Marker 放置一个条目:

    @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,并将其发送到新的活动:

    @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中,只需获取传入的title和Venue ID Strings:

    @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
        }
    
        //.......
     }
    

    【讨论】:

    • 抱歉,我正在尝试获取 ID 和标题,以便显示链接到该酒吧的饮料。下面的代码打开列表上的每个栏,但需要是标记上的栏
    • 我用场地类和我更新的 onMap 方法用 markerCLICK 编辑了它。我用这个打开了列表中的所有栏
    • Daniel 非常感谢你,你做得很好,你的绅士 :-)
    【解决方案2】:

    您还需要将场地信息传递给活动:

    @Override
    public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;
    
    //...........
    
    mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
        @Override
        public boolean onMarkerClick(Marker marker) {
            String title = marker.getTitle();
            Venue venue = NULL;
            for(int i=0;i<venueList.size();i++)
            {
              if(venueList.get(i).getTitle().equal(title))
                 venue = venueList.get(i);
            }
            Intent intent = new Intent(MapActivity.this, NewActivity.class);
            intent.putExtra("title", title);
            intent.putExtra("venue",venue.toJSON());
            startActivity(intent);
    
            return false;
        }
    });
    

    }

    在您的场地类中创建一个 toJSON() 函数以及 fromJSON(),这也将帮助您发送场地数据。

    【讨论】:

      猜你喜欢
      • 2021-07-23
      • 2020-10-20
      • 2018-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多