基础
动画
通过android:windowEnterAnimation与android:windowExitAnimation可以定义dialog的动画。如下:
<style name="dialogAnimation">
<item name="android:windowEnterAnimation">@anim/dialog_enter</item>
<item name="android:windowExitAnimation">@anim/anim_exit</item>
</style>
应用
Dialog d = new ProgressDialog(MainActivity.this);
Window window = d.getWindow();//得到window
params = (WindowManager.LayoutParams)window.getAttributes();
params.windowAnimations = R.style.dialogAnimation;//引用style文件的id
ProgressDialog
它是进度条对话框,因为在该对话框上含有一个进度条。因此,它主要是用来在执行一些耗时操作时显示的。如:删除信息时.
其中的进度条默认是圆形的。
示例:
final ProgressDialog dialog = new ProgressDialog(this);
dialog.setMax(100);//为进度条设置最大值
//将圆形有进度条改成横条状
dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
dialog.show();
final ScheduledExecutorService service = Executors
.newSingleThreadScheduledExecutor();
service.scheduleAtFixedRate(new Runnable() {
public void run() {
//使进度条每次都增加1
dialog.incrementProgressBy(1);
if (count == 100) {
service.shutdown();
dialog.dismiss();
}
count++;
}
}, 4000, 100, TimeUnit.MILLISECONDS);
也可以为ProgressDialog设置按钮:
dialog.setButton(DialogInterface.BUTTON_NEGATIVE, "12", new OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
}
});
dialog.setButton(DialogInterface.BUTTON_POSITIVE, "fda", new OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
}
});
DatePickerDialog
选择时间的dialog。样式如下:
代码如下:
DatePickerDialog dialog = new DatePickerDialog(this, new OnDateSetListener() {
public void onDateSet(DatePicker view, int year, int monthOfYear,
int dayOfMonth) {
System.out.println("onDateSet");
}//当点击下面的完成按钮时.monthOfYear是从0到11.超过11会顺延到下一年
}, 2012, 11, 1);
dialog.show();
TimePickerDialog
与DatePickerDialog显示的类似。只不过它是显示一天的时间。从参数就可以看出。示例如下:
TimePickerDialog dialog = new TimePickerDialog(this, new OnTimeSetListener() {
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
System.out.println('a'+"-----");
}
}, 13, 66, false);
dialog.show();
自定义Dialog
虽然通过Builder中的setView与setCustomTitle()可以实现一定的自定义,但是这并不能完全实现自定义,如:要实现一个圆角的Dialog。
具体步骤:
1,new一个dialog,并在new的时候传入一个style。
2,用第一步得到的dialog调用setContentView()。
3,用第一步得到的dialog调用show()即可。
style文件
<style name="MyDialog" parent="@android:Theme.Dialog">
<item name="android:windowFrame">@null</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowIsFloating">true</item>
<item name="android:windowContentOverlay">@null</item>
</style>
其中:
android:windowBackground设置的便是dialog的背景。因此,可以为dialog设置任意背景。
示例
final Dialog dialog = new Dialog(MainActivity.this,
R.style.MyDialog);
View v2 = View
.inflate(MainActivity.this, R.layout.dialog, null);
v2.findViewById(R.id.dialog_button_cancel).setOnClickListener(
new OnClickListener() {
public void onClick(View v) {
dialog.dismiss();
}
});
dialog.setContentView(v2);
dialog.show();
这样就自定义了一个dialog。这个dialog显示的内容就是R.layout.dialog所指定的。
常见问题
使用该方法自定义dialog时,会发现dialog的占据的位置过小。这可以通过设置LayoutParams来改变。如下:
Dialog dialog = new Dialog(MainActivity.this,
R.style.DialogStyle);
View content = View.inflate(MainActivity.this,
R.layout.dialog_content, null);
LayoutParams lp = new LayoutParams();//WindowManager.LayoutParams
lp.width = 300;//单位dp
lp.height = LayoutParams.WRAP_CONTENT;
dialog.setContentView(content, lp);
dialog.show();
其中的LayoutParams是WindowManager的内部类。