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);