美文网首页
Android中Dialog简析

Android中Dialog简析

作者: f44148db1e8c | 来源:发表于2019-05-19 18:29 被阅读0次

    均属于笔记,仅供个人参考,有问题欢迎指正,整理模式

    一,7种形式的Android Dialog使用举例

    在Android开发中,我们经常会需要在Android界面上弹出一些对话框,比如询问用户或者让用户选择。这些功能我们叫它Android Dialog对话框,在我们使用Android的过程中,我归纳了一下,Android Dialog的类型无非也就7种,下面我分别向大家介绍这7种Android Dialog对话框的使用方法,希望对大家能有所帮助。

    1.该效果是当按返回按钮时弹出一个提示,来确保无误操作,采用常见的对话框样式。

    创建dialog对话框方法代码如下:

    创建dialog对话框方法代码如下:

    protected void dialog() { 

        AlertDialog.Builder builder = new Builder(Main.this); 

        builder.setMessage("确认退出吗?"); 

        builder.setTitle("提示"); 

        builder.setPositiveButton("确认", new OnClickListener() { 

        @Override 

        public void onClick(DialogInterface dialog, int which) { 

          dialog.dismiss(); 

          Main.this.finish(); 

        } 

        }); 

        builder.setNegativeButton("取消", new OnClickListener() { 

        @Override 

        public void onClick(DialogInterface dialog, int which) { 

          dialog.dismiss(); 

        } 

        }); 

        builder.create().show(); 

       } 

    在onKeyDown(int keyCode, KeyEvent event)方法中调用此方法

    if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { 

        dialog(); 

        } 

        return false; 

       } 

    2.改变了对话框的图表,添加了三个按钮

    创建dialog的方法代码如下:

    Dialog dialog = new AlertDialog.Builder(this).setIcon( 

          android.R.drawable.btn_star).setTitle("喜好调查").setMessage( 

          "你喜欢李连杰的电影吗?").setPositiveButton("很喜欢", 

          new OnClickListener() { 

            @Override 

            public void onClick(DialogInterface dialog, int which) { 

            // TODO Auto-generated method stub 

            Toast.makeText(Main.this, "我很喜欢他的电影。", 

              Toast.LENGTH_LONG).show(); 

            } 

          }).setNegativeButton("不喜欢", new OnClickListener() { 

          @Override 

          public void onClick(DialogInterface dialog, int which) { 

          // TODO Auto-generated method stub 

          Toast.makeText(Main.this, "我不喜欢他的电影。", Toast.LENGTH_LONG) 

            .show(); 

          } 

        }).setNeutralButton("一般", new OnClickListener() { 

          @Override 

          public void onClick(DialogInterface dialog, int which) { 

          // TODO Auto-generated method stub 

          Toast.makeText(Main.this, "谈不上喜欢不喜欢。", Toast.LENGTH_LONG) 

            .show(); 

          } 

        }).create(); 

        dialog.show(); 

    3.信息内容是一个简单的View类型

    创建dialog方法的代码如下:

    new AlertDialog.Builder(this).setTitle("请输入").setIcon( 

          android.R.drawable.ic_dialog_info).setView( 

          new EditText(this)).setPositiveButton("确定", null) 

          .setNegativeButton("取消", null).show(); 

    4.信息内容是一组单选框

    创建dialog方法的代码如下:

    new AlertDialog.Builder(this).setTitle("复选框").setMultiChoiceItems( 

          new String[] { "Item1", "Item2" }, null, null) 

          .setPositiveButton("确定", null) 

          .setNegativeButton("取消", null).show(); 

    5.信息内容是一组多选框

    创建dialog方法的代码如下:

    new AlertDialog.Builder(this).setTitle("单选框").setIcon( 

          android.R.drawable.ic_dialog_info).setSingleChoiceItems( 

          new String[] { "Item1", "Item2" }, 0, 

          new DialogInterface.OnClickListener() { 

            public void onClick(DialogInterface dialog, int which) { 

            dialog.dismiss(); 

            } 

          }).setNegativeButton("取消", null).show(); 

    6.信息内容是一组简单列表项

    创建dialog的方法代码如下:

    new AlertDialog.Builder(this).setTitle("列表框").setItems( 

          new String[] { "Item1", "Item2" }, null).setNegativeButton( 

          "确定", null).show(); 

    7.信息内容是一个自定义的布局

    dialog布局文件代码如下:

    <?xml version="1.0" encoding="utf-8"?> 

      <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 

       android:layout_height="wrap_content" android:layout_width="wrap_content" 

       android:background="#ffffffff" android:orientation="horizontal" 

       android:id="@+id/dialog"> 

       <TextView android:layout_height="wrap_content" 

        android:layout_width="wrap_content" 

        android:id="@+id/tvname" android:text="姓名:" /> 

       <EditText android:layout_height="wrap_content" 

        android:layout_width="wrap_content" android:id="@+id/etname" android:minWidth="100dip"/> 

      </LinearLayout> 

    创建dialog方法的代码如下:

    LayoutInflater inflater = getLayoutInflater(); 

        View layout = inflater.inflate(R.layout.dialog, 

          (ViewGroup) findViewById(R.id.dialog)); 

        new AlertDialog.Builder(this).setTitle("自定义布局").setView(layout) 

          .setPositiveButton("确定", null) 

          .setNegativeButton("取消", null).show(); 

    参考:http://blog.csdn.net/qq457163027/article/details/51192531

    http://www.android100.org/html/201302/18/1611.html

    二,小的知识点

    1,create().show()和show()都可以是显示弹出框,两者的区别和联系:

    没加create()时show()方法是AlertDialog.Builder类的show()方法;

    加了create()方法后的show()方法是Dialog类的show()方法;

    而AlertDialog.Builder类的show()方法如下:

    AlertDialog.Builder.show()

    {

    AlertDialog dialog = create();

    dialog.show();

    return dialog;

    }

    AlertDialog.Builder类的show()方法里头自己有create()方法。

    2,dialog.dismiss()方法的作用:

    让dialog消失。

    在builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {

    @Override

    public void onClick(DialogInterface dialog, int arg1) {

    //有没有这行代码点击后弹出框都可以消失。

    // dialog.dismiss();

    }

    });

    三, Android自定义Dialog简单实例

    做Android应用中,最缺少不了的就是自定义Dialog,对于系统默认提供的Dialog样式,一般都不复合我们应用的样式。

    自定义Dialog需要3步骤即可:

    1)、主要的重写Dialog的Java类

    2)、自定义布局文件、并设置Dialog Theme,在style.xml文件中加一个即可

    3)、使用方法

    1、创建CustomPopDialog2.java类

    import android.app.Dialog;

    import android.content.Context;

    import android.graphics.Bitmap;

    import android.view.LayoutInflater;

    import android.view.View;

    import android.view.WindowManager.LayoutParams;

    import android.widget.ImageView;

    /**

    * 该自定义Dialog应用在:弹出框居中显示图片,点击其他区域自动关闭Dialog

    */

    public class CustomPopDialog2 extends Dialog {

        public CustomPopDialog2(Context context) {

            super(context);

        }

        public CustomPopDialog2(Context context, int theme) {

            super(context, theme);

        }

        public static class Builder {

            private Context context;

            private Bitmap image;

            public Builder(Context context) {

                this.context = context;

            }

            public Bitmap getImage() {

                return image;

            }

            public void setImage(Bitmap image) {

                this.image = image;

            }

            public CustomPopDialog2 create() {

                LayoutInflater inflater = (LayoutInflater) context

                        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

                final CustomPopDialog2 dialog = new CustomPopDialog2(context,R.style.Dialog);

                View layout = inflater.inflate(R.layout.dialog_share_qrcode, null);

                dialog.addContentView(layout, new LayoutParams(

                        android.view.ViewGroup.LayoutParams.WRAP_CONTENT

                        , android.view.ViewGroup.LayoutParams.WRAP_CONTENT));

                dialog.setContentView(layout);

                ImageView img = (ImageView)layout.findViewById(R.id.img_qrcode);

                img.setImageBitmap(getImage());

                return dialog;

            }

        }

    }

    这里简单说明下,我们自定义Dialog需要准备一个自己的View布局文件,主要关注create()方法即可,本例中就是直接显示一个图片。

    2、自定义View的布局文件、并在style.xml中添加theme

    <?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:orientation="vertical" android:gravity="center"

        android:id="@+id/rootLayout">

        <ImageView

            android:id="@+id/img_qrcode"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:contentDescription="二维码" />

    </LinearLayout>

    样式:

        <style name="Dialog" parent="android:style/Theme.Dialog">

            <item name="android:background">#00000000</item>

            <item name="android:windowBackground">@android:color/transparent</item>

            <item name="android:windowNoTitle">true</item>

            <item name="android:windowIsFloating">true</item>

        </style>

    3、使用自定义的Dialog

            Bitmap bitmap = xxxxx;// 这里是获取图片Bitmap,也可以传入其他参数到Dialog中

            CustomPopDialog2.Builder dialogBuild = new CustomPopDialog2.Builder(context);

            dialogBuild.setImage(bitmap);

            CustomPopDialog2 dialog = dialogBuild.create();

            dialog.setCanceledOnTouchOutside(true);// 点击外部区域关闭

            dialog.show();

    参考:http://blog.csdn.net/catoop/article/details/50177147

    http://blog.csdn.net/duanyanrui/article/details/8494767

    四,Android--Dialog详细讲解

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

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

    AlertDialog:警告对话框,使用最广泛功能最丰富的一个对话框。

    ProgressDialog:进度条对话框,只是对进度条进行了简单的封装。

    DatePickerDialog:日期对话框。

    TimePickerDialog:时间对话框。

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

    参考:http://www.kwstu.com/ArticleView/kwstu_20139682354515

    http://blog.csdn.net/liang5630/article/details/44098899

    五,设置Dialog使返回键和点击外围失效(默认返回键和点击外围都可以使其消失)

    1,对于AlertDialog.Builder(this)这种形式创建的Dialog

    对于AlertDialog.Builder(this)这种形式创建的Dialog,只要new AlertDialog.Builder(this).setCancelable(false)这一行就可以使点击外围和返回键都失效。

    2,对于AlertDialog dlg = new AlertDialog.Builder(this).create();先获取具体的Dialog的处理

    dialog.setCancelable(false);这行代码也可以使返回键和点击外围失效。

    Dialog的出现,很好的提升生了用户的用户体验,但是对于咱们程序猿来说,怎么样来好好的控制用户的误操作是个头疼问题啊,Dialog默认在按下返回键的时候会消失掉,那么如何让Dialog在用户按下返回键也不消失呢,方法是有的,毕竟Android是去过太空的,方法就是应该截取dialog的key响应事件,当dialog在前台显示的时候,keylistener首先会派发到dialog里面,在那里面监听就好了。

    首先申请一个keylistener,在里面监听系统的按键,当然同样可以监听home键和其他的按键:

    private OnKeyListener keylistener = new DialogInterface.OnKeyListener() { 

            public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { 

                if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { 

                    return true; 

                } else { 

                    return false; 

                } 

            } 

        }; 

    然后在你创建Dialog的时候,将这个监听注册进去就哦了,方法如下:

    AlertDialog dlg = new AlertDialog.Builder(this).create(); 

    dlg.setOnKeyListener(keylistener); 

    dlg.setCancelable(false); 

    dlg.show(); 

    其他的操作这里就不再累述,这样就算你按下返回,Dialog就不会消失了,PS: setCancelable(false),作用是当dialog弹出来的时候,如果触点在dialog外围,按照默认的方式 dialog将消失。如果这个设为false的话 这种情况dialog就不会消失了。  加了这一句就OK了 dialog.setCancelable(false);

    参考:http://blog.csdn.net/LuckChouDog/article/details/42234801

    六,Android界面之----自定义的Dialog,然后利用回调方法,在调用处,进行Dialog中各按钮的事件处理

    public class LeaveMeetingDialog extends Dialog  implements OnClickListener{

        private Button  quitBtn,stopBtn,cancelBtn;

        private LeaveMeetingDialogListener listener;

        public interface LeaveMeetingDialogListener{

            public void onClick(View view);

        }

        public LeaveMeetingDialog(Context context,int theme,LeaveMeetingDialogListener listener) {

            super(context,theme);

        }

        @Override

        protected void onCreate(Bundle savedInstanceState) {

            super.onCreate(savedInstanceState);

            setContentView(R.layout.leave_meeting_dialog);

            initViews();

        }

        private void initViews(){

            quitBtn = (Button)findViewById(R.id.quit_btn);

            stopBtn = (Button)findViewById(R.id.stop_btn);

            cancelBtn = (Button)findViewById(R.id.cancel_btn);

            quitBtn.setOnClickListener(this);

            stopBtn.setOnClickListener(this);

            cancelBtn.setOnClickListener(this);

        }

        @Override

        public void onClick(View v) {

            listener.onClick(v);

        }

    }

    ---调用处:

    [java]

    LeaveMeetingDialog  dialog = new LeaveMeetingDialog(this,R.style.Theme_CustomDialog,

                new LeaveMeetingDialogListener() {

            @Override

            public void onClick(View view) {

                switch(view.getId()){

                    case R.id.quit_btn:break;

                    case R.id.stop_btn:break;

                    case R.id.cancel_btn:break;

                }

            }

    });

          dialog.show();

    参考:http://www.2cto.com/kf/201205/133945.html

    七,显示弹出框后,后面界面不变暗

    第一种是在样式文件styles.xml中添加新的样式,父样式指向的是默认的Dialog样式,修改如下,然后你的Dialog用你添加的样式就可以了.

    <resources> 

        <style name="DialogStyle" parent="@android:style/Theme.Dialog"> 

            <!-- dialog背景样式 -->

            <item name="android:windowBackground"> @android:color/transparent </item> 

            <!-- 背景透明 -->

            <item name="android:backgroundDimEnabled">false</item>    </style>     

    </resources>

    第二种是在代码中修改.lp.alpha大小随自己要求设置

    // 设置屏幕背景变暗

    private void setScreenBgDarken() {

    WindowManager.LayoutParams lp = getWindow().getAttributes();

    lp.alpha = 0.5f;

    lp.dimAmount = 0.5f;

    getWindow().setAttributes(lp);

    }

    // 设置屏幕背景变亮

    private void setScreenBgLight() {

    WindowManager.LayoutParams lp = getWindow().getAttributes();

    lp.alpha = 1.0f;

    lp.dimAmount = 1.0f;

    getWindow().setAttributes(lp);

    }

    相关文章

      网友评论

          本文标题:Android中Dialog简析

          本文链接:https://www.haomeiwen.com/subject/qqbqzqtx.html