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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
/* 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();
}
}