Android Open Source - arcgis-runtime-samples-android Attribute Editor Activity






From Project

Back to project page arcgis-runtime-samples-android.

License

The source code is released under:

Apache License

If you think the Android project arcgis-runtime-samples-android listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

/* Copyright 2014 ESRI
*/*from   ww w  .ja va  2s .  com*/
* All rights reserved under the copyright laws of the United States
* and applicable international laws, treaties, and conventions.
*
* You may freely redistribute and use this sample code, with or
* without modification, provided you include the original copyright
* notice and use restrictions.
*
* See the sample code usage restrictions document for further information.
*
*/

package com.esri.arcgis.android.samples.attributeeditor;

import java.util.HashMap;
import java.util.Map;

import android.app.Activity;
import android.app.Dialog;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Spinner;

import com.esri.android.map.MapView;
import com.esri.android.map.ags.ArcGISDynamicMapServiceLayer;
import com.esri.android.map.ags.ArcGISFeatureLayer;
import com.esri.android.map.ags.ArcGISTiledMapServiceLayer;
import com.esri.android.map.ags.ArcGISFeatureLayer.MODE;
import com.esri.android.map.event.OnSingleTapListener;
import com.esri.android.map.event.OnStatusChangedListener;
import com.esri.arcgis.android.samples.attributeeditor.FeatureLayerUtils.FieldType;
import com.esri.core.geometry.Envelope;
import com.esri.core.geometry.Point;
import com.esri.core.map.CallbackListener;
import com.esri.core.map.FeatureEditResult;
import com.esri.core.map.FeatureSet;
import com.esri.core.map.Graphic;
import com.esri.core.symbol.SimpleFillSymbol;
import com.esri.core.symbol.SimpleLineSymbol;
import com.esri.core.tasks.SpatialRelationship;
import com.esri.core.tasks.ags.query.Query;

/**
 * Main activity class for the Attribute Editor Sample
 */
public class AttributeEditorActivity extends Activity {

  MapView mapView;

  ArcGISFeatureLayer featureLayer;
  ArcGISDynamicMapServiceLayer dmsl;

  Point pointClicked;

  LayoutInflater inflator;

  AttributeListAdapter listAdapter;
  
  Envelope initextent;

  ListView listView;

  View listLayout;

  public static final String TAG = "AttributeEditorSample";

  static final int ATTRIBUTE_EDITOR_DIALOG_ID = 1;

  @Override
  public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

   
   
    mapView = new MapView(this);
  initextent = new Envelope(-10868502.895856911, 4470034.144641369,
      -10837928.084542884, 4492965.25312689);
  mapView.setExtent(initextent, 0);
  ArcGISTiledMapServiceLayer tmsl = new ArcGISTiledMapServiceLayer(
      "http://services.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer");
  mapView.addLayer(tmsl);

  dmsl = new ArcGISDynamicMapServiceLayer("http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/Petroleum/KSFields/MapServer");
  mapView.addLayer(dmsl);

  featureLayer = new ArcGISFeatureLayer(
      "http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/Petroleum/KSFields/FeatureServer/0",
      MODE.SELECTION);
  setContentView(mapView);
  
    SimpleFillSymbol sfs = new SimpleFillSymbol(Color.TRANSPARENT);
    sfs.setOutline(new SimpleLineSymbol(Color.YELLOW, 3));
    featureLayer.setSelectionSymbol(sfs);

    // set up local variables
    inflator = LayoutInflater.from(getApplicationContext());
    listLayout = inflator.inflate(R.layout.list_layout, null);
    listView = (ListView) listLayout.findViewById(R.id.list_view);

    // Create a new AttributeListAdapter when the feature layer is initialized
    if (featureLayer.isInitialized()) {

      listAdapter = new AttributeListAdapter(this, featureLayer.getFields(), featureLayer.getTypes(),
          featureLayer.getTypeIdField());

    } else {

      featureLayer.setOnStatusChangedListener(new OnStatusChangedListener() {

        private static final long serialVersionUID = 1L;

        public void onStatusChanged(Object source, STATUS status) {

          if (status == STATUS.INITIALIZED) {
            listAdapter = new AttributeListAdapter(AttributeEditorActivity.this, featureLayer.getFields(), featureLayer
                .getTypes(), featureLayer.getTypeIdField());
          }
        }
      });
    }

    // Set tap listener for MapView
    mapView.setOnSingleTapListener(new OnSingleTapListener() {

      private static final long serialVersionUID = 1L;

      public void onSingleTap(float x, float y) {

        // convert event into screen click
        pointClicked = mapView.toMapPoint(x, y);

        // build a query to select the clicked feature
        Query query = new Query();
        query.setOutFields(new String[] { "*" });
        query.setSpatialRelationship(SpatialRelationship.INTERSECTS);
        query.setGeometry(pointClicked);
        query.setInSpatialReference(mapView.getSpatialReference());

        // call the select features method and implement the callbacklistener
        featureLayer.selectFeatures(query, ArcGISFeatureLayer.SELECTION_METHOD.NEW, new CallbackListener<FeatureSet>() {

          // handle any errors
          public void onError(Throwable e) {

            Log.d(TAG, "Select Features Error" + e.getLocalizedMessage());

          }

          public void onCallback(FeatureSet queryResults) {

            if (queryResults.getGraphics().length > 0) {

              Log.d(
                  TAG,
                  "Feature found id="
                      + queryResults.getGraphics()[0].getAttributeValue(featureLayer.getObjectIdField()));

              // set new data and notify adapter that data has changed
              listAdapter.setFeatureSet(queryResults);
              listAdapter.notifyDataSetChanged();

              // This callback is not run in the main UI thread. All GUI
              // related events must run in the UI thread,
              // therefore use the Activity.runOnUiThread() method. See
              // http://developer.android.com/reference/android/app/Activity.html#runOnUiThread(java.lang.Runnable)
              // for more information.
              AttributeEditorActivity.this.runOnUiThread(new Runnable() {

                public void run() {

                  // show the editor dialog.
                  showDialog(ATTRIBUTE_EDITOR_DIALOG_ID);

                }
              });
            }
          }
        });
      }
    });

    // TODO handle rotation
  }

  /**
   * Overidden method from Activity class - this is the recommended way of creating dialogs
   */
  @Override
  protected Dialog onCreateDialog(int id) {

    switch (id) {

      case ATTRIBUTE_EDITOR_DIALOG_ID:

        // create the attributes dialog
        Dialog dialog = new Dialog(this);
        listView.setAdapter(listAdapter);
        dialog.setContentView(listLayout);
        dialog.setTitle("Edit Attributes");

        // set button on click listeners, setting as XML attributes doesn't work
        // due to a scope/thread issue
        Button btnEditCancel = (Button) listLayout.findViewById(R.id.btn_edit_discard);
        btnEditCancel.setOnClickListener(returnOnClickDiscardChangesListener());

        Button btnEditApply = (Button) listLayout.findViewById(R.id.btn_edit_apply);
        btnEditApply.setOnClickListener(returnOnClickApplyChangesListener());

        return dialog;
    }
    return null;
  }

  /**
   * Helper method to return an OnClickListener for the Apply button
   */
  public OnClickListener returnOnClickApplyChangesListener() {

    return new OnClickListener() {

      public void onClick(View v) {

        boolean isTypeField = false;
        boolean hasEdits = false;
        boolean updateMapLayer = false;
        Map<String, Object> attrs = new HashMap<String, Object>();

        // loop through each attribute and set the new values if they have
        // changed
        for (int i = 0; i < listAdapter.getCount(); i++) {

          AttributeItem item = (AttributeItem) listAdapter.getItem(i);
          String value = "";

          // check to see if the View has been set
          if (item.getView() != null) {

            // determine field type and therefore View type
            if (item.getField().getName().equals(featureLayer.getTypeIdField())) {
              // drop down spinner

              Spinner spinner = (Spinner) item.getView();
              // get value for the type
              String typeName = spinner.getSelectedItem().toString();
              value = FeatureLayerUtils.returnTypeIdFromTypeName(featureLayer.getTypes(), typeName);

              // update map layer as for this featurelayer the type change will
              // change the features symbol.
              isTypeField = true;

            } else if (FieldType.determineFieldType(item.getField()) == FieldType.DATE) {
              // date

              Button dateButton = (Button) item.getView();
              value = dateButton.getText().toString();

            } else {
              // edit text

              EditText editText = (EditText) item.getView();
              value = editText.getText().toString();

            }

            // try to set the attribute value on the graphic and see if it has
            // been changed
            boolean hasChanged = FeatureLayerUtils.setAttribute(attrs, listAdapter.featureSet.getGraphics()[0],
                item.getField(), value, listAdapter.formatter);

            // if a value has for this field, log this and set the hasEdits
            // boolean to true
            if (hasChanged) {

              Log.d(TAG, "Change found for field=" + item.getField().getName() + " value = " + value
                  + " applyEdits() will be called");
              hasEdits = true;

              // If the change was from a Type field then set the dynamic map
              // service to update when the edits have been applied, as the
              // renderer of the feature will likely change
              if (isTypeField) {

                updateMapLayer = true;

              }
            }

            // check if this was a type field, if so set boolean back to false
            // for next field
            if (isTypeField) {

              isTypeField = false;
            }
          }
        }

        // check there have been some edits before applying the changes
        if (hasEdits) {

          // set objectID field value from graphic held in the featureset
          attrs.put(featureLayer.getObjectIdField(),listAdapter.featureSet.getGraphics()[0].getAttributeValue(featureLayer.getObjectIdField()));
      Graphic newGraphic = new Graphic(null, null, attrs);
            featureLayer.applyEdits(null, null, new Graphic[] { newGraphic }, createEditCallbackListener(updateMapLayer));
        }

        // close the dialog
        dismissDialog(ATTRIBUTE_EDITOR_DIALOG_ID);

      }
    };

  }

  /**
   * OnClick method for the Discard button
   */
  public OnClickListener returnOnClickDiscardChangesListener() {

    return new OnClickListener() {

      public void onClick(View v) {

        // close the dialog
        dismissDialog(ATTRIBUTE_EDITOR_DIALOG_ID);

      }
    };

  }

  /**
   * Helper method to create a CallbackListener<FeatureEditResult[][]>
   * 
   * @return CallbackListener<FeatureEditResult[][]>
   */
  CallbackListener<FeatureEditResult[][]> createEditCallbackListener(final boolean updateLayer) {

    return new CallbackListener<FeatureEditResult[][]>() {

      public void onCallback(FeatureEditResult[][] result) {

        // check the response for success or failure
        if (result[2] != null && result[2][0] != null && result[2][0].isSuccess()) {

          Log.d(AttributeEditorActivity.TAG, "Success updating feature with id=" + result[2][0].getObjectId());

          // see if we want to update the dynamic layer to get new symbols for
          // updated features
          if (updateLayer) {

              dmsl.refresh();

          }
        }
      }

      public void onError(Throwable e) {

        Log.d(AttributeEditorActivity.TAG, "error updating feature: " + e.getLocalizedMessage());

      }
    };
  }
}




Java Source Code List

com.arcgis.android.samples.ExportTileCacheTask.ExportTileCacheTaskSampleActivity.java
com.arcgis.android.samples.cloudportal.featureservicetablequery.MainActivity.java
com.arcgis.android.samples.cloudportal.querycloudfeatureservice.MainActivity.java
com.arcgis.android.samples.dynamiclayer.DynamicLayerRendererActivity.java
com.arcgis.android.samples.geometrysample.BufferFragment.java
com.arcgis.android.samples.geometrysample.GeometrySampleActivity.java
com.arcgis.android.samples.geometrysample.GeometryUtil.java
com.arcgis.android.samples.geometrysample.SampleListFragment.java
com.arcgis.android.samples.geometrysample.SpatialRelationshipsFragment.java
com.arcgis.android.samples.geometrysample.UnionDifferenceFragment.java
com.arcgis.android.samples.localdata.localrasterdata.EditTextUtils.java
com.arcgis.android.samples.localdata.localrasterdata.FileBrowserFragment.java
com.arcgis.android.samples.localdata.localrasterdata.HillshadeRendererParametersFragment.java
com.arcgis.android.samples.localdata.localrasterdata.MainActivity.java
com.arcgis.android.samples.localdata.localrasterdata.OnDialogDismissListener.java
com.arcgis.android.samples.localdata.localrasterdata.RendererType.java
com.arcgis.android.samples.localdata.localrasterdata.StretchParametersFragment.java
com.arcgis.android.samples.maps.basemaps.MainActivity.java
com.arcgis.android.samples.maps.fragmentmanagement.BasemapListFragment.java
com.arcgis.android.samples.maps.fragmentmanagement.MainActivity.java
com.arcgis.android.samples.maps.fragmentmanagement.MapFragment.java
com.arcgis.android.samples.maps.helloworld.MainActivity.java
com.arcgis.android.samples.maps.maplegend.LegendDialogFragment.java
com.arcgis.android.samples.maps.maplegend.MainActivity.java
com.arcgis.android.samples.maps.maprotation.Compass.java
com.arcgis.android.samples.maps.maprotation.MainActivity.java
com.arcgis.android.samples.maps.switchmaps.MainActivity.java
com.arcgis.android.samples.maps.switchmaps.MapFragment.java
com.arcgis.android.samples.milsym2525c.MainActivity.java
com.arcgis.android.samples.milsym2525c.Mil2525cMessageParser.java
com.arcgis.android.samples.oauth2sample.MapFragment.java
com.arcgis.android.samples.oauth2sample.OAuth2Sample.java
com.arcgis.android.samples.oauth2sample.UserContentActivity.java
com.arcgis.android.samples.oauth2sample.UserContentArrayAdapter.java
com.arcgis.android.samples.oauth2sample.UserContentFragment.java
com.arcgis.android.samples.oauth2sample.UserWebmaps.java
com.arcgis.android.samples.search.placesearch.MainActivity.java
com.esri.android.sample.closestfacilities.MainActivity.java
com.esri.android.samples.mbtiles.LocalMBTiles.java
com.esri.android.samples.mbtiles.MBTilesLayer.java
com.esri.android.samples.mgrsgrid.LocateMGRSActivity.java
com.esri.arcgis.android.sample.runtimegeodb.CreateRuntimeGeodatabaseActivity.java
com.esri.arcgis.android.sample.simplemap.SimpleMapActivity.java
com.esri.arcgis.android.sample.simplemap.SimpleMapFragment.java
com.esri.arcgis.android.sample.simplemap.SingleFragmentActivity.java
com.esri.arcgis.android.samples.GeoJSONEarthquakeMap.GeoJSONEarthquakeMapActivity.java
com.esri.arcgis.android.samples.PopupUICustomization.LayerQueryTask.java
com.esri.arcgis.android.samples.PopupUICustomization.MyAttachmentsView.java
com.esri.arcgis.android.samples.PopupUICustomization.MyEditAttributesAdapter.java
com.esri.arcgis.android.samples.PopupUICustomization.MyMediaAdapter.java
com.esri.arcgis.android.samples.PopupUICustomization.MyMediaView.java
com.esri.arcgis.android.samples.PopupUICustomization.MyReadOnlyAttributesAdapter.java
com.esri.arcgis.android.samples.PopupUICustomization.MyTitleView.java
com.esri.arcgis.android.samples.PopupUICustomization.PopupFragment.java
com.esri.arcgis.android.samples.PopupUICustomization.PopupUICustomizationActivity.java
com.esri.arcgis.android.samples.addcsv2graphic.AddCSVActivity.java
com.esri.arcgis.android.samples.attributeeditor.AttributeEditorActivity.java
com.esri.arcgis.android.samples.attributeeditor.AttributeItem.java
com.esri.arcgis.android.samples.attributeeditor.AttributeListAdapter.java
com.esri.arcgis.android.samples.attributeeditor.FeatureLayerUtils.java
com.esri.arcgis.android.samples.basiclicense.MainActivity.java
com.esri.arcgis.android.samples.basiclicense.MessageDialogFragment.java
com.esri.arcgis.android.samples.classbreaksrenderer.ClassBreaksRendererActivity.java
com.esri.arcgis.android.samples.featuredusergroup.FeaturedGroupsActivity.java
com.esri.arcgis.android.samples.featuredusergroup.GroupsFragment.java
com.esri.arcgis.android.samples.featuredusergroup.ItemsFragment.java
com.esri.arcgis.android.samples.featuredusergroup.MapActivity.java
com.esri.arcgis.android.samples.geometryeditor.ConfirmDiscardDialogFragment.java
com.esri.arcgis.android.samples.geometryeditor.EditFailedDialogFragment.java
com.esri.arcgis.android.samples.geometryeditor.FeatureTypeData.java
com.esri.arcgis.android.samples.geometryeditor.FeatureTypeDialogFragment.java
com.esri.arcgis.android.samples.geometryeditor.GeometryEditorActivity.java
com.esri.arcgis.android.samples.identifytask.Identify.java
com.esri.arcgis.android.samples.measure.MainActivity.java
com.esri.arcgis.android.samples.nearby.Nearby.java
com.esri.arcgis.android.samples.offlineeditor.GDBUtil.java
com.esri.arcgis.android.samples.offlineeditor.OfflineActions.java
com.esri.arcgis.android.samples.offlineeditor.OfflineEditorActivity.java
com.esri.arcgis.android.samples.offlineeditor.TemplatePicker.java
com.esri.arcgis.android.samples.offlineroutingandgeocoding.RoutingAndGeocoding.java
com.esri.arcgis.android.samples.popupinwebmapforediting.PopupInWebmapForEditing.java
com.esri.arcgis.android.samples.popupinwebmapforviewing.PopupInWebmapForViewing.java
com.esri.arcgis.android.samples.querytask.MainActivity.java
com.esri.arcgis.android.samples.routing.MyAdapter.java
com.esri.arcgis.android.samples.routing.RoutingDialogFragment.java
com.esri.arcgis.android.samples.routing.RoutingListFragment.java
com.esri.arcgis.android.samples.routing.RoutingSample.java
com.esri.arcgis.android.samples.servicearea.EditFragment.java
com.esri.arcgis.android.samples.servicearea.ServiceAreaSample.java
com.esri.arcgis.android.samples.standardlicense.MainActivity.java
com.esri.arcgis.android.samples.standardlicense.MessageDialogFragment.java
com.esri.arcgis.android.samples.standardlicenseoffline.MainActivity.java
com.esri.arcgis.android.samples.standardlicenseoffline.MessageDialogFragment.java
com.esri.arcgis.android.samples.uniquevaluerenderer.UniqueValueRendererSampleActivity.java
com.esri.arcgis.android.samples.viewshed.Viewshed.java
com.esri.arcgis.android.samples.wmslayer.MainActivity.java
com.esri.arcgis.samples.offlineanalysis.MainActivity.java