Android九种对话框

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
         
         
        
        
       
       
界面效果





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值