先说下,一开始学习android使用的是AlertDialog,对付最简单的要求还算可以,后来要适用各种对话框,还要死乞白赖使用AlertDialog,那是找死。
贴一个几乎万能的简单dialog,首先定义对话框的style:
<style name="dialog" parent="@android:style/Theme.Dialog"> <item name="android:windowFrame">@null</item><!--边框--> <item name="android:windowIsFloating">true</item><!--是否浮现在activity之上--> <item name="android:windowIsTranslucent">true</item><!--半透明--> <item name="android:windowNoTitle">true</item><!--无标题--> <item name="android:background">@android:color/transparent</item><!--背景透明--> <item name="android:windowBackground">@android:color/transparent</item> <item name="android:backgroundDimEnabled">true</item><!--蒙板--> <item name="android:backgroundDimAmount">0.6</item><!--蒙板模糊程度--> <item name="android:windowAnimationStyle">@style/Dialog_Anim</item> </style> <style name="Dialog_Anim"> <item name="android:windowEnterAnimation">@anim/fading_in</item> <item name="android:windowExitAnimation">@anim/fading_out</item> </style>
首先,android:windowAnimationStyle是给dialog的window添加动画效果的,上面的动画从名字就可以看出是个淡入淡出效果,那么我贴出几种常用的效果吧:
1.淡入淡出:
fading_in.xml:
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <alpha android:duration="500" android:fromAlpha="0.1" android:toAlpha="1.0" /> </set>
fading_out.xml:
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <alpha android:duration="500" android:fromAlpha="1.0" android:toAlpha="0.1" /> </set>
2.擦除
可惜有很多属性不知道,比如上面的window开头的属性eclipse不会自动提示,怎么破?多多积累吧。sytle是个好东西,知道的属性多了以后简直无所不能,贴一个不错的例子网址拓展思维:http://www.cnblogs.com/jiezzy/archive/2012/09/06/2673229.html
java代码中,new对话框的时候使用构造器Dialog(Context context, int theme),并且使用setContentView()方法把要使用的布局加载进去就OK了:
dialog = new Dialog(context,R.style.dialog); dialog.setContentView(R.layout.XXX); dialog.setCancelable(true); dialog.show();
setContentView()的参数可以是View也可以是layout资源文件。如果这个布局中需要取得组件id,直接dialog.findViewById就行了。
接下来贴出一个网上的demo,里面提供了设置dialog位置、大小、透明度的方法:
import android.app.Activity; import android.app.Dialog; import android.os.Bundle; import android.view.Gravity; import android.view.Window; import android.view.WindowManager; public class DialogDemoActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Dialog dialog = new Dialog(this); // setContentView可以设置为一个View也可以简单地指定资源ID // LayoutInflater // li=(LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE); // View v=li.inflate(R.layout.dialog_layout, null); // dialog.setContentView(v); dialog.setContentView(R.layout.dialog_layout); dialog.setTitle("Custom Dialog"); /* * 获取对话框的窗口对象及参数对象以修改对话框的布局设置, * 可以直接调用getWindow(),表示获得这个Activity的Window * 对象,这样这可以以同样的方式改变这个Activity的属性. */ Window dialogWindow = dialog.getWindow(); WindowManager.LayoutParams lp = dialogWindow.getAttributes(); dialogWindow.setGravity(Gravity.LEFT | Gravity.TOP); /* * lp.x与lp.y表示相对于原始位置的偏移. * 当参数值包含Gravity.LEFT时,对话框出现在左边,所以lp.x就表示相对左边的偏移,负值忽略. * 当参数值包含Gravity.RIGHT时,对话框出现在右边,所以lp.x就表示相对右边的偏移,负值忽略. * 当参数值包含Gravity.TOP时,对话框出现在上边,所以lp.y就表示相对上边的偏移,负值忽略. * 当参数值包含Gravity.BOTTOM时,对话框出现在下边,所以lp.y就表示相对下边的偏移,负值忽略. * 当参数值包含Gravity.CENTER_HORIZONTAL时 * ,对话框水平居中,所以lp.x就表示在水平居中的位置移动lp.x像素,正值向右移动,负值向左移动. * 当参数值包含Gravity.CENTER_VERTICAL时 * ,对话框垂直居中,所以lp.y就表示在垂直居中的位置移动lp.y像素,正值向右移动,负值向左移动. * gravity的默认值为Gravity.CENTER,即Gravity.CENTER_HORIZONTAL | * Gravity.CENTER_VERTICAL. * * 本来setGravity的参数值为Gravity.LEFT | Gravity.TOP时对话框应出现在程序的左上角,但在 * 我手机上测试时发现距左边与上边都有一小段距离,而且垂直坐标把程序标题栏也计算在内了, * Gravity.LEFT, Gravity.TOP, Gravity.BOTTOM与Gravity.RIGHT都是如此,据边界有一小段距离 */ lp.x = 100; // 新位置X坐标 lp.y = 100; // 新位置Y坐标 lp.width = 300; // 宽度 lp.height = 300; // 高度 lp.alpha = 0.7f; // 透明度 // 当Window的Attributes改变时系统会调用此函数,可以直接调用以应用上面对窗口参数的更改,也可以用setAttributes // dialog.onWindowAttributesChanged(lp); dialogWindow.setAttributes(lp); /* * 将对话框的大小按屏幕大小的百分比设置 */ // WindowManager m = getWindowManager(); // Display d = m.getDefaultDisplay(); // 获取屏幕宽、高用 // WindowManager.LayoutParams p = dialogWindow.getAttributes(); // 获取对话框当前的参数值 // p.height = (int) (d.getHeight() * 0.6); // 高度设置为屏幕的0.6 // p.width = (int) (d.getWidth() * 0.65); // 宽度设置为屏幕的0.65 // dialogWindow.setAttributes(p); dialog.show(); } }