赞
踩
ps:默认alertdialog的宽为屏幕的8/9, 高为屏幕的1/7!!
Dialog 常用方法:(格式:dialog.以下方法)
setProgressStyle:设置进度条风格,风格为圆形,旋转的。 setTitlt:设置标题 setMessage:设置提示信息; setIcon:设置标题图标; setIndeterminate:设置Dialog 的进度条是否不明确;这个属性对于ProgressDailog默认的转轮模式没有实际意义,默认下设置为true,它仅仅对带有ProgressBar的Dialog有作用。修改这个属性为false后可以实时更新进度条的进度。 setCancelable:设置Dialog 是否可以按返回键取消,屏蔽其它控件交互能力,除dialog以外的屏幕都不可点击; cancelListner:当前Dialog强制取消之后将会被执行,通常用来清理未完成的任务。 setButton:设置ProgressDialog 的一个Button(需要监听Button事件); show:显示Dialog。 cancel:删dialog .setOnCancelListener(new Dial...):当删除dialog后执行该方法 dismiss: 删除progressdialog 作用和cancel相同 setOnDismissListener(new Dialo....):当删除dialog后执行该方法 setMax(int)、getMax:设置最大进度条的值 setProgress(int)、getProgress:更新进度条,当然一般都需要Handler的结合来更新进度条 incrementProgressBy(int)增加进度条 setProgressDrawable:设置progress发生变化时的进度指示条的背景图 ps:AlertDialog.Builder没有setOnShowListener方法(对象名称为aertDialog),但想要该方法时,可以这样, 再创建dialog把alertDialog赋值给dialog: Dialog dialog=aertDialog.create(); dialog.setOnShowListener(new DialogInterface.OnShowListener() {..... 然后在弹出dialog.show();即可。
第一种:普通三个选项的dialog(最多可写三个按钮,也可写一个)
先上图
代码如下:
//====弹窗 //1.创建对象 AlertDialog.Builder alertDialog=new AlertDialog.Builder(SafetyActivity.this); //2.设置窗体样式 alertDialog.setIcon(R.drawable.ic_rb_user_red);//标题图标 alertDialog.setTitle("三个选项的dialog");//标题文字 alertDialog.setMessage("提示:爱或恨");//提示信息 //alertDialog.setCancelable(false);//屏蔽其它控件交互能力,除dialog以外的屏幕都不可点击 //3.设置三个按钮的事件 //积极选择 alertDialog.setPositiveButton("爱", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Toast.makeText(SafetyActivity.this,"点击了爱",Toast.LENGTH_LONG).show(); } }); //消极选择 alertDialog.setNegativeButton("恨", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Toast.makeText(SafetyActivity.this,"点击了恨",Toast.LENGTH_LONG).show(); } }); //中立选择 alertDialog.setNeutralButton("没感觉", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Toast.makeText(SafetyActivity.this,"点击了没感觉",Toast.LENGTH_LONG).show(); } }); //4.显示dialog alertDialog.show();
第二种:列表dialog
.
final String[] items={"我是1","我是2","我是3"};
AlertDialog.Builder listDialog=new AlertDialog.Builder(SafetyActivity.this);
listDialog.setIcon(R.drawable.ic_rb_user_red);
listDialog.setTitle("列表dialog");
listDialog.setItems(items, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {//点击某一列的事件
Toast.makeText(SafetyActivity.this,"点击了"+items[which],Toast.LENGTH_LONG).show();;
}
});
listDialog.show();
第三种:单选dialog(和列表dialog差不多,只是在列表前面多了一个选择的图标)
int choice=0; private void setViewEvenListener() { tvTest.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { final String[] items={"我是1","我是2","我是3"}; AlertDialog.Builder singleChoiceDialog=new AlertDialog.Builder(SafetyActivity.this); singleChoiceDialog.setIcon(R.drawable.ic_rb_user_red); singleChoiceDialog.setTitle("单选dialog"); //生成单选选项,并监听选项事件;ps:第二个参数为默认选中哪个列表(索引) singleChoiceDialog.setSingleChoiceItems(items, 0, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //Toast.makeText(SafetyActivity.this,"点击了"+items[which],Toast.LENGTH_LONG).show(); choice=which; } }); //设置确定按钮 singleChoiceDialog.setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) {//这里的which没意义,值为-1 Toast.makeText(SafetyActivity.this,"点击了"+items[choice],Toast.LENGTH_LONG).show(); } }); singleChoiceDialog.show(); } }); }
第四种:多选dialog
ArrayList<Integer> choice=new ArrayList<>(); private void setViewEvenListener() { tvTest.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { final String[] items={"我是1","我是2","我是3"}; boolean initChoices[]={false,false,false};//设置全部选择为false choice.clear(); AlertDialog.Builder multiChoiceDialog=new AlertDialog.Builder(SafetyActivity.this); multiChoiceDialog .setIcon(R.drawable.ic_rb_user_red); multiChoiceDialog .setTitle("多选dialog"); multiChoiceDialog.setMultiChoiceItems(items, initChoices, new DialogInterface.OnMultiChoiceClickListener() { @Override public void onClick(DialogInterface dialog, int which, boolean isChecked) { if(isChecked){ choice.add(which); }else{ choice.remove(which); } } }); multiChoiceDialog.setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { int size = choice.size(); String str=""; for (int i=0;i<size;i++){ str+=items[choice.get(i)]+"、"; } Toast.makeText(SafetyActivity.this,"选中了"+str,Toast.LENGTH_LONG).show(); } }); multiChoiceDialog.show(); } }); }
第五种:等待dialog
final int max = 3; final ProgressDialog progressDialog = new ProgressDialog(SafetyActivity.this); progressDialog.setTitle("我是个等待的Dialog"); progressDialog.setMessage("等待中"); progressDialog.setCancelable(false); progressDialog.show(); //新建线程执行关闭dialog new Thread(new Runnable() { @Override public void run() { int p=0; while (p<max){ try { Thread.sleep(1000); p++; } catch (InterruptedException e) { e.printStackTrace(); } } progressDialog.cancel(); } }).start();
第六种:有进度条的dialog
final int max = 30; final ProgressDialog progressDialog = new ProgressDialog(SafetyActivity.this); progressDialog.setTitle("我是个有进度条的Dialog"); progressDialog.setMessage("等待中"); progressDialog.setIndeterminate(false); progressDialog.setCancelable(false); progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);//进度条样式,参数写2效果相同 progressDialog.setMax(max);//设置最大的进度条 progressDialog.show(); //新建线程执行关闭dialog new Thread(new Runnable() { @Override public void run() { int p=0; while (p<max){ try { Thread.sleep(100); p++; //更新进度条样式 progressDialog.setProgress(p); } catch (InterruptedException e) { e.printStackTrace(); } } progressDialog.cancel(); } }).start();
第七种:半自定义dialog
AlertDialog.Builder alertDialog=new AlertDialog.Builder(SafetyActivity.this); alertDialog.setTitle("半自定义的dialog"); alertDialog.setPositiveButton("哈哈哈", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Toast.makeText(SafetyActivity.this,"点击了哈哈哈",Toast.LENGTH_LONG).show(); } }); //===当想自定义dialog的一些样式(宽高、弹出位置) //1.获取dialog AlertDialog dialog=alertDialog.create(); //2.获取Dialogwindow对象 Window window=dialog.getWindow(); //3.获取到window管理器 WindowManager manager=getWindowManager(); //4.获取屏幕参数 Display display=manager.getDefaultDisplay(); //5.添加参数 WindowManager.LayoutParams params=window.getAttributes(); params.height= (int) (display.getHeight()*0.4);//设置dialog的高 params.width=(int) (display.getWidth()*0.6);//设置dialog的宽 /*设置全屏(setBackgroundDrawableResource:不设置背景颜色咋不能全屏呢。。。) window.setBackgroundDrawableResource(R.color.colorWhite); params.width = WindowManager.LayoutParams.MATCH_PARENT; params.height = WindowManager.LayoutParams.MATCH_PARENT; * */ params.gravity= Gravity.TOP;//弹出位置 params.alpha=0.8f; //6.window设置参数 window.setAttributes(params); //显示 dialog.show();
第八种:自定义dialog,添加布局文件:
AlertDialog.Builder alertDialog=new AlertDialog.Builder(SafetyActivity.this);
alertDialog.setTitle("自定义的dialog,加载布局文件");
alertDialog.setView(R.layout.test);//添加布局文件
alertDialog.setPositiveButton("哈哈哈", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(SafetyActivity.this,"点击了哈哈哈",Toast.LENGTH_LONG).show();
}
});
alertDialog.show();
ps:若想只加载布局文件,把那句代码改为如下:(ps:如果不需要头部信息,可不设置setTitle)
AlertDialog.Builder alertDialog=new AlertDialog.Builder(SafetyActivity.this,R.style.DialogTheme);
R.style.DialogTheme:指的是:它可以设置dialog的样式
在values/styles.xml新建一个样式DialogTheme,代码如下:
<!--parent="@android:style/Theme.Dialog":点击dialog之外的界面就会关闭dialog--> <style name="DialogTheme" parent="@android:style/Theme.Dialog"> <!-- 边框 --> <item name="android:windowFrame">@null</item> <!-- 是否浮现在activity之上 --> <item name="android:windowIsFloating">true</item> <!-- 半透明 --> <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.5</item> </style>
第九种:完全自定义dialog
步骤一:先写一个需求需要的布局文件(例如下:名称为:test)
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/colorPrimary" android:orientation="vertical"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@color/colorWhite" android:text="dialog测试,这青色背景是布局文件"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@color/colorWhite" android:text="dialog测试,这青色背景是布局文件"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@color/colorWhite" android:text="dialog测试,这青色背景是布局文件"/> </LinearLayout>
步骤二:写一个类继承dialog
public class TestDialog extends Dialog { //ps:!!!因为继承dialog,所以,在该类的方法里写dialog的方法即可(例:dismiss()),不用dialog.dismiss(); public TestDialog(@NonNull Context context) { //如果要设置dialog占满宽或高,super里一定要添加R.style.DialogTheme, //否则params.width或params.height设置占满是没有效果的 super(context,R.style.DialogTheme); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //设置布test局 setContentView(R.layout.test); //=======设置关于dialog的样式,这样式也可以在创建TestDialog对象时那里写 Window window=getWindow();//也可这样写:dialog.getWindow(); //dialog显示的位置 window.setGravity(Gravity.BOTTOM); //dialog的大小 //window.getDecorView().setPadding(50,0,50,50); //dialog的动画(R.style.dialog_menu_animStyle:自定义的动画) window.setWindowAnimations(R.style.dialog_menu_animStyle); //设置参数 WindowManager.LayoutParams params=window.getAttributes(); params.width=WindowManager.LayoutParams.MATCH_PARENT; params.height=WindowManager.LayoutParams.WRAP_CONTENT; } }
步骤三:在需要弹出该dialog的地方,使用自定义的dialog
//==使用dialog
TestDialog testDialog=new TestDialog(SafetyActivity.this);
testDialog.show();
第十种:日期:
Calendar calendar=Calendar.getInstance();
//参1:当前上下文,参2日期改变监听,参3设置显示的年,参4设置显示的月(0-11代表1-12月),参5设置显示的日
new DatePickerDialog(SafetyListActivity.this, new DatePickerDialog.OnDateSetListener() {
@Override//参2为改变后的年,参3月,参4日
public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
//日期改变事件
Toast.makeText(SafetyListActivity.this,String.valueOf(year)+String.valueOf(month+1)+String.valueOf(dayOfMonth),Toast.LENGTH_LONG).show();
}
}, calendar.get(Calendar.YEAR) ,calendar.get(Calendar.MONTH) , calendar.get(Calendar.DAY_OF_MONTH)).show();
步骤一:在anim层(anim层时res层下的,是专门放动画的文件夹,第一次需要创建该文件夹,具体创建百度)
新建dialog_in_anim.xml文件做弹出过程,代码如下:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="500"
android:fromXDelta="0%p"
android:toXDelta="0%"
android:fromYDelta="100%p"
android:toYDelta="0" />
</set>
步骤二:再新建一个退出过程的xml,名为dialog_out_anim
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="500"
android:fromXDelta="0"
android:fromYDelta="0%p"
android:toXDelta="0"
android:toYDelta="100%p" />
</set>
步骤三:在values层的styles.xml添加显示过程和退出过程的样式(dialog_menu_animStyle:样式名称,
可根据需求起)
<style name="dialog_menu_animStyle">
<item name="android:windowEnterAnimation">@anim/dialog_in_anim</item>
<item name="android:windowExitAnimation">@anim/dialog_out_anim</item>
</style>
步骤四:使用dialog_menu_animStyle这个动画:例:在上面第九种dialog知识里有写
Window window=getWindow();//也可这样写:dialog.getWindow();
//dialog的动画(R.style.dialog_menu_animStyle:自定义的动画)
window.setWindowAnimations(R.style.dialog_menu_animStyle);
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。