Dialog是Android提供的各种对话框的基类,和上篇的DialogFragment类似。为什么还要介绍Dialog呢,因为DialogFragment只能运行在Android3.0以上的系统中。虽然现在手机更新的很快,Android系统更新的也很快,但是Android3.0系统以下的用户,还是存在不少的。所以采用Dialog拥有一定的优势。
这篇文章需要实现的是arcgis for android 的地图切换,gis系统一般会为用户提供多种用户的选中,地图切换是必须的。
1.mapswitchDialog
在res的layout中新建android的xml文档。
1 <?xml version="1.0" encoding="utf-8"?> 2 <RelativeLayout android:layout_width="fill_parent" 3 android:layout_height="fill_parent" 4 android:background="@color/white" 5 android:orientation="vertical" xmlns:android="http://schemas.android.com/apk/res/android"> 6 7 <LinearLayout 8 android:id="@+id/l1" 9 android:layout_width="fill_parent" 10 android:layout_height="wrap_content" 11 android:background="@drawable/common_top_layer_with_projection_bg" 12 android:gravity="center" 13 android:orientation="horizontal" > 14 15 <ImageButton 16 android:id="@+id/imgswichclose" 17 android:layout_width="wrap_content" 18 android:layout_height="wrap_content" 19 android:clickable="true" 20 android:src="@drawable/icon_cancel_normal" /> 21 22 <TextView 23 android:layout_width="fill_parent" 24 android:layout_height="fill_parent" 25 android:layout_gravity="center" 26 android:gravity="right|center" 27 android:text="@string/switchmap" 28 android:textColor="@color/black" 29 android:textSize="12sp" /> 30 31 </LinearLayout> 32 33 <LinearLayout 34 android:layout_width="fill_parent" 35 android:layout_height="wrap_content" 36 android:layout_below="@id/l1" 37 android:orientation="horizontal" > 38 39 <LinearLayout 40 android:layout_width="wrap_content" 41 android:layout_height="wrap_content" 42 android:layout_below="@id/l1" 43 android:gravity="center" 44 android:orientation="vertical" > 45 46 <ImageButton 47 android:id="@+id/imgmap_1" 48 android:layout_width="wrap_content" 49 android:layout_height="wrap_content" 50 android:src="@drawable/main_map_mode_3d_normal" /> 51 52 <TextView 53 android:layout_width="wrap_content" 54 android:layout_height="wrap_content" 55 android:text="@string/smap1" 56 android:textColor="@color/black" 57 android:layout_gravity="center" 58 android:gravity="right|center" /> 59 60 </LinearLayout> 61 62 <LinearLayout 63 android:id="@+id/l3" 64 android:layout_width="wrap_content" 65 android:layout_height="wrap_content" 66 android:layout_marginLeft="20dp" 67 android:gravity="center" 68 android:orientation="vertical" > 69 70 <ImageButton 71 android:id="@+id/imgmap_2" 72 android:layout_width="wrap_content" 73 android:layout_height="wrap_content" 74 android:src="@drawable/main_map_mode_3d_normal" /> 75 76 <TextView 77 android:layout_width="wrap_content" 78 android:layout_height="wrap_content" 79 android:layout_gravity="center" 80 android:text="@string/map_2" 81 android:textColor="@color/black" /> 82 83 </LinearLayout> 84 </LinearLayout> 85 </RelativeLayout>
这个xml文档,也就是我们所说的地图切换的布局页面。
2.建立mapSwitchDialog类
在类中,和DialogFragment情况相似,需要实现onCreate()方法。
1 public class MapswichFragment extends Dialog { 2 3 4 private refreshUIListener listenr; 5 public MapswichFragment(Context context) { 6 super(context); 7 // TODO Auto-generated constructor stub 8 } 9 public MapswichFragment(Context context,refreshUIListener listener) 10 { 11 super(context); 12 this.listenr=listener; 13 } 14 protected void onCreate(Bundle savedInstanceState) { 15 // TODO Auto-generated method stub 16 super.onCreate(savedInstanceState); 17 this.setContentView(R.layout.mapswitch_fragment); 18 ImageView image1=(ImageView)findViewById(R.id.imgswichclose); 19 image1.setOnClickListener(new View.OnClickListener() { 20 21 public void onClick(View v) { 22 // TODO Auto-generated method stub 23 dismiss(); 24 } 25 }); 26 ImageButton img1=(ImageButton)findViewById(R.id.imgmap_1); 27 img1.setOnClickListener(new View.OnClickListener() { 28 29 public void onClick(View v) { 30 // TODO Auto-generated method stub 31 listenr.refreshUi(); 32 33 } 34 35 }); 36 } 37 public interface refreshUIListener 38 { 39 public void refreshUi(); 40 } 41 42 }
在oncreate方法中,为该dialog指定页面。需要强调的是,在进行地图切换的时候,地图需要实时的在手机上进行显示,也就是我们点击dialog中的图片按钮,Activity要进行更新。在网上看到别人的解决方法还不错,通过定义接口的方法来实现。定义一个事件监听的接口,并在接口中定义一个方法,在构造函数中初始化该监听,在事件中调用该方法。
3.main.xml
main.xml是主页面,这里就不多说了,需要添加一个mapview和一个button。mapview用来显示地图,button用来切换地图。
button的监听事件中调用刚刚定义的dialog就可以实现地图切换。
1 ImageButton imgswitch=(ImageButton)findViewById(R.id.btnmapswitch); 2 imgswitch.setOnClickListener(new View.OnClickListener() { 3 4 @Override 5 public void onClick(View v) { 6 // TODO Auto-generated method stub 7 MapswichFragment frag=new MapswichFragment(MainMapActivity.this,new MapswichFragment.refreshUIListener() { 8 9 @Override 10 public void refreshUi() { 11 // TODO Auto-generated method stub 12 mMapView.removeAll(); 13 ArcGISTiledMapServiceLayer titleLayer=new ArcGISTiledMapServiceLayer(layerurl); 14 mMapView.addLayer(titleLayer); 15 mMapView.addLayer(graphcisLayer); 16 } 17 }); 18 frag.requestWindowFeature(Window.FEATURE_NO_TITLE); 19 frag.show(); 20 } 21 });
4.dialog.style
通过style设置dialog的样式。
1 <style name="dialog" parent="@android:style/Theme.Dialog"> 2 <item name="android:windowFrame">@null</item><!--边框--> 3 <item name="android:windowIsFloating">true</item><!--是否浮现在activity之上--> 4 <item name="android:windowIsTranslucent">false</item><!--半透明--> 5 <item name="android:windowNoTitle">true</item><!--无标题--> 6 <item name="android:windowBackground">@color/transparent</item><!--背景透明--> 7 <item name="android:backgroundDimEnabled">false</item><!--模糊--> 8 </style>
5.定义dialog位置
通过windowmanager设置dialog的显示位置。
1 Window dialogWindow=frag.getWindow(); 2 WindowManager.LayoutParams lg= dialogWindow.getAttributes(); 3 4 dialogWindow.setGravity(Gravity.RIGHT|Gravity.TOP); 5 lg.y=90; 6 lg.x=20; 7 lg.height=android.view.WindowManager.LayoutParams.WRAP_CONTENT; 8 lg.width=(int)(getWindowManager().getDefaultDisplay().getWidth()); 9 dialogWindow.setAttributes(lg); 10 11 frag.setCanceledOnTouchOutside(true);