如何在 Android 中使用 Google 地图按类别隐藏/显示标记组?

Posted

技术标签:

【中文标题】如何在 Android 中使用 Google 地图按类别隐藏/显示标记组?【英文标题】:How to hide/show groups of markers by category with Google Maps in Android? 【发布时间】:2016-01-05 12:14:18 【问题描述】:

我正在寻找类似 android 中的 right here 所做的事情。我需要做的是将标记分组到不同的组中,并为每个组设置复选框。

当我勾选和取消勾选复选框时,标记应该显示和隐藏。

这是我的 MapsActivity.java 文件。

public class MapsActivity extends FragmentActivity 

//Restaurants
private final LatLng LOCATION_DINEMORE = new LatLng(6.9270786,79.861243);
private final LatLng LOCATION_BARISTA = new LatLng(6.0334009,80.218384);

//Hotels
private final LatLng LOCATION_AVENRA = new LatLng(7.211111,79.838610);
private final LatLng LOCATION_MOUNTBATTEN = new LatLng(7.296411,80.635012);

private GoogleMap mMap; // Might be null if Google Play services APK is not available.

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_maps);
    setUpMapIfNeeded();

    // Give text to buttons
    Button buttonloc1 = (Button)findViewById(R.id.btnLoc1);
    buttonloc1.setText("Dinemore");

    Button buttonloc2 = (Button)findViewById(R.id.btnLoc2);
    buttonloc2.setText("Barista");

    Button buttoncity = (Button)findViewById(R.id.btnCity);
    buttoncity.setText("My Location");

    Button buttonremove = (Button)findViewById(R.id.removeMarker);
    buttonremove.setText("Remove");

   /* Location myLocation = mMap.getMyLocation();

    mMap.addMarker(new MarkerOptions()
                    .position(new LatLng(myLocation.getLatitude(), myLocation.getLongitude()))
                    .title("Hi I'm Here..:D")
    );*/

    // Marker to Dinemore
    mMap.addMarker(new MarkerOptions()
                    .position(LOCATION_DINEMORE)
                    .title("Dinemore")
                    .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_ROSE))
    );

    // Marker to Barista
    mMap.addMarker(new MarkerOptions()
                    .position(LOCATION_BARISTA)
                    .title("Barista Lavazza")
                    .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_ROSE))
    );

    // Marker to Avenra Garden Hotel
    mMap.addMarker(new MarkerOptions()
                    .position(LOCATION_AVENRA)
                    .title("Avenra Garden")
                    .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_YELLOW))
    );

    // Marker to Mounbatten Bunglow
    mMap.addMarker(new MarkerOptions()
                    .position(LOCATION_MOUNTBATTEN)
                    .title("Mounbatten Bunglow")
                    .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_YELLOW))
    );

    //When touch again on the map marker title will hide
    mMap.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener() 
        @Override
        public void onInfoWindowClick(Marker marker) 

        
    );

    ArrayList<Marker> category1=new ArrayList<>();
    ArrayList<Marker> category2=new ArrayList<>();

    for (int i=0; i< category1.size(); i++)
        category1.get(i).remove();
    



@Override
protected void onResume() 
    super.onResume();
    setUpMapIfNeeded();


public void onClick_City(View v)
    mMap.setMyLocationEnabled(true);


// When click on this button, Map shows the place of Dinemore
public void onClick_Loc1(View v) 
    mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
    CameraUpdate update = CameraUpdateFactory.newLatLngZoom(LOCATION_DINEMORE,10);
    mMap.animateCamera(update);


// When click on this button, Map shows the place of Barista
public void onClick_Loc2(View v) 
    mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
    CameraUpdate update = CameraUpdateFactory.newLatLngZoom(LOCATION_BARISTA,10);
    mMap.animateCamera(update);


// To rmove All the Markers
public void onClick_Remove(View v)
    mMap.clear();


private void setUpMapIfNeeded() 
    // Do a null check to confirm that we have not already instantiated the map.
    if (mMap == null) 
        // Try to obtain the map from the SupportMapFragment.
        mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map))
                .getMap();
        // Check if we were successful in obtaining the map.
        if (mMap != null) 
            setUpMap();
        
    


/**
 * This is where we can add markers or lines, add listeners or move the camera. In this case, we
 * just add a marker near Africa.
 * <p/>
 * This should only be called once and when we are sure that @link #mMap is not null.
 */
private void setUpMap() 
    mMap.addMarker(new MarkerOptions().position(new LatLng(0, 0)).title("Marker"));

这是我的 activity_maps.xml 文件。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_
android:layout_
android:paddingBottom="10dip"
android:paddingLeft="10dip"
android:paddingRight="10dip"
android:paddingTop="10dip"
tools:context=".MapsActivity">

<Button
    android:id="@+id/btnLoc1"
    android:layout_
    android:layout_
    android:layout_toRightOf="@+id/btnCity"
    android:layout_alignParentTop="true"
    android:onClick="onClick_Loc1"/>

<fragment
    android:id="@+id/map"
    android:name="com.google.android.gms.maps.SupportMapFragment"
    android:layout_below="@+id/btnLoc1"
    android:layout_
    android:layout_
    />

<Button
    android:id="@+id/btnCity"
    android:layout_
    android:layout_
    android:layout_toRightOf="@+id/btnLoc2"
    android:layout_alignParentTop="true"
    android:onClick="onClick_City"/>

<Button
    android:id="@+id/btnLoc2"
    android:layout_
    android:layout_
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:onClick="onClick_Loc2"/>

<Button
    android:id="@+id/removeMarker"
    android:layout_
    android:layout_
    android:layout_alignParentRight="true"
    android:layout_alignParentTop="true"
    android:onClick="onClick_Remove"/>

<CheckBox android:id="@+id/checkbox_restaurant"
    android:layout_
    android:layout_
    android:layout_toRightOf="@+id/btnLoc1"
    android:text="Restaurants"
    android:onClick="onCheckboxClicked"/>

<CheckBox android:id="@+id/checkbox_hotels"
    android:layout_
    android:layout_
    android:layout_toRightOf="@+id/checkbox_restaurant"
    android:text="Hotels"
    android:onClick="onCheckboxClicked"/>

我该怎么做?

提前致谢。

【问题讨论】:

看看这可能会帮助你得到一些想法:***.com/questions/5551028/using-google-places-api 【参考方案1】:

这里有一些隐藏的问题。您需要将不同的任务分开:

    在餐厅检查中添加餐厅标记 取消选中餐厅上的餐厅标记 在条形检查上添加条形标记 取消选中条形上的条形标记

您需要保留一份餐厅和酒吧列表,一个包含餐厅表和酒吧表的 SQLite 数据库是一个不错的选择。

您可以查询数据库并填充 POJO 对象列表,并在选中复选框时使用这些列表生成标记。

然后,您需要保留一个单独的标记列表,以便在未选中复选框时,您可以从地图中删除标记。

这是一个简单的例子,我用硬编码值快速组合在一起,稍后您需要添加数据库部分。

public class CheckMapActivity extends AppCompatActivity
        implements OnMapReadyCallback 

    GoogleMap googleMap;
    List<MapLocation> restaurantList;
    List<MapLocation> barList;
    List<Marker> restaurantMarkers = new ArrayList<>();
    List<Marker> barMarkers = new ArrayList<>();

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

        //Eventually load from a database
        //Hard coded here for now
        restaurantList = new ArrayList<>();
        barList =  new ArrayList<>();

        MapLocation r1 = new MapLocation(37.78344,-122.42578, "Restaurant One" );
        MapLocation r2 = new MapLocation(37.7876965,-122.4106738, "Restaurant Two" );
        restaurantList.add(r1);
        restaurantList.add(r2);

        MapLocation b1 = new MapLocation(37.7866028,-122.4044511, "Bar One" );
        MapLocation b2 = new MapLocation(37.7864459,-122.4090323, "Bar Two" );
        barList.add(b1);
        barList.add(b2);

        CheckBox checkRestaurants = (CheckBox) findViewById(R.id.checkRestaurants);
        checkRestaurants.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() 
            @Override
            public void onCheckedChanged(CompoundButton compoundButton, boolean b) 
                if (b)
                    showRestaurants();
                 else 
                    hideRestaurants();
                
            
        );

        CheckBox checBars = (CheckBox) findViewById(R.id.checkBars);
        checBars.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() 
            @Override
            public void onCheckedChanged(CompoundButton compoundButton, boolean b) 
                if (b) 
                    showBars();
                 else 
                    hideBars();
                
            
        );
    

    @Override
    protected void onResume() 
        super.onResume();

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

        mapFragment.getMapAsync(this);
    

    @Override
    public void onMapReady(GoogleMap map) 

        googleMap = map;
        setUpMap();
    

    public void setUpMap() 

        googleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
        googleMap.setMyLocationEnabled(true);
        googleMap.getUiSettings().setZoomControlsEnabled(true);

    

    public void showRestaurants() 

        restaurantMarkers.clear();
        for (MapLocation loc : restaurantList)
            Marker marker = googleMap.addMarker(new MarkerOptions()
                    .position(new LatLng(loc.lat, loc.lon))
                    .title(loc.title)
                    .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_MAGENTA)));

            CameraPosition cameraPosition = new CameraPosition.Builder()
                    .target(new LatLng(loc.lat, loc.lon)).zoom(12).build();
            googleMap.animateCamera(CameraUpdateFactory
                    .newCameraPosition(cameraPosition));

            restaurantMarkers.add(marker);
        
    

    public void showBars() 

        barMarkers.clear();
        for (MapLocation loc : barList)
            Marker marker = googleMap.addMarker(new MarkerOptions()
                    .position(new LatLng(loc.lat, loc.lon))
                    .title(loc.title)
                    .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_BLUE)));

            CameraPosition cameraPosition = new CameraPosition.Builder()
                    .target(new LatLng(loc.lat, loc.lon)).zoom(12).build();
            googleMap.animateCamera(CameraUpdateFactory
                    .newCameraPosition(cameraPosition));

            barMarkers.add(marker);
        
    

    public void hideRestaurants()
        for (Marker marker : restaurantMarkers)
            marker.remove();
        
    

    public void hideBars()
        for (Marker marker : barMarkers)
            marker.remove();
        
    

    //POJO to hold locations:
    public class MapLocation 
        public MapLocation(double lt, double ln, String t)
            lat = lt;
            lon = ln;
            title = t;
        
        public double lat;
        public double lon;
        public String title;
    


这是布局,activity_check_map.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_
    android:layout_ android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    tools:context="com.daniel.tabstest.CheckMapActivity">

    <fragment
        android:id="@+id/map"
        class="com.google.android.gms.maps.SupportMapFragment"
        android:layout_
        android:layout_/>

    <LinearLayout
        android:layout_alignBottom="@+id/map"
        android:layout_
        android:layout_
        android:layout_alignParentBottom="true"
        android:orientation="vertical">

        <CheckBox
            android:id="@+id/checkRestaurants"
            android:layout_
            android:layout_
            android:text="Restaurants" />
        <CheckBox
            android:id="@+id/checkBars"
            android:layout_
            android:layout_
            android:text="Bars" />

    </LinearLayout>
</RelativeLayout>

结果:

检查过的餐厅:

检查餐厅和酒吧:

检查条形:

没有检查:

【讨论】:

很好的解释! +1 我需要在任何地方声明 MapLocation 吗?还是创建一个类? @Manu 在这个例子中,为了简单起见,我将它设置为 Activity 的内部类,它位于 Activity 代码的底部。你也可以在它自己的文件中把它变成一个类。 感谢您的最佳回答。你是个传奇:) 酷,但不是我想要的。我希望看到类似“1)将条形标记添加到条形层或组,2)通过条形复选框隐藏/显示条形层”【参考方案2】:

您必须根据类别获取标记的数组列表,

 ArrayList<Marker> category1=new ArrayList<>();
 ArrayList<Marker> category2=new ArrayList<>();

比在这个数组列表中添加你的制造商,在点击事件删除后请写这个

for (int i=0; i< category1.size(); i++)
        category1.get(i).setVisibility(false);
    

我认为这很有帮助

【讨论】:

这个尺寸是干什么用的? 大小是关于你的一个类别的标记等等 我真的不明白如何将它添加到我的代码中。可能这是一个愚蠢的问题。但是,我编辑了我的问题。你能看看它并告诉我具体该怎么做吗?【参考方案3】:

请参考:https://***.com/a/14508886/3134215

您可以使用marker.setVisible() 来显示/隐藏标记。

【讨论】:

以上是关于如何在 Android 中使用 Google 地图按类别隐藏/显示标记组?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 的 Google 地图中显示路线时缩放到源点。

如何使用 android studio 更改 Google 地图中“我的位置”按钮的位置

Android - 如何在 Google 地图上为 Google 徽标设置底部填充

如何在 Android 上的 Google 地图上的标记旁边显示标签?

如何使用适用于 Android V2 的 Google Maps 处理地图移动端?

Google Maps Android Studio - 如何禁用地图控件?