Change the appearance of a feature layer with a renderer.
Use case
A feature layer hosted on ArcGIS Online has a preset renderer and will display in an ArcGIS Runtime application with that renderer. However, for example, the color associated with the original renderer may be unsuitable for a company with staff or clients who are color blind, or for presentation with a different set of basemap and operational layers. In these cases, the renderer on the feature layer's data can be set to a more suitable color.
How to use the sample
Tap the 'Override Renderer' button to change the FeatureLayer's renderer.
How it works
Create a ServiceFeatureTable from a URL.
Create a FeatureLayer from the service feature table.
Create a new renderer (in this case, a SimpleRenderer).
Change the feature layer's renderer using FeatureLayer.setRenderer(SimpleRenderer).
Relevant API
FeatureLayer
ServiceFeatureTable
SimpleRenderer
Tags
feature layer, renderer, visualization
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.samples.changefeaturelayerrenderer;
import android.graphics.Color;
import android.os.Bundle;
import android.view.MenuItem;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import com.esri.arcgisruntime.ArcGISRuntimeEnvironment;
import com.esri.arcgisruntime.data.ServiceFeatureTable;
import com.esri.arcgisruntime.geometry.Envelope;
import com.esri.arcgisruntime.geometry.SpatialReferences;
import com.esri.arcgisruntime.layers.FeatureLayer;
import com.esri.arcgisruntime.mapping.ArcGISMap;
import com.esri.arcgisruntime.mapping.BasemapStyle;
import com.esri.arcgisruntime.mapping.Viewpoint;
import com.esri.arcgisruntime.mapping.view.MapView;
import com.esri.arcgisruntime.symbology.SimpleLineSymbol;
import com.esri.arcgisruntime.symbology.SimpleRenderer;
publicclassMainActivityextendsAppCompatActivity{
private MapView mMapView;
private FeatureLayer mFeatureLayer;
privateboolean mIsOverrideActive;
@OverrideprotectedvoidonCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// authentication with an API key or named user is required to access basemaps and other// location services ArcGISRuntimeEnvironment.setApiKey(BuildConfig.API_KEY);
// set up the bottom toolbar createBottomToolbar();
// inflate MapView from layout mMapView = findViewById(R.id.mapView);
// create a map with the topographic basemap ArcGISMap map = new ArcGISMap(BasemapStyle.ARCGIS_TOPOGRAPHIC);
// create feature layer with its service feature table ServiceFeatureTable serviceFeatureTable = new ServiceFeatureTable(
getResources().getString(R.string.sample_service_url));
mFeatureLayer = new FeatureLayer(serviceFeatureTable);
// add the layer to the map map.getOperationalLayers().add(mFeatureLayer);
// set the map to be displayed in the map view mMapView.setMap(map);
// set an initial viewpoint mMapView.setViewpoint(new Viewpoint(
new Envelope(-1.30758164047166E7, 4014771.46954516, -1.30730056797177E7, 4016869.78617381,
SpatialReferences.getWebMercator())));
}
privatevoidoverrideRenderer(){
// create a new simple renderer for the line feature layer SimpleLineSymbol lineSymbol = new SimpleLineSymbol(SimpleLineSymbol.Style.SOLID, Color.rgb(0, 0, 255), 2);
SimpleRenderer simpleRenderer = new SimpleRenderer(lineSymbol);
// override the current renderer with the new renderer defined above mFeatureLayer.setRenderer(simpleRenderer);
}
privatevoidresetRenderer(){
// reset the renderer back to the definition from the source (feature service) using the reset renderer method mFeatureLayer.resetRenderer();
}
privatevoidcreateBottomToolbar(){
Toolbar bottomToolbar = findViewById(R.id.bottomToolbar);
bottomToolbar.inflateMenu(R.menu.menu_main);
bottomToolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
@OverridepublicbooleanonMenuItemClick(MenuItem item){
// Handle action bar item clicksint itemId = item.getItemId();
//if statement is used because this sample is used elsewhere as a Library moduleif (itemId == R.id.action_override_rend) {
// check the state of the menu itemif (!mIsOverrideActive) {
overrideRenderer();
// change the text to reset mIsOverrideActive = true;
item.setTitle(R.string.action_reset);
} else {
resetRenderer();
// change the text to override mIsOverrideActive = false;
item.setTitle(R.string.action_override_rend);
}
}
returntrue;
}
});
}
@OverrideprotectedvoidonPause(){
super.onPause();
// pause MapView mMapView.pause();
}
@OverrideprotectedvoidonResume(){
super.onResume();
// resume MapView mMapView.resume();
}
@OverrideprotectedvoidonDestroy(){
super.onDestroy();
// dispose MapView mMapView.dispose();
}
}