Change sublayer visibility

View on GitHub
Sample viewer app

Change the visibility of sublayers.

Image of change sublayer visibility

Use case

A map image layer may contain many sublayers such as different types of roads in a road network or city, county, and state borders in a US map. The user may only be interested in a subset of these sublayers. Or, perhaps showing all of the sublayers would show too much detail. In these cases, you can hide certain sublayers by changing their visibility.

How to use the sample

Use the overflow menu at top right to access sublayer visibility controls. Each sublayer has a check box which can be used to toggle the visibility of the sublayer.

How it works

  1. Create an ArcGISMapImageLayer object with the URL to a map image service.
  2. Get the SubLayerList with mapImageLayer.getSubLayers().
  3. For each layer in the sublayer list, set its visible property to true or false.

Relevant API

  • ArcGISMapImageLayer
  • SubLayerList

Tags

layer, sublayer, visibility

Sample Code

MainActivity.java
                                                                                                                                                  
/* Copyright 2016 Esri
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */

package com.esri.arcgisruntime.sample.mapimagelayersublayervisibility;

import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;

import androidx.appcompat.app.AppCompatActivity;
import com.esri.arcgisruntime.layers.ArcGISMapImageLayer;
import com.esri.arcgisruntime.layers.SublayerList;
import com.esri.arcgisruntime.mapping.ArcGISMap;
import com.esri.arcgisruntime.mapping.Viewpoint;
import com.esri.arcgisruntime.mapping.view.MapView;

public class MainActivity extends AppCompatActivity {

  private MapView mMapView;
  private ArcGISMapImageLayer mMapImageLayer;
  private SublayerList mLayers;

  // The layer on/off menu items.
  private MenuItem mCities = null;
  private MenuItem mContinent = null;
  private MenuItem mWorld = null;

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

    // inflate MapView from layout
    mMapView = findViewById(R.id.mapView);
    // create a map with the Basemap Type topographic
    ArcGISMap map = new ArcGISMap();
    // create a MapImageLayer with dynamically generated map images
    mMapImageLayer = new ArcGISMapImageLayer(getResources().getString(R.string.world_cities_service));
    mMapImageLayer.setOpacity(0.9f);
    // add world cities layers as map operational layer
    map.getOperationalLayers().add(mMapImageLayer);
    // set the map to be displayed in this view
    mMapView.setMap(map);
    mMapView.setViewpoint(new Viewpoint(48.354406, -99.998267, 100000000.0));
    // get the layers from the map image layer
    mLayers = mMapImageLayer.getSublayers();

  }

  @Override
  protected void onPause() {
    super.onPause();
    mMapView.pause();
  }

  @Override
  protected void onResume() {
    super.onResume();
    mMapView.resume();
  }

  @Override
  protected void onDestroy() {
    super.onDestroy();
    mMapView.dispose();
  }

  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_main, menu);

    // Get the sub layer switching menu items.
    mCities = menu.getItem(0);
    mContinent = menu.getItem(1);
    mWorld = menu.getItem(2);

    // set all layers on by default
    mCities.setChecked(true);
    mContinent.setChecked(true);
    mWorld.setChecked(true);

    return true;
  }

  @Override
  public boolean onOptionsItemSelected(MenuItem item) {
    // handle menu item selection
    //if-else is used because this sample is used elsewhere as a Library module
    int itemId = item.getItemId();
    if (itemId == R.id.Cities) {
      if (mLayers.get(0).isVisible() && mCities.isChecked()) {
        // cities layer is on and menu item checked
        mLayers.get(0).setVisible(false);
        mCities.setChecked(false);
      } else if (!mLayers.get(0).isVisible() && !mCities.isChecked()) {
        // cities layer is off and menu item unchecked
        mLayers.get(0).setVisible(true);
        Log.d("cities", String.valueOf(mLayers.get(0).getOpacity()));
        mCities.setChecked(true);
      }
      return true;
    } else if (itemId == R.id.Continents) {
      if (mLayers.get(1).isVisible() && mContinent.isChecked()) {
        // continent layer is on and menu item checked
        mLayers.get(1).setVisible(false);
        mContinent.setChecked(false);
      } else if (!mLayers.get(1).isVisible() && !mContinent.isChecked()) {
        // continent layer is off and menu item unchecked
        mLayers.get(1).setVisible(true);
        Log.d("continents", String.valueOf(mLayers.get(1).getOpacity()));
        mContinent.setChecked(true);
      }
      return true;
    } else if (itemId == R.id.World) {
      if (mLayers.get(2).isVisible() && mWorld.isChecked()) {
        // world layer is on and menu item checked
        mLayers.get(2).setVisible(false);
        mWorld.setChecked(false);
      } else if (!mLayers.get(2).isVisible() && !mWorld.isChecked()) {
        // world layer is off and menu item unchecked
        mLayers.get(2).setVisible(true);
        Log.d("world", String.valueOf(mLayers.get(2).getOpacity()));
        mWorld.setChecked(true);
      }
      return true;
    } else {
      return super.onOptionsItemSelected(item);
    }
  }

}