zoukankan      html  css  js  c++  java
  • 非自定义和自定义Dialog的介绍!!!

    一、非自定义Dialog的几种形式介绍

    转自:http://www.kwstu.com/ArticleView/kwstu_20139682354515

    前言

      对话框对于应用也是必不可少的一个组件,在Android中也不例外,对话框对于一些提示重要信息,或者一些需要用户额外交互的一些内容很有帮 助。本篇博客就讲解一下Android下对话框的使用,在本篇博客中,将了解到对话框的一些常规属性的设置,以及各式的对话框的使用,并都会提供小 Demo来展示所有的效果。

    Dialog

      Dialog,对话框,一个对话框就是一个小窗口,并不会填满整个屏幕,通常是以模态显示,要求用户必须采取行动才能继续进行剩下的操作。

      Android提供了丰富的对话框支持,它提供了如下4中常用的对话框:

    • AlertDialog:警告对话框,使用最广泛功能最丰富的一个对话框。
    • ProgressDialog:进度条对话框,只是对进度条进行了简单的封装。
    • DatePickerDialog:日期对话框。
    • TimePickerDialog:时间对话框。

      所有的对话框,都是直接或间接继承自Dialog类,而AlterDialog直接继承自Dialog,其他的几个类均继承自AlterDialog。

    AlertDialog

      AlertDialog继承自Dialog类,对于Android内置的AlterDialog,它可以包含一个标题、一个内容消息或者一个选择列表、最多三个按钮。而 1、创建AlterDialog推荐使用它的一个内部类AlterDialog.Builder创 建。使用Builder对象,可以 2、设置AlterDialog的各种属性,最后通过 3、Builder.create()可以得到AlterDialog对 象,如果只是还需要显示这个AlterDialog,一般可以直接使用 4、Builder.show()方法,它会返回一个AlterDialog对象,并且 显示它。

      如果仅仅是需要提示一段信息给用户,那么就可以直接使用AlterDialog的一些属性设置提示信息,涉及到的方法有:

    • AlterDialog create():根据设置的属性,创建一个AlterDialog。
    • AlterDialog show():根据设置的属性,创建一个AlterDialog,并且显示在屏幕上。
    • AlterDialog.Builder setTitle():设置标题。
    • AlterDialog.Builder setIcon():设置标题的图标。
    • AlterDialog.Builder setMessage():设置标题的内容。
    • AlterDialog.Builder setCancelable():设置是否模态,一般设置为false,表示模态,要求用户必须采取行动才能继续进行剩下的操作。

      Tips:AlterDialog.Builder的很多设置属性的方法,返回的均是这个AlterDialog.Builder对象,所以可以使用链式方式编写代码,这样更方便。

      当一个对话框调用了show()方法后,展示到屏幕上,如果需要消除它,可以使用DialogInterface接口声明的两个方 法,cancel()和dismiss()使对话框取或者消除,这两个方法的作用是一样的,不过推荐使用dismiss()。Dialog和 AlterDialog都实现了DialogInterface接口,所以只要是对话框,均可以使用这两个方法来消除对话框。

      下面通过一个简单的Demo,先看看AlterDialog是如何提示信息的:

      示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    btnGeneral.setOnClickListener(new View.OnClickListener() {
      
                 @Override
                 public void onClick(View v) {
                     // TODO Auto-generated method stub
                     AlertDialog.Builder builder = new AlertDialog.Builder(
                             MainActivity.this);
                    builder.setTitle("提示");
                     builder.setMessage("这是一个普通的对话框!");
                     builder.setIcon(R.drawable.ic_launcher);
                     builder.setCancelable(false);
                    builder.setPositiveButton("知道了!", new OnClickListener() {
                         @Override
                         public void onClick(DialogInterface dialog, int which) {
                             dialog.cancel();
                         }
                    });
                    builder.create().show();
                 }
             });

    展示效果:

    AlterDialog的按钮

      AlterDialog内置了三个按钮,可以直接使用setXxxButton()方法进行设置,对于一般的对话框,使用三个按钮基本上也够用了,下面是这三个方法的签名:

    • AlterDialog.Builder setPositiveButton(CharSquence text , DialogInterFace.OnClickListener):一个积极的按钮,一般用于“OK”或者“继续”等操作。
    • AlterDialog.Builder setNegativeButton(CharSquence text , DialogInterFace.OnClickListener):一个负面的按钮,一般用于“取消”操作。
    • AlterDialog.Builder setNeutralButton(CharSquence text , DialogInterFace.OnClickListener):一个比较中性的按钮,一般用于“忽略”、“以后提醒我”等操作。

      上面介绍的DialogInterface接口,还提供了一系列的事件响应,这三个按钮均需要传递一个 DialogInterFace.OnClickListener接口对象,实现其点击事件的触发,在这个接口中需要实现一个 onClick(DialogInterface dialog,int which),dialog为当前触发事件的对话框对象接口,可以直接强制转换为AlterDialog进行操作;which为点击按钮的标识符,是一个 整形的数据,对于这三个按钮而言,每个按钮使用不同的int类型数据进行标识:Positive(-1)、Negative(-2)、 Neutral(-3)。

      而除了专门为按钮点击实现的DialogInterFace.OnClickListener事件外,DialogInterface还提供了 一些其他的事件,供Dialog对象响应,这些事件只是对Dialog声明周期各个状态的响应,一看就明白了,就不再详细讲解了,下面是这几个事件的说 明:

    • interface DialogInterface.OnCancelListener:当对话框调用cancel()方法的时候触发。
    • interface DialogInterface.OnDismissListener:当对话框调用dismiss()方法的时候触发。
    • interface DialogInterface.OnShowListener:当对话框调用show()方法的时候触发。
    • interface DialogInterface.OnMultiChoiceListener:当对话框使用多选列表,并且选中的时候触发。

      示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    btnButtons.setOnClickListener(new View.OnClickListener() {
     
                 @Override
                public void onClick(View v) {
                     // TODO Auto-generated method stub
                     AlertDialog.Builder builder = new AlertDialog.Builder(
                            MainActivity.this);
                     builder.setTitle("提示");
                     builder.setMessage("这是一个多按钮普通的对话框!");
                    builder.setIcon(R.drawable.ic_launcher);
                    builder.setPositiveButton("确定", new OnClickListener() {
      
                         @Override
                         public void onClick(DialogInterface dialog, int which) {                       
                             Toast.makeText(MainActivity.this, "确定被点击",
                                    Toast.LENGTH_SHORT).show();
                             dialog.dismiss();
                         }
                     });
                     builder.setNegativeButton("否定", new OnClickListener() {
      
                         @Override
                        public void onClick(DialogInterface dialog, int which) {
                             // TODO Auto-generated method stub
                             Toast.makeText(MainActivity.this, "否定被点击",
                                    Toast.LENGTH_SHORT).show();
                            dialog.dismiss();
                       }
                     });
                     builder.setNeutralButton("忽略", new OnClickListener() {
     
                         @Override
                         public void onClick(DialogInterface dialog, int which) {
                             // TODO Auto-generated method stub
                             Toast.makeText(MainActivity.this, "忽略被点击",
                                    Toast.LENGTH_SHORT).show();
                             dialog.cancel();
                         }
                     });
                     builder.show();
                 }
             });

      展示效果:

    AlterDialog的列表形式

      AlterDialog除了展示一些提示信息,还可以展示一种列表的形式,需要使用到 Builder.setItems(CharSequence[] items,DialogInterface.OnClickListener listener)方法进行设置,它需要传递一个CharSequenece类型的数组,以绑定列表的数据,它同样需要传递一个 DialogInterface.OnClickListener接口,以响应列表项的点击,而这个接口中onClick方法的which参数,为当前点 击触发项的items中的下标。

      示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    btnListView.setOnClickListener(new View.OnClickListener() {
     
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
           AlertDialog.Builder builder = new AlertDialog.Builder(
                   MainActivity.this);
            builder.setTitle("请选择城市");
            //items使用全局的finalCharSequenece数组声明
            builder.setItems(items, new OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    // TODO Auto-generated method stub
                    String select_item = items[which].toString();
                    Toast.makeText(MainActivity.this,
                            "选择了---》" + select_item, Toast.LENGTH_SHORT)
                            .show();
                }
            });
            builder.show();
        }
    });
      效果展示: 

     AlterDialog的单选列表

      AlterDialog还可以使用一种单选的列表样式,使用 Builder.setSingleChoiceItems(CharSequenece[] items,int checkedItem,DialogInterface.OnClickListener listener),这个方法具有多项重载,主要是为了应对不同的数据源,items为列表项数组,checkedItem为初始选项,listener 为点击响应事件。有时候并不一定需要选中之后就关闭对话框,可以设置两个按钮,用于确定选择。

      示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    btnListViewSingle.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    AlertDialog.Builder builder = new AlertDialog.Builder(
                            MainActivity.this);
                    builder.setTitle("请选择一下城市");
                    builder.setSingleChoiceItems(items, 1, new OnClickListener() {
     
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            // TODO Auto-generated method stub
                           String select_item = items[which].toString();
                            Toast.makeText(MainActivity.this,
                                    "选择了--->>" + select_item, Toast.LENGTH_SHORT)
                                    .show();
                        }
                    });
                    builder.setPositiveButton("确定", new OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            dialog.dismiss();
                        }
                   });
                    builder.show();
                }
            });

      效果展示:

    AlterDialog多选列表

      AlterDialog除了单选列表,还有多选的列表。可以使用 Builder.setMultiChoiceItems(CharSequence[] items,boolean[] checkedItems,DialogInterface.OnMultiChoiceClickListener listener),这个方法也同样具有多样重载,对于这个方法,items以一个数组为数据源;checkedItems是默认的选项,因为是多选列 表,所以如果设置需要全部设置,如果没有默认选中,则传Null;listener为多选项点击触发事件。

      示例: 

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    btnListViewMulti.setOnClickListener(new View.OnClickListener() {
      
                @Override
                 public void onClick(View v) {
                    // TODO Auto-generated method stub
                   AlertDialog.Builder builder = new AlertDialog.Builder(
                            MainActivity.this);
                   builder.setTitle("请选择城市");
                     builder.setMultiChoiceItems(items, new boolean[] { true, false,
                             true }, new OnMultiChoiceClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which,
                                boolean isChecked) {
                            // TODO Auto-generated method stub
                            String select_item = items[which].toString();
                             Toast.makeText(MainActivity.this,
                                     "选择了--->>" + select_item, Toast.LENGTH_SHORT)
                                     .show();
                         }
                     });
                     builder.setPositiveButton("确定", new OnClickListener() {
                         @Override
                        public void onClick(DialogInterface dialog, int which) {
                            dialog.dismiss();
                        }
                     });
                    builder.show();
                }
             });

      效果展示:

     

    AlertDialog自定义样式

      有些时候,Android自带的一些样式设置已经无法满足需求了,那么可以使用自定义样式,自定义个XML布局文件,用这个文件的内容作为 AlertDialog的样式展示在屏幕上,这样就可以灵活定制对话框了。对于定制的XML文件,可以使用 LayoutInflater.from(Context).inflate(int,ViewGroup)的方式对其进行动态加载,然后使用 Builder.setView(View)把加载的视图与Builder对象进行关联,最后正常show()即可。

      布局代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:orientation="vertical"
        android:paddingBottom="@dimen/activity_vertical_margin"
         android:paddingLeft="@dimen/activity_horizontal_margin"
         android:paddingRight="@dimen/activity_horizontal_margin"
         android:paddingTop="@dimen/activity_vertical_margin"
         tools:context=".MainActivity" >
     
        <Button
             android:id="@+id/btnGeneral"
            android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:text="普通对话框" />
      
         <Button
             android:id="@+id/btnButtons"
            android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:text="多按钮的普通对话框" />
      
        <Button
             android:id="@+id/btnListView"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:text="列表选择对话框" />
      
         <Button
            android:id="@+id/btnListViewSingle"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:text="单选列表选择对话框" />
      
         <Button
             android:id="@+id/btnListViewMulti"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:text="多选列表选择对话框" />
     
         <Button
             android:id="@+id/btnProgressDialog"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:text="滚动等待对话框" />
      
         <Button
             android:id="@+id/btnProgressDialogH"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:text="进度条对话框" />
         <Button
            android:id="@+id/btnCustomDialog"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:text="自定义对话框" />
     </LinearLayout>

      实现代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    btnCustomDialog.setOnClickListener(new View.OnClickListener() {
                  
                 @Override
                public void onClick(View v) {
                    AlertDialog.Builder builder=new AlertDialog.Builder(MainActivity.this);
                     View view=LayoutInflater.from(MainActivity.this).inflate(R.layout.dialog_signin,null);
                     Button btn=(Button)view.findViewById(R.id.btnCustom);
                     btn.setOnClickListener(new View.OnClickListener() {
                          
                         @Override
                         public void onClick(View v) {
                             // TODO Auto-generated method stub
                             alertDialog.dismiss();
                            Toast.makeText(MainActivity.this, "表单填写完成",
                                     Toast.LENGTH_SHORT).show();
                         }
                     });
                     builder.setView(view);
                     alertDialog=builder.show();               
                 }
             });

      效果展示:

    ProgressDialog

      有些时候,只是需要提示用户等待,比如在执行耗时操作等的时候,可以使用进度对话框来显示一个进度信息,提示用户等待,这个时候可以使用 ProgressDialog。ProgressDialog的使用方式大部分可以参见ProgressBar,其实就是一个封装了 ProgressBar的对话框。

      ProgressDialog有 两种显示方式,一种是以一个滚动的环状图标,可以显示一个标题和一段文本内容的等待对话框;另外一种是带刻度的进度条,和常规的进度条用法一致。两种样式 通过ProgressDialog.setProgressStyle(int style)设置,可以通过ProgressDialog的两个常量进行设置:STYLE_HORIZONTAL:刻度滚 动;STYLE_SPINNER:图标滚动,默认选项。

      对于图标滚动,可以使用两种方式实现,一种是常规的调用构造函数,再设置对应的属性;另外一种是直接使用ProgressDialog的静态方法show(),直接返回一个ProgressDialog对象,并且调用show()方法。

      示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    btnProgressDialog.setOnClickListener(new View.OnClickListener() {
      
                 @Override
                 public void onClick(View v) {
                     // 第一种方法,使用ProgressDialog构造函数
                     progressDialog = new ProgressDialog(MainActivity.this);
                     progressDialog.setIcon(R.drawable.ic_launcher);
                     progressDialog.setTitle("等待");
                     progressDialog.setMessage("正在加载....");
                    progressDialog.show();
                     //第二种方法,使用静态的show方法
                     //progressDialog=ProgressDialog.show(MainActivity.this, "等待", "正在加载....", false, false);
                     new Thread(new Runnable() {
      
                         @Override
                         public void run() {
                            try {
                                 Thread.sleep(5000);           
                             } catch (Exception e) {
                                 e.printStackTrace();
                             }
                            finally{
                                 progressDialog.dismiss();
                             }                       
                         }
                     }).start();
                 }
             });

      效果展示:

      对于有刻度的ProgressDialog,除了从AlertDialog中继承来的属性,有一些必要的属性需要设置,以下方法都有对于的getter方法:

    • setMax(int max):最大刻度。
    • setProgress(int value):第一进度。
    • setSecondaryProgress(int value):第二进度。

      示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    btnProgressDialog.setOnClickListener(new View.OnClickListener() {
      
                 @Override
                 public void onClick(View v) {
                     // 第一种方法,使用ProgressDialog构造函数
                     progressDialog = new ProgressDialog(MainActivity.this);
                     progressDialog.setIcon(R.drawable.ic_launcher);
                     progressDialog.setTitle("等待");
                     progressDialog.setMessage("正在加载....");
                     progressDialog.show();
                     //第二种方法,使用静态的show方法
                     //progressDialog=ProgressDialog.show(MainActivity.this, "等待", "正在加载....", false, false);
                     new Thread(new Runnable() {
      
                         @Override
                         public void run() {
                            try {
                                 Thread.sleep(5000);           
                             } catch (Exception e) {
                                 e.printStackTrace();
                             }
                             finally{
                                 progressDialog.dismiss();
                             }                       
                         }
                     }).start();
                 }
             });

      效果展示:

       源码下载

     总结

      以上就介绍了常用的对话框的内容,DatePickerDialog和TimePickerDialog在另外一篇博客中有介绍到,可以看看:Android--UI之DatePicker、TimePicker... 。 从最新的官方文档上了解到,推荐使用FragmentDialog来操作Dialog,这样便于管理,有关Fragment的内容,还没有介绍,以后介绍 了Fragment之后再说说怎么使用FragmentDialog来创建对话框。在源码里有一个FragmentDialog的简单例子,有兴趣的可以 下载下来看看。

    二、自定义Dialog的介绍(步骤清晰

    1、Android自定义对话框(Dialog)位置,大小

    转自:http://blog.csdn.net/fancylovejava/article/details/21617553

    代码:

    复制代码
    package angel.devil;

    import android.app.Activity;
    import android.app.Dialog;
    import android.os.Bundle;
    import android.view.Gravity;
    import android.view.Window;
    import android.view.WindowManager;

    public class DialogDemoActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Dialog dialog = new Dialog(this);

    // setContentView可以设置为一个View也可以简单地指定资源ID
    // LayoutInflater
    // li=(LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);
    // View v=li.inflate(R.layout.dialog_layout, null);
    // dialog.setContentView(v);
    dialog.setContentView(R.layout.dialog_layout);

    dialog.setTitle("Custom Dialog");

    /*
    * 获取对话框的窗口对象参数对象修改对话框的布局设置,
    * 可以直接调用getWindow(),表示获得这个Activity的Window
    * 对象,这样这可以以同样的方式改变这个Activity的属性.
    */
    Window dialogWindow = dialog.getWindow();
    WindowManager.LayoutParams lp = dialogWindow.getAttributes();
    dialogWindow.setGravity(Gravity.LEFT | Gravity.TOP);

    /*
    * lp.xlp.y表示相对于原始位置的偏移.
    * 当参数值包含Gravity.LEFT时,对话框出现在左边,所以lp.x就表示相对左边的偏移,负值忽略.
    * 当参数值包含Gravity.RIGHT时,对话框出现在右边,所以lp.x就表示相对右边的偏移,负值忽略.
    * 当参数值包含Gravity.TOP时,对话框出现在上边,所以lp.y就表示相对上边的偏移,负值忽略.
    * 当参数值包含Gravity.BOTTOM时,对话框出现在下边,所以lp.y就表示相对下边的偏移,负值忽略.
    * 当参数值包含Gravity.CENTER_HORIZONTAL时
    * ,对话框水平居中,所以lp.x就表示在水平居中的位置移动lp.x像素,正值向右移动,负值向左移动.
    * 当参数值包含Gravity.CENTER_VERTICAL时
    * ,对话框垂直居中,所以lp.y就表示在垂直居中的位置移动lp.y像素,正值向右移动,负值向左移动.
    * gravity的默认值为Gravity.CENTER,即Gravity.CENTER_HORIZONTAL |
    * Gravity.CENTER_VERTICAL.
    *
    * 本来setGravity的参数值为Gravity.LEFT | Gravity.TOP时对话框应出现在程序的左上角,但在
    * 我手机上测试时发现距左边与上边都有一小段距离,而且垂直坐标把程序标题栏也计算在内了,
    * Gravity.LEFT, Gravity.TOP, Gravity.BOTTOM与Gravity.RIGHT都是如此,据边界有一小段距离
    */
    lp.x = 100; // 新位置X坐标
    lp.y = 100; // 新位置Y坐标
    lp.width = 300; // 宽度
    lp.height = 300; // 高度
    lp.alpha = 0.7f; // 透明度

    // 当Window的Attributes改变时系统会调用此函数,可以直接调用以应用上面对窗口参数的更改,也可以用setAttributes
    // dialog.onWindowAttributesChanged(lp);
    dialogWindow.setAttributes(lp);

    /*
    * 将对话框的大小按屏幕大小的百分比设置
    */
    // WindowManager m = getWindowManager();
    // Display d = m.getDefaultDisplay(); // 获取屏幕宽、高用
    // WindowManager.LayoutParams p = dialogWindow.getAttributes(); // 获取对话框当前的参数值
    // p.height = (int) (d.getHeight() * 0.6); // 高度设置为屏幕的0.6
    // p.width = (int) (d.getWidth() * 0.65); // 宽度设置为屏幕的0.65
    // dialogWindow.setAttributes(p);

    dialog.show();

    }
    }
    复制代码

    布局文件:

    main.xml

    复制代码
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#00FF00"
    android:orientation="vertical" >

    <TextView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/hello" />

    </LinearLayout>
    复制代码

    dialog_layout.xml

    复制代码
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/layout_root"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal"
    android:padding="10dp" >

    <ImageView
    android:id="@+id/image"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginRight="10dp"
    android:src="@drawable/ic_launcher" />

    <TextView
    android:id="@+id/text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="A Dialog"
    android:textColor="#FFF" />

    </LinearLayout>
    复制代码

     

    2、Android自定义Dialog

    Corn

    专注Android领域开发。 仰望星空,同时需要脚踏实地。 ——Android交流群:343816731

     

    Android开发过程中,常常会遇到一些需求场景——在界面上弹出一个弹框,对用户进行提醒并让用户进行某些选择性的操作,

    如退出登录时的弹窗,让用户选择“退出”还是“取消”等操作。

    Android系统提供了Dialog类,以及Dialog的子类,常见如AlertDialog来实现此类功能。

    一般情况下,利用Android提供的Dialog及其子类能够满足多数此类需求,然而,其不足之处体现在:

    1. 基于Android提供的Dialog及其子类样式单一,风格上与App本身风格可能不太协调;

    2. Dialog弹窗在布局和功能上有所限制,有时不一定能满足实际的业务需求。

    本文将通过在Dialog基础上构建自定义的Dialog弹窗,以最常见的确认弹框为例。

    本样式相对比较简单:上面有一个弹框标题(提示语),下面左右分别是“确认”和“取消”按钮,当用户点击“确认”按钮时,弹框执行

    相应的确认逻辑,当点击“取消”按钮时,执行相应的取消逻辑。

    首先,自定义弹框样式:

    复制代码
     1 <?xml version="1.0" encoding="utf-8"?>
     2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     3     android:layout_width="match_parent"
     4     android:layout_height="wrap_content"
     5     android:background="@drawable/dialog_bg"
     6     android:orientation="vertical" >
     7 
     8     <TextView
     9         android:id="@+id/title"
    10         android:layout_width="wrap_content"
    11         android:layout_height="wrap_content"
    12         android:layout_gravity="center"
    13         android:paddingTop="14dp"
    14         android:textColor="@color/login_hint"
    15         android:textSize="@dimen/text_size_18" />
    16 
    17     <LinearLayout
    18         android:layout_width="match_parent"
    19         android:layout_height="wrap_content"
    20         android:layout_marginBottom="14dp"
    21         android:layout_marginLeft="20dp"
    22         android:layout_marginRight="20dp"
    23         android:layout_marginTop="30dp" >
    24 
    25         <TextView
    26             android:id="@+id/confirm"
    27             android:layout_width="wrap_content"
    28             android:layout_height="wrap_content"
    29             android:layout_marginRight="10dp"
    30             android:layout_weight="1"
    31             android:background="@drawable/btn_confirm_selector"
    32             android:gravity="center"
    33             android:textColor="@color/white"
    34             android:textSize="@dimen/text_size_16" />
    35 
    36         <TextView
    37             android:id="@+id/cancel"
    38             android:layout_width="wrap_content"
    39             android:layout_height="wrap_content"
    40             android:layout_marginLeft="10dp"
    41             android:layout_weight="1"
    42             android:background="@drawable/btn_cancel_selector"
    43             android:gravity="center"
    44             android:textColor="@color/login_hint"
    45             android:textSize="@dimen/text_size_16" />
    46     </LinearLayout>
    47 
    48 </LinearLayout>
    复制代码

    然后,通过继承Dialog类构建确认弹框控件ConfirmDialog:

    复制代码
     1 package com.corn.widget;
     2 
     3 import android.app.Dialog;
     4 import android.content.Context;
     5 import android.os.Bundle;
     6 import android.util.DisplayMetrics;
     7 import android.view.LayoutInflater;
     8 import android.view.View;
     9 import android.view.Window;
    10 import android.view.WindowManager;
    11 import android.widget.TextView;
    12 
    13 import com.corn.R;
    14 
    15 public class ConfirmDialog extends Dialog {
    16 
    17     private Context context;
    18     private String title;
    19     private String confirmButtonText;
    20     private String cacelButtonText;
    21     private ClickListenerInterface clickListenerInterface;
    22 
    23     public interface ClickListenerInterface {
    24 
    25         public void doConfirm();
    26 
    27         public void doCancel();
    28     }
    29 
    30     public ConfirmDialog(Context context, String title, String confirmButtonText, String cacelButtonText) {
    31         super(context, R.style.MyDialog);
    32         this.context = context;
    33         this.title = title;
    34         this.confirmButtonText = confirmButtonText;
    35         this.cacelButtonText = cacelButtonText;
    36     }
    37 
    38     @Override
    39     PROTECTED void onCreate(Bundle savedInstanceState) {
    40         // TODO Auto-generated method stub
    41         SUPER.onCreate(savedInstanceState);
    42 
    43         init();
    44     }
    45 
    46     public void init() {
    47         LayoutInflater inflater = LayoutInflater.from(context);
    48         View view = inflater.inflate(R.layout.confirm_dialog, null);
    49         setContentView(view);
    50 
    51         TextView tvTitle = (TextView) view.findViewById(R.id.title);
    52         TextView tvConfirm = (TextView) view.findViewById(R.id.confirm);
    53         TextView tvCancel = (TextView) view.findViewById(R.id.cancel);
    54 
    55         tvTitle.setText(title);
    56         tvConfirm.setText(confirmButtonText);
    57         tvCancel.setText(cacelButtonText);
    58 
    59         tvConfirm.setOnClickListener(new clickListener());
    60         tvCancel.setOnClickListener(new clickListener());
    61 
    62         Window dialogWindow = getWindow();
    63         WindowManager.LayoutParams lp = dialogWindow.getAttributes();
    64         DisplayMetrics d = context.getResources().getDisplayMetrics(); // 获取屏幕宽、高用
    65         lp.width = (int) (d.widthPixels * 0.8); // 高度设置为屏幕的0.6
    66         dialogWindow.setAttributes(lp);
    67     }
    68 
    69     public void setClicklistener(ClickListenerInterface clickListenerInterface) {
    70         this.clickListenerInterface = clickListenerInterface;
    71     }
    72 
    73     private class clickListener implements View.OnClickListener {
    74         @Override
    75         public void onClick(View v) {
    76             // TODO Auto-generated method stub
    77             int id = v.getId();
    78             switch (id) {
    79             case R.id.confirm:
    80                 clickListenerInterface.doConfirm();
    81                 break;
    82             case R.id.cancel:
    83                 clickListenerInterface.doCancel();
    84                 break;
    85             }
    86         }
    87 
    88     };
    89 
    90 }
    复制代码

    在如上空间构造代码中,由于控件的"确认"和"取消"逻辑与实际的应用场景有关,因此,控件中通过定义内部接口来实现。

    在需要使用此控件的地方,进行如下形式调用:

    复制代码
     1 public static void Exit(FINAL Context context) {
     2         final ConfirmDialog confirmDialog = new ConfirmDialog(context, "确定要退出吗?", "退出", "取消");
     3         confirmDialog.show();
     4         confirmDialog.setClicklistener(new ConfirmDialog.ClickListenerInterface() {
     5             @Override
     6             public void doConfirm() {
     7                 // TODO Auto-generated method stub
     8                 confirmDialog.dismiss();
     9                 //toUserHome(context);
    10                 AppManager.getAppManager().AppExit(context);
    11             }
    12 
    13             @Override
    14             public void doCancel() {
    15                 // TODO Auto-generated method stub
    16                 confirmDialog.dismiss();
    17             }
    18         });
    19     }
    复制代码

    调用中实现了此控件的内部接口,并赋给控件本身,以此在点击按钮时实现基于外部具体业务逻辑的函数回调。

  • 相关阅读:
    通信原理
    java实现聊天室的简单实现
    计算机网络笔记——第四章、网络层
    泛型高级之通配符
    看文档总结
    HashSet源码解析
    HashTable源码解析
    计算机网络笔记——第三章、数据链路层
    Collection集合的功能
    第六章 应用层
  • 原文地址:https://www.cnblogs.com/cheneasternsun/p/5463278.html
Copyright © 2011-2022 走看看