本文主要添加ArcGIS底圖操作,在第一篇的ArcGIS for android 執行個體應用之前期準備(http://blog.csdn.net/u012224838/article/details/46366375)的基礎上實作添加包含多個圖層的地圖控件并通過按鈕選擇顯示。
文章主體引用官網:https://developers.arcgis.com/android/guide/use-arcgis-basemaps.htm
1、在Android項目視圖視窗中,選擇app>res>layout>activity_main.xml。
2、在視窗左下方選擇Text按鈕檢視xml文檔。
3、将其中Textview段替換為以下map段。
<com.esri.android.map.MapView
android:id="@+id/map"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
mapoptions.MapType="Topo"
mapoptions.ZoomLevel="13"
mapoptions.center="33.666354, -117.903557" />
4、在Android項目視圖視窗中,選擇
app>java>com.**.android.samples.sample1>MainActivity,在 MainActivity類下的第一行添加map控件申明:
// The MapView.
MapView mMapView = null;
此時會出現報錯,因為mapview控件還不能被識别,需要引入esri的接口包。将滑鼠停止剛加的代碼上會出現ALT+Enter 提示,即可自動引入包。或者可以手動粘貼代碼
import com.esri.android.map.MapView;
即可。

5、在onCreat下添加以下代碼以完成mapview控件定義:
// *Retrieve the map and initial extent from XML layout*
mMapView = (MapView) findViewById(R.id.map);
// *Enable map to wrap around date line.*
mMapView.enableWrapAround(true);
6、在onPause和onResume方法下添加以下代碼以設定當暫停或繼續時的mapview響應
protected void onPause() {
super.onPause();
mMapView.pause();
}
protected void onResume() {
super.onResume();
mMapView.unpause();
}
至此,代碼段定義完畢,下面添加相應的布局及菜單控件。
7、打開app>res>menu>menu_main.xml文檔, 将其中的Item内的内容全部替換為以下代碼:
<group android:checkableBehavior="single">
<item
android:id="@+id/World_Street_Map"
android:showAsAction="never"
android:title="@string/StreetMapMenu" />
<item
android:id="@+id/World_Topo"
android:showAsAction="never"
android:title="@string/TopoMenu" />
<item
android:id="@+id/Gray"
android:showAsAction="never"
android:title="@string/GrayMenu" />
<item
android:id="@+id/Ocean_Basemap"
android:showAsAction="never"
android:title="@string/OceanMenu" />
</group>
此時肯定報錯,因為各個字元串并未定義,下面定義字元串。
8、打開app>res>values>string.xml,添加以下字元串定義語句:
<!-- basemap menu items -->
<string name="StreetMapMenu">Streets</string>
<string name="TopoMenu">Topographic</string>
<string name="GrayMenu">Gray</string>
<string name="OceanMenu">Oceans</string>
9、在代碼段内添加以上的選擇功能。首先在MainActivity類下添加一下代碼申明:
// The basemap switching menu items.
MenuItem mStreetsMenuItem = null;
MenuItem mTopoMenuItem = null;
MenuItem mGrayMenuItem = null;
MenuItem mOceansMenuItem = null;
// Create MapOptions for each type of basemap.
final MapOptions mTopoBasemap = new MapOptions(MapOptions.MapType.TOPO);
final MapOptions mStreetsBasemap = new MapOptions(MapOptions.MapType.STREETS);
final MapOptions mGrayBasemap = new MapOptions(MapOptions.MapType.GRAY);
final MapOptions mOceansBasemap = new MapOptions(MapOptions.MapType.OCEANS);
同時需要引入import com.esri.android.map.MapOptions;
在onCreateOptionsMenu下的兩行代碼之間插入以下控件定義
// Get the basemap switching menu items.
mStreetsMenuItem = menu.getItem(0);
mTopoMenuItem = menu.getItem(1);
mGrayMenuItem = menu.getItem(2);
mOceansMenuItem = menu.getItem(3);
// Also set the topo basemap menu item to be checked, as this is the default.
mTopoMenuItem.setChecked(true);
在onOptionsItemSelected方法中用以下代碼替換其中的所有代碼
// Handle menu item selection.
switch (item.getItemId()) {
case R.id.World_Street_Map:
mMapView.setMapOptions(mStreetsBasemap);
mStreetsMenuItem.setChecked(true);
return true;
case R.id.World_Topo:
mMapView.setMapOptions(mTopoBasemap);
mTopoMenuItem.setChecked(true);
return true;
case R.id.Gray:
mMapView.setMapOptions(mGrayBasemap);
mGrayMenuItem.setChecked(true);
return true;
case R.id.Ocean_Basemap:
mMapView.setMapOptions(mOceansBasemap);
mOceansMenuItem.setChecked(true);
return true;
default:
return super.onOptionsItemSelected(item);
}
另在代碼段的開頭部分,本篇所需引入的包如下:
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
import com.esri.android.map.MapOptions;
import com.esri.android.map.MapView;
import com.esri.android.map.event.OnStatusChangedListener;
import com.esri.core.geometry.Polygon;
至此所有代碼及定義申明添加完畢,運作如下: