Dialog与DialogFragment使用


对话框一般是出现在Activity纸上的一个小窗口,处于下面的Activity暂时失去焦点,一般用于提示信息和当前应用程序直接相关的小功能。

一、分类

1.AlertDialog:可以有1到3个按钮,单选、复选或列表的对话框,警告对话框可以支持大部分的用户交互。

2.ProgressDialog:显示一个进度环或条,是AlertDialog的扩展,也支持按钮;

3.DatePickerDialog:日期选择

4.TimePickerDialog:时间选择;

二、基本AlertDialog使用

AlertDialog默认为非模态对话框,要想使其为模态对话框,可以设置其cancelable属性

    AlertDialog1-3个按钮,随便点击都会消失,不用主动调用dismiss();

cancel()和dismiss()使对话框取消或者消除,这两个方法的作用是一样的,不过推荐使用dismiss()。

 

    

. 基本Dialog

/**
     * 普通AlertDialog
     */
    private void showNormarlDialog(){
        AlertDialog.Builder builder = newBuilder(this);
        builder.setMessage("是否退出?");
        builder.setTitle("提示");
       builder.setPositiveButton(android.R.string.ok, newDialogInterface.OnClickListener() {
           
            @Override
            public void onClick(DialogInterfacedialog, int which) {
                // TODO Auto-generated methodstub
               Toast.makeText(ThirdActivity.this, "点击确认",Toast.LENGTH_SHORT).show();
            }
        });
       builder.setNegativeButton(android.R.string.cancel, newDialogInterface.OnClickListener() {
           
            @Override
            public void onClick(DialogInterfacedialog, int which) {
                // TODO Auto-generated methodstub
               Toast.makeText(ThirdActivity.this, "点击取消",Toast.LENGTH_SHORT).show();
            }
        });
       builder.setNeutralButton("中立", newDialogInterface.OnClickListener() {
           
            @Override
            public void onClick(DialogInterfacedialog, int which) {
                // TODO Auto-generated methodstub
               Toast.makeText(ThirdActivity.this, "点击中立",Toast.LENGTH_SHORT).show();
            }
        });
        builder.create().show();
    }


 

. 带输入框的Dialog

 

 /**
     * 带输入框的AlertDialog
     */
    private void showInputlDialog(){
        final EditText text = newEditText(this);
        AlertDialog.Builder builder = newBuilder(this);
        builder.setMessage("输入姓名");
        builder.setView(text);
       builder.setIcon(android.R.drawable.ic_dialog_alert);
       builder.setPositiveButton(android.R.string.ok, newDialogInterface.OnClickListener() {
           
            @Override
            public void onClick(DialogInterfacedialog, int which) {
                // TODO Auto-generated methodstub
               Toast.makeText(ThirdActivity.this, "姓名是:"+text.getText().toString(), Toast.LENGTH_SHORT).show();
            }
        });
       builder.setNegativeButton(android.R.string.cancel, null);
       builder.setNeutralButton("中立", null);
        builder.create().show();


 

. 一组单选框

/**
     * 带单选框的AlertDialog
     */
    private void showSingleChoiceDialog(){
        final String[] items = newString[]{"跑步","游泳"};
        AlertDialog.Builder builder = newBuilder(this);
        builder.setTitle("今天做什么运动");
       builder.setIcon(android.R.drawable.ic_dialog_info);
        builder.setSingleChoiceItems(items, 1,new DialogInterface.OnClickListener() {
           
            @Override
            public void onClick(DialogInterfacedialog, int which) {
                // TODO Auto-generated methodstub
               
            }
        });
       builder.setNegativeButton(android.R.string.cancel, null);
        builder.create().show();
    }


 

. 带复选框的AlertDialog

/**
     * 带单选框的AlertDialog
     */
    private void showMultiChoiceDialog(){
      
        final String[] items = newString[]{"跑步","游泳"};
        AlertDialog.Builder builder = newBuilder(this);
        builder.setTitle("今天做什么运动");
       builder.setIcon(android.R.drawable.ic_dialog_info);
        builder.setMultiChoiceItems(items,null, new DialogInterface.OnMultiChoiceClickListener() {
           
            @Override
            public void onClick(DialogInterfacedialog, int which, boolean isChecked) {
                // TODO Auto-generated methodstub
               
            }
        });
       builder.setNegativeButton(android.R.string.cancel, null);
        builder.create().show();
    }


 

. 带列表的AlertDialog

/**
     * 带列表框的AlertDialog
     */
    private void showListDialog(){
        final String[] items = newString[]{"跑步","游泳"};
        AlertDialog.Builder builder = newBuilder(this);
        builder.setTitle("今天做什么运动");
       builder.setIcon(android.R.drawable.ic_dialog_info);
        builder.setItems(items, newDialogInterface.OnClickListener() {
           
            @Override
            public void onClick(DialogInterfacedialog, int which) {
                // TODO Auto-generated methodstub
               
            }
        });
       builder.setNegativeButton(android.R.string.cancel, null);
        builder.create().show();
    }


   

6.自定义布局对话框:

/**
     * 自定义对话框
     */
    private void showSelfDefinedDialog(){
        LayoutInflater inflater =getLayoutInflater();
        View layout =inflater.inflate(R.layout.dialog_item, (ViewGroup)findViewById(R.id.dialog));
        AlertDialog.Builder builder = newBuilder(this);
        builder.setMessage("自定义布局");
       builder.setView(layout).setPositiveButton("确定", null);
       builder.setNegativeButton("取消", null).create().show();
       
    }
 
Dialog:item:
<?xmlversion="1.0" encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/dialog"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
    android:background="#ffffffff"
    android:orientation="horizontal">
 
    <TextView
        android:id="@+id/tvname"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
        android:text="姓名:" />
 
    <EditText
        android:id="@+id/etname"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
        android:minWidth="100dip"/>
 
</LinearLayout>


 

 

三、ProgressDialog

一般在耗时的操作之前弹出ProgressDialog提示用户,然后开启一个新线程,执行耗时操作,执行完毕之后通知主程序将ProgressDialog结束。

  1. 一个简单的例子:值得注意的是ProgressDialog默认是是模态对话框。

 

private static final intHANDLER_MSG_STOP_PROGRESS = 1;
    /**
     * 显示进程对话框
     */
    private void showProgressDialog(){
        mProgress = ProgressDialog.show(this,"正在下载程序", "下载中、、、");
        new Thread(new Runnable() {
           
            @Override
            public void run() {
                // TODO Auto-generated methodstub
                try {
                    Thread.sleep(3000);
                } catch (InterruptedExceptione) {
                    // TODO Auto-generatedcatch block
                    e.printStackTrace();
                }
               
               mHandler.sendEmptyMessage(HANDLER_MSG_STOP_PROGRESS);
            }
        }).start();
    }
   
    Handler mHandler = new Handler(){
        @Override
        public void handleMessage(Message msg){
            // TODO Auto-generated method stub
            switch(msg.what){
                case HANDLER_MSG_STOP_PROGRESS:
                    mProgress.dismiss();
                    break;
            }
           
            super.handleMessage(msg);
        }
       
    };

 

  1. 报告进度的圆形对话框

/**
     * 显示圆形进度对话框
     */
    private void showSpinnerProgressDialog() {
        mProgress = new ProgressDialog(this);
        mProgress.setTitle("提示");
       mProgress.setMessage("圆形对话框");
       mProgress.setProgressStyle(ProgressDialog.STYLE_SPINNER);
       mProgress.setIcon(android.R.drawable.dialog_frame);
        //设置进度条是否不明确
        mProgress.setIndeterminate(false);
        mProgress.setCancelable(true);
        mProgress.setButton("确定", newDialogInterface.OnClickListener() {
           
            @Override
            public void onClick(DialogInterfacedialog, int which) {
                // TODO Auto-generated methodstub
               
            }
        });
        mProgress.show();
       
       
        new Thread(){
            int iCount = 1;
            @Override
            public void run() {
                // TODO Auto-generated methodstub
                try {
                    while(iCount <= 100) {
                        Thread.sleep(50);
                       mProgress.setProgress(iCount++);
                    }
                   mHandler.sendEmptyMessage(HANDLER_MSG_STOP_PROGRESS);
                } catch (InterruptedExceptione) {
                    // TODO Auto-generatedcatch block
                    e.printStackTrace();
                }
                super.run();
            }
           
        }.start();
    }


 

  1. 报告进度的水平对话框

privatevoid showHorizontalProgressDialog() {
        mProgress = new ProgressDialog(this);
        mProgress.setTitle("提示");
       mProgress.setMessage("水平对话框");
       mProgress.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
       mProgress.setIcon(android.R.drawable.dialog_frame);
        mProgress.setProgress(100);
        //设置进度条是否不明确
        mProgress.setIndeterminate(false);
        mProgress.setCancelable(false);
        mProgress.setButton("确定", newDialogInterface.OnClickListener() {
           
            @Override
            public void onClick(DialogInterfacedialog, int which) {
                // TODO Auto-generated methodstub
               
            }
        });
        mProgress.show();
       
        new Thread(){
            int iCount = 1;
            @Override
            public void run() {
                // TODO Auto-generated methodstub
                try {
                    while(iCount <= 100) {
                        Thread.sleep(50);
                       mProgress.setProgress(iCount++);
                    }
                   mHandler.sendEmptyMessage(HANDLER_MSG_STOP_PROGRESS);
                } catch (InterruptedExceptione) {
                    // TODO Auto-generatedcatch block
                    e.printStackTrace();
                }
                super.run();
            }
           
        }.start();
    }


 

 

四、使用DialogFragment管理Dialog

 

  1. 上面不管AlertDialog还是ProgressDialog的使用,都与其Actiivty没有关系,最明显的表现是当Activity转屏重建后其内部的Dialog都消失了,无法保存其状态,因此Android 3.0引入了基于FragmentDialogFragment,
  2. Google推荐尽量使用DialogFragment,因为DialogFragment在手机配置变化(如转屏)在Activity重建时能够自动重建,跳过onCreate() onDestroy()的步骤。
  3. 所以使用DialogFragment管理Dialog之后,

 


   

   

  

publicstatic final int DIALOG_NORMAL = 1;  
private ProgressDialog mProgress;
 
    public static DialogManager newInstance(inttitle) {
        DialogManager frag = newDialogManager();
        Bundle args = new Bundle();
        args.putInt("title", title);
        frag.setArguments(args);
        return frag;
    }
@Override
    public Dialog onCreateDialog(BundlesavedInstanceState) {
        // TODO Auto-generated method stub
       
        mContext =getActivity().getApplicationContext();
       
        int title =getArguments().getInt("title");
        Dialog dialog = null;
        switch(title){
            case DIALOG_NORMAL:
                dialog =  showNormarlDialog();
             break;
        }
        return dialog;
       
//        returnsuper.onCreateDialog(savedInstanceState);
       
    }
 
 /**
     * 普通AlertDialog
     */
    private Dialog showNormarlDialog(){
        AlertDialog.Builder builder = newBuilder(getActivity());
        builder.setMessage("是否退出?");
        builder.setTitle("提示");
        builder.setCancelable(false);
       builder.setPositiveButton(android.R.string.ok, newDialogInterface.OnClickListener() {
           
            @Override
            public void onClick(DialogInterfacedialog, int which) {
                // TODO Auto-generated methodstub
                Toast.makeText(mContext,"点击确认", Toast.LENGTH_SHORT).show();
            }
        });
       builder.setNegativeButton(android.R.string.cancel, newDialogInterface.OnClickListener() {
           
            @Override
            public void onClick(DialogInterfacedialog, int which) {
                // TODO Auto-generated methodstub
                Toast.makeText(mContext,"点击取消", Toast.LENGTH_SHORT).show();
            }
        });
       builder.setNeutralButton("中立", newDialogInterface.OnClickListener() {
           
            @Override
            public void onClick(DialogInterfacedialog, int which) {
                // TODO Auto-generated methodstub
                Toast.makeText(mContext,"点击中立", Toast.LENGTH_SHORT).show();
            }
        });
        return builder.create();
    }

 

为什么对于上下文来讲,使用getActivity()没有问题,但是使用getActivity().getApplicationContext()有问题

 

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值