Android学习自定义Dialog

时间:2022-04-29
本文章向大家介绍Android学习自定义Dialog,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

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