Android中的九种对话框
在Android开发过程中,与用户交互式需要用到对话框,以方便用户操作。 AlertDialog是应用最广的对话框,它可以生成各种内容的对话框。AlertDialog生成的对话框总体可分为以下4个区域:图标区、标题区、内容区、按钮区。
一般创建一个对话框需要经过以下几步:
1、创建AlertDialog.Builder对象。
2、调用AlertDialog.Builder的setTitle()或者setCustomTitle()方法设置标题。
3、调用AlertDialog.Builder的setIcon()方法设置标题logo。
4、调用AlertDialog.Builder的相关方法设置对话框内容。
5、调用AlertDialog.Builder的setPositiveButton()、setNegativeButton()或setNeutralButton()方法添加多个按钮。
6、调用AlertDialog.Builder的create()方法创建AlertDialog对象,再调用AlertDialog对象的show()方法将该对话框显示出来。
其中,第4步设置对话框的内容,这里有6种方法来指定:
setMessage():设置对话框内容为简单文本内容。
setItems():设置对话框内容为简单列表项。
setSingleChoiceItems():设置对话框内容为单选列表项。
setMultiChoiceItems():设置对话框内容为多选列表项。
setAdapter():设置对话框内容为自定义列表项。
setView():设置对话框内容为自定义View。
通过几个具体示例介绍AlertDialog的用法。
一、普通对话框
用于显示简单的消息提醒内容,只需要设置对话框的名字,与对话框显示的内容,以及“确定”或“取消”
private void showNormalDia(){
Builder normalDia=new Builder(MainActivity.this);
normalDia.setTitle("普通的对话框");
normalDia.setMessage("普通对话框的message内容");
normalDia.setPositiveButton("确定",new DialogInterface.OnClickListener(){//设置确定按钮
@Override
public void onClick(DialogInterface dialog,int which){
showClickMessage("确定");
}
});
normalDia.setNegativeButton("取消",new DialogInterface.OnClickListener(){//设置取消按钮
@Override
public void onClick(DialogInterface dialog,int which){
showClickMessage("取消");
}
});
normalDia.create().show();
}
二、多选项对话框
android的alertDialog中封装好的Button 和普通的Button没有使用方法与功能一样,可以写任意的方法,只是命名上的不同,一般有三个Button:PositiveButton,Button:NegativeButton,Button:NeutralButton。从名字可以看的出来,代表确定,否定,和中立,其实三个Button可以写你任意的方法,只是位置上的不同而已,确定Button一般靠左。在对话框中出现的位置不同,setNegativeButton设置的是出现在最右,一般把最右的button功能设置为“取消”,也就是调用dlg.dismiss()。setNeutralButton一般用做“确认”。如下示例代码显示的结果,依次是中立按钮,取消按钮,确定按钮。没用按一般情况显示。
private void showMultiDia(){
Builder multiDia=new Builder(MainActivity.this);
multiDia.setTitle("多选项对话框");
multiDia.setPositiveButton("按钮一",new DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface dialog, int which) {
showClickMessage("按钮一");
}
});
multiDia.setNeutralButton("按钮二",new DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface dialog, int which) {
showClickMessage("按钮二");
}
});
multiDia.setNegativeButton("按钮三",new DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface dialog, int which) {
showClickMessage("按钮三");
}
});
multiDia.create().show();
}
三、列表对话框
通过字符串数组保存需要显示的列表内容,通过listDia.setItems()实现点击监听获取焦点
private void showListDia(){
final String[]mList={"选项1","选项2","选项3","选项4","选项5","选项6","选项7"};
Builder listDia=new Builder(MainActivity.this);
listDia.setTitle("列表对话框");
listDia.setItems(mList,new DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface dialog,int which){
showClickMessage(mList[which]); //下标从0开始
}
});
listDia.create().show();
}
四、单项选择对话框
单项选择对话框和列表对话框相似,需要将待选选型通过数组保存,但是需要调用setSingleChoiceItems方法实现单一选择的设置。同时在监听方法中需要获取当前选择的选项下标
int yourChose=-1;
private void showSinChosDia(){
final String[]mList={"选项1","选项2","选项3","选项4","选项5","选项6","选项7"};
yourChose=-1;
Builder sinChosDia=new Builder(MainActivity.this);
sinChosDia.setTitle("单项选择对话框");
sinChosDia.setSingleChoiceItems(mList, 0, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,int which){
yourChose=which; //记录用户选择的选项下标
}
});
sinChosDia.setPositiveButton("确定",new DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface dialog,int which){
if(yourChose!=-1){
showClickMessage(mList[yourChose]);
}
}
});
sinChosDia.create().show();
}
五、多项选择对话框
多项选择对话框通过setMultiChoiceItems实现,同时在选项监听方法中通过数组链表的add方法记录所有已经被选择的选项
ArrayList
myChose=new ArrayList
();
private void showMultiChosDia(){
final String[]mList={"选项1","选项2","选项3","选项4","选项5","选项6","选项7"};
final boolean mChoseSts[]={false,false,false,false,false,false,false};
myChose.clear();
Builder multiChosDia=new Builder(MainActivity.this);
multiChosDia.setTitle("多项选择对话框");
multiChosDia.setMultiChoiceItems(mList,mChoseSts,new DialogInterface.OnMultiChoiceClickListener(){
@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
if(isChecked){
myChose.add(which);
}
else{
myChose.remove(which);
}
}
});
multiChosDia.setPositiveButton("确定",new DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface dialog,int which){
int size=myChose.size();
String str="";
for(int i=0;i
显示效果 六、进度条对话框
ProgressDialog 继承自AlertDialog,AlertDialog继承自Dialog,实现DialogInterface接口。
常用属性
setProgressStyle:设置进度条风格,风格为圆形,旋转等。
setTitlt:设置标题
setMessage:设置提示信息;
setIcon:设置标题图标;
setIndeterminate:设置ProgressDialog 的进度条是否不明确;这个属性对于ProgressDailog默认的转轮模式没有实际意义,默认下设置为true,它仅仅对带有ProgressBar的Dialog有作用。修改这个属性为false后可以实时更新进度条的进度。
setCancelable:设置ProgressDialog 是否可以按返回键取消;
cancelListner:当前Dialog强制取消之后将会被执行,通常用来清理未完成的任务。
setButton:设置ProgressDialog 的一个Button(需要监听Button事件);
show:显示ProgressDialog。
cancel:删除progressdialog
dismiss: 删除progressdialog 作用和cancel相同
cancel和dismiss方法本质是一样的,都是从屏幕中删除Dialog,唯一的区别是:调用cancel方法会回调DialogInterface.OnCancelListener,dismiss方法不会回掉。
setMax(int)、getMax:设置最大进度条的值
setProgress(int)、getProgress:更新进度条,一般都需要Handler的结合来更新进度条
incrementProgressBy(int):增加进度条
setProgressDrawable:设置progress发生变化时的进度指示条的背景图
进度条的进度显示本程序通过开启新的进程实现
ProgressDialog mReadProcessDia=null;
public final static int MAX_READPROCESS=100;
private void showReadProcess(){
mReadProcessDia=new ProgressDialog(MainActivity.this);
mReadProcessDia.setProgress(0);
mReadProcessDia.setTitle("进度条窗口");
mReadProcessDia.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
mReadProcessDia.setMax(MAX_READPROCESS);
mReadProcessDia.show();
new Thread(this).start();
}
//新开启一个线程,循环累加,一直到100为止
@Override
public void run(){
int Progress=0;
while (Progress
显示效果
七、内容正在读取对话框
本对话框通过设置ProgressDialog的setIndeterminate(true)方法实现。表明不明确具体进度,进度条在最大值与最小值之间来回移动,形成一个动画效果
private void showProcessDia(){
ProgressDialog progressDia=new ProgressDialog(MainActivity.this);
progressDia.setTitle("进度条框");
progressDia.setMessage("内容读取中.......");
progressDia.setIndeterminate(true);
progressDia.setCancelable(true);
//设置取消按钮,选择关闭对话框
progressDia.setButton(DialogInterface.BUTTON_NEGATIVE, "取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
showClickMessage("取消");
}
});
progressDia.show();
}
显示效果
八、自定义对话框
自定义对话框需要通过 customDia.setView(viewDia);设置自定义对话框的布局界面,与对普通Layout的操作相同,从而自定义操控想要实现的操作
private void showCustomDia(){
final AlertDialog.Builder customDia=new AlertDialog.Builder(MainActivity.this);
final View viewDia= LayoutInflater.from(MainActivity.this).inflate(R.layout.popup,null);//自定义对话框的界面文件
customDia.setTitle("自定义对话框");
customDia.setView(viewDia);
customDia.setPositiveButton("确定",new DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface dialog,int which){
Button diaInput=(Button) viewDia.findViewById(R.id.close);//获取界面文件中的取消按钮控件的文本内容
System.out.println("获取:"+diaInput.getText());
showClickMessage(diaInput.getText().toString());
}
});
customDia.create().show();
}
显示效果
九、顶置在当前Activity的对话框
PopupWindow是一个以弹窗方式呈现的控件,可以用来显示任意视图(View),而且会浮动在当前活动(activity)的顶部”。可以通过PopupWindow实现各种各样的弹窗效果,进行信息的展示或者是UI交互。
PopupWindow的使用分为两步:
1、调用PopupWindow的构造器创建PopupWindow对象,并完成一些初始化设置。
2、调用PopupWindow的showAsDropDown(View view)将PopupWindow作为View组件的下拉组件显示出来;或调用PopupWindow的showAtLocation()方法将PopupWindow在指定位置显示出来。
为实现该功能的对话框,需要设置setFocusable(true),获取当前对话框的焦点,使其他地方不可点击
showAtLocation()方法用于实现显示相对于父控件的位置,这里设置为showAtLocation(parent, Gravity.CENTER_VERTICAL,0,0)将父控件覆盖。
private void showCusPopUp(View parent){//顶置对话框,当显示时,其父窗体不可操作,只有关闭当前对话框,才可以操作父窗体
final Builder popupDia=new Builder(MainActivity.this);
if(window==null) {
popupView = LayoutInflater.from(MainActivity.this).inflate(R.layout.cutom_main, null);
cusPopupBtn1 = (Button) popupView.findViewById(R.id.name);
window = new PopupWindow(popupView, ActionBar.LayoutParams.MATCH_PARENT, ActionBar.LayoutParams.MATCH_PARENT);
}
window.setFocusable(true);
window.setBackgroundDrawable(new Drawable() {//顶置窗体的布局画布界面设置
@Override
public void draw(@NonNull Canvas canvas) {
canvas.drawColor(Color.WHITE);//背景为白色
}
@Override
public void setAlpha(@IntRange(from = 0, to = 255) int alpha) {
}
@Override
public void setColorFilter(@Nullable ColorFilter colorFilter) {
}
@Override
public int getOpacity() {
return 0;
}
});
window.update();
window.showAtLocation(parent, Gravity.CENTER_VERTICAL,0,0);
cusPopupBtn1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showClickMessage("popup window 的确定");
}
});
}
显示效果
本程序实现的整体框架流程代码如下:
package fs.alldialog_test;
import android.app.ActionBar;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.ColorFilter;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.DrawableContainer;
import android.preference.DialogPreference;
import android.support.annotation.IntRange;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AlertDialog.Builder;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutCompat;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.PopupWindow;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.concurrent.RunnableFuture;
public class MainActivity extends Activity implements Runnable{
//定义各种对话框点击按钮变量
private Button btn_diaNormal;
private Button btn_diaMulti;
private Button btn_diaList;
private Button btn_diaSinChos;
private Button btn_diaMultiChos;
private Button btn_diaProcess;
private Button btn_diaReadProcess;
private Button btn_diaCustom;
private Button btn_popUpDia;
private PopupWindow window=null;
private Button cusPopupBtn1;
private View popupView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getView();
setListener();
}
//获取视图
private void getView(){
btn_diaNormal=(Button)findViewById(R.id.btn_diaNormal);
btn_diaMulti=(Button)findViewById(R.id.btn_diaMulti);
btn_diaList=(Button)findViewById(R.id.btn_diaList);
btn_diaSinChos=(Button)findViewById(R.id.btn_diaSigChos);
btn_diaMultiChos=(Button)findViewById(R.id.btn_diaMultiChos);
btn_diaProcess=(Button)findViewById(R.id.btn_diaProcess);
btn_diaReadProcess=(Button)findViewById(R.id.btn_diaReadProcess);
btn_diaCustom=(Button)findViewById(R.id.btn_diaCustom);
btn_popUpDia=(Button)findViewById(R.id.btn_popUpDia);
}
//设置按钮点击的监听
private void setListener(){
btn_diaNormal.setOnClickListener(btnListener);
btn_diaMulti.setOnClickListener(btnListener);
btn_diaList.setOnClickListener(btnListener);
btn_diaSinChos.setOnClickListener(btnListener);
btn_diaMultiChos.setOnClickListener(btnListener);
btn_diaProcess.setOnClickListener(btnListener);
btn_diaReadProcess.setOnClickListener(btnListener);
btn_diaCustom.setOnClickListener(btnListener);
btn_popUpDia.setOnClickListener(btnListener);
}
private Button.OnClickListener btnListener=new Button.OnClickListener(){
public void onClick(View v){
if(v instanceof Button){
int btnId=v.getId();
switch (btnId)
{
case R.id.btn_diaNormal://普通对话框
showNormalDia();
break;
case R.id.btn_diaMulti://多按钮对话框
showMultiDia();
break;
case R.id.btn_diaList://列表对话框
showListDia();
break;
case R.id.btn_diaSigChos://单项选择对话框
showSinChosDia();
break;
case R.id.btn_diaMultiChos://多项选择对话框
showMultiChosDia();
break;
case R.id.btn_diaReadProcess://进度条对话框
showReadProcess();
break;
case R.id.btn_diaProcess://读取中对话框
showProcessDia();
break;
case R.id.btn_diaCustom://自定义对话框
showCustomDia();
break;
case R.id.btn_popUpDia://顶置对话框
showCusPopUp(v);
break;
default:
break;
}
}
}
};
private void showNormalDia(){
..........
normalDia.setTitle("普通的对话框");
}
private void showMultiDia(){
..........
multiDia.setTitle("多选项对话框");
}
private void showListDia(){
...........
listDia.setTitle("列表对话框");
}
int yourChose=-1;
private void showSinChosDia(){
..........
sinChosDia.setTitle("单项选择对话框");
}
ArrayList
myChose=new ArrayList
();
private void showMultiChosDia(){
..........
multiChosDia.setTitle("多项选择对话框");
}
ProgressDialog mReadProcessDia=null;
public final static int MAX_READPROCESS=100;
private void showReadProcess(){
........
mReadProcessDia.setTitle("进度条窗口");
}
//新开启一个线程,循环累加,一直到100为止
@Override
public void run(){
int Progress=0;
while (Progress
界面效果