Android Open Source - arcgis-runtime-samples-android Popup In Webmap For Viewing






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 2010 ESRI
 *//  w w w  . ja  v  a 2s.c  om
 * 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.popupinwebmapforviewing;

import java.util.ArrayList;
import java.util.concurrent.atomic.AtomicInteger;

import android.app.Activity;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.ViewGroup.LayoutParams;
import android.widget.LinearLayout;

import com.esri.android.map.Layer;
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.ArcGISLayerInfo;
import com.esri.android.map.event.OnSingleTapListener;
import com.esri.android.map.popup.Popup;
import com.esri.android.map.popup.PopupContainer;
import com.esri.core.geometry.Envelope;
import com.esri.core.geometry.SpatialReference;
import com.esri.core.map.Feature;
import com.esri.core.map.FeatureSet;
import com.esri.core.map.popup.PopupInfo;
import com.esri.core.tasks.ags.query.Query;
import com.esri.core.tasks.ags.query.QueryTask;

/*
 * NOTE: TO RUN THIS SAMPLE YOU NEED THE ANDROID SUPPORT LIBRARY! 
 * 
 * Developing with the ArcGIS for Android Popup API uses Android API's that are 
 * not available on all supported platforms. In order to use this sample you will
 * need to add this to your project. 
 * 
 * Right click the project and select Android Tools > Add Support Library... 
 * and follow the wizard.
 *
 */
public class PopupInWebmapForViewing extends Activity {
  private MapView map;
  private PopupContainer popupContainer;
  private PopupDialog popupDialog;
  private ProgressDialog progressDialog;
  private AtomicInteger count;
  
  /** Called when the activity is first created. */    
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    
    // Load a webmap.
    map = new MapView(this, "http://www.arcgis.com/home/item.html?id=81d2dcf906cf4df4889ec36c8dc0c1f9", "", "");
    setContentView(map);
    
    // Tap on the map and show popups for selected features.
    map.setOnSingleTapListener(new OnSingleTapListener() {
      private static final long serialVersionUID = 1L;

      public void onSingleTap(float x, float y) {      
        if (map.isLoaded()) {
          // Instantiate a PopupContainer
          popupContainer = new PopupContainer(map);
          int id = popupContainer.hashCode();
          popupDialog = null;
          // Display spinner.
          if (progressDialog == null || !progressDialog.isShowing())
            progressDialog = ProgressDialog.show(map.getContext(), "", "Querying...");

          // Loop through each layer in the webmap
          int tolerance = 20;
          Envelope env = new Envelope(map.toMapPoint(x, y), 20 * map.getResolution(), 20 * map.getResolution());
          Layer[] layers = map.getLayers();
          count = new AtomicInteger();
          for (Layer layer : layers) {
            // If the layer has not been initialized or is invisible, do nothing.
            if (!layer.isInitialized() || !layer.isVisible())
              continue;
            
            if (layer instanceof ArcGISFeatureLayer) { 
              // Query feature layer and display popups
              ArcGISFeatureLayer featureLayer = (ArcGISFeatureLayer) layer;                  
              if (featureLayer.getPopupInfo() != null) {
                // Query feature layer which is associated with a popup definition.
                count.incrementAndGet();
                new RunQueryFeatureLayerTask(x, y, tolerance, id).execute(featureLayer);
              }
            }
            else if (layer instanceof ArcGISDynamicMapServiceLayer) { 
              // Query dynamic map service layer and display popups.
              ArcGISDynamicMapServiceLayer dynamicLayer = (ArcGISDynamicMapServiceLayer) layer;
              // Retrieve layer info for each sub-layer of the dynamic map service layer.
              ArcGISLayerInfo[] layerinfos = dynamicLayer.getAllLayers();
              if (layerinfos == null)
                continue;
              
              // Loop through each sub-layer
              for (ArcGISLayerInfo layerInfo : layerinfos) {
                // Obtain PopupInfo for sub-layer.
                PopupInfo popupInfo = dynamicLayer.getPopupInfo(layerInfo.getId());
                // Skip sub-layer which is without a popup definition.
                if (popupInfo == null) {
                  continue;
                }
                // Check if a sub-layer is visible.
                ArcGISLayerInfo info = layerInfo;
                while ( info != null && info.isVisible() ) {
                  info = info.getParentLayer();
                }
                // Skip invisible sub-layer
                if ( info != null && ! info.isVisible() ) {
                  continue;
                };

                // Check if the sub-layer is within the scale range
                double maxScale = (layerInfo.getMaxScale() != 0) ? layerInfo.getMaxScale():popupInfo.getMaxScale();
                double minScale = (layerInfo.getMinScale() != 0) ? layerInfo.getMinScale():popupInfo.getMinScale();

                if ((maxScale == 0 || map.getScale() > maxScale) && (minScale == 0 || map.getScale() < minScale)) {
                  // Query sub-layer which is associated with a popup definition and is visible and in scale range.
                  count.incrementAndGet();
                  new RunQueryDynamicLayerTask(env, layer, layerInfo.getId(), dynamicLayer.getSpatialReference(), id).execute(dynamicLayer.getUrl() + "/" + layerInfo.getId());
                }
              }
            }            
          }
        }
      }
    });
  }
  
  private void createPopupViews(Feature[] features, final int id) {
    if ( id != popupContainer.hashCode() ) {
      if (progressDialog != null && progressDialog.isShowing() && count.intValue() == 0) 
        progressDialog.dismiss();

      return;
    }

    if (popupDialog == null) {
      if (progressDialog != null && progressDialog.isShowing()) 
        progressDialog.dismiss();
      
      // Create a dialog for the popups and display it.
      popupDialog = new PopupDialog(map.getContext(), popupContainer);
      popupDialog.show();
    }
  }
  
  // Query feature layer by hit test
  private class RunQueryFeatureLayerTask extends AsyncTask<ArcGISFeatureLayer, Void, Feature[]> {

    private int tolerance;
    private float x;
    private float y;
    private ArcGISFeatureLayer featureLayer;
    private int id;

    public RunQueryFeatureLayerTask(float x, float y, int tolerance, int id) {
      super();
      this.x = x;
      this.y = y;
      this.tolerance = tolerance;
      this.id = id;
    }

    @Override
    protected Feature[] doInBackground(ArcGISFeatureLayer... params) {
      for (ArcGISFeatureLayer featureLayer : params) {
        this.featureLayer = featureLayer;
        // Retrieve feature ids near the point.
        int[] ids = featureLayer.getGraphicIDs(x, y, tolerance);
        if (ids != null && ids.length > 0) {
          ArrayList<Feature> features = new ArrayList<Feature>();
          for (int id : ids) {
            // Obtain feature based on the id.
            Feature f = featureLayer.getGraphic(id);
            if (f == null)
              continue;
            features.add(f);
          }
          // Return an array of features near the point.
          return features.toArray(new Feature[0]);
        }
      }
      return null;
    }

    @Override
    protected void onPostExecute(Feature[] features) {
      count.decrementAndGet();
      if (features == null || features.length == 0) {
        if (progressDialog != null && progressDialog.isShowing() && count.intValue() == 0) 
          progressDialog.dismiss();
        
        return;
      }
      // Check if the requested PopupContainer id is the same as the current PopupContainer.
      // Otherwise, abandon the obsoleted query result.
      if ( id != popupContainer.hashCode() ) {
        if (progressDialog != null && progressDialog.isShowing() && count.intValue() == 0) 
          progressDialog.dismiss();
        
        return;
      }

      for (Feature fr : features) {
        Popup popup = featureLayer.createPopup(map, 0, fr);
        popupContainer.addPopup(popup);
      }
      createPopupViews(features, id);
    }

  }
  
  // Query dynamic map service layer by QueryTask
  private class RunQueryDynamicLayerTask extends AsyncTask<String, Void, FeatureSet> {
    private Envelope env;
    private SpatialReference sr;
    private int id;
    private Layer layer;
    private int subLayerId;

    public RunQueryDynamicLayerTask(Envelope env, Layer layer, int subLayerId, SpatialReference sr, int id) {
      super();
      this.env = env;
      this.sr = sr;
      this.id = id;
      this.layer = layer;
      this.subLayerId = subLayerId;
    }

    @Override
    protected FeatureSet doInBackground(String... urls) {
      for (String url : urls) {
        // Retrieve features within the envelope.
        Query query = new Query();
        query.setInSpatialReference(sr);
        query.setOutSpatialReference(sr);
        query.setGeometry(env);
        query.setMaxFeatures(10);
        query.setOutFields(new String[] { "*" });

        QueryTask queryTask = new QueryTask(url);
        try {
          FeatureSet results = queryTask.execute(query);
          return results;
        } catch (Exception e) {
          e.printStackTrace();
        }
      }
      return null;
    }

    @Override
    protected void onPostExecute(final FeatureSet result) {
      count.decrementAndGet();
      if (result == null) {
        if (progressDialog != null && progressDialog.isShowing() && count.intValue() == 0) 
          progressDialog.dismiss();

        return;
      }
      
      Feature[] features = result.getGraphics();
      if (features == null || features.length == 0) {
        if (progressDialog != null && progressDialog.isShowing() && count.intValue() == 0) 
          progressDialog.dismiss();

        return;
      }
      // Check if the requested PopupContainer id is the same as the current PopupContainer.
      // Otherwise, abandon the obsoleted query result.
      if (id != popupContainer.hashCode()) {
        // Dismiss spinner
        if (progressDialog != null && progressDialog.isShowing() && count.intValue() == 0) 
          progressDialog.dismiss();

        return;
      }
      PopupInfo popupInfo = layer.getPopupInfo(subLayerId);
      if (popupInfo == null) {
        // Dismiss spinner
        if (progressDialog != null && progressDialog.isShowing() && count.intValue() == 0)  
          progressDialog.dismiss();

        return;
      }
      
      for (Feature fr : features) {
        Popup popup = layer.createPopup(map, subLayerId, fr);
        popupContainer.addPopup(popup);
      }
      createPopupViews(features, id);
      
    }
  }
  
  // A customize full screen dialog.
  private class PopupDialog extends Dialog {
    private PopupContainer popupContainer;
    
    public PopupDialog(Context context, PopupContainer popupContainer) {
      super(context, android.R.style.Theme);
      this.popupContainer = popupContainer;
    }
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
      LinearLayout layout = new LinearLayout(getContext());
      layout.addView(popupContainer.getPopupContainerView(), android.widget.LinearLayout.LayoutParams.FILL_PARENT, android.widget.LinearLayout.LayoutParams.FILL_PARENT);
      setContentView(layout, params);
    }
    
  }
  
}




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