Dialog的使用

Dialog的使用可以简单分为:1.使用原生方法(多为AlertDialog.Builder所提供)。2.自定义Dialog。

Screenshot_2019-06-16-23-19-27_副本.png
Screenshot_2019-06-16-23-19-27_副本2.png
Screenshot_2019-06-16-23-19-27_副本3.png
需要注意的是,Dialog是自带背景的,根据不同的Theme可以有不同颜色的背景,如上图,在使用有背景的View时,白色的四个角显得很难看,可以根据需求设置。

    <!--明亮风格的Dialog-->
    <style name="LightDialog" parent="Base.Theme.AppCompat.Light.Dialog">

    </style>
    <!--暗风格的Dialog-->
    <style name="Dialog" parent="Base.Theme.AppCompat.Dialog">

    </style>
    <!--没有背景的Dialog-->
    <style name="NoBackgroundDialog" parent="Base.Theme.AppCompat.Light.Dialog">
        <!--解决布局无法占据全屏的问题,是window的背景,比background高一级-->
        <item name="android:windowBackground">@null</item>
        <!--布局的背景-->
        <item name="android:background">@null</item>
        <!--window的前景-->
        <item name="android:windowFrame">@null</item>
        <!--昏暗效果启用:false,则dialog的背景没有半透明效果-->
        <item name="android:backgroundDimEnabled">true</item>
        <!--window是否半透明:好像没有什么效果-->
        <item name="android:windowIsTranslucent">true</item>
        <!--悬浮于activity之上-->
        <item name="android:windowIsFloating">true</item>
    </style>

1.普通Dialog
private void bt1Click() {
        new AlertDialog.Builder(this, R.style.LightDialog)
                .setTitle("普通Dialog")
                .setMessage("消息内容")
                .setNeutralButton("关闭", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        L.e("Dialog%d", which);
                    }
                })
                .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        L.e("Dialog%d", which);
                    }
                })
                .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        L.e("Dialog%d", which);
                    }
                }).show();
    }
2.多选框
    private void bt2Click() {
        new AlertDialog.Builder(this, R.style.LightDialog)
                .setTitle("多选框")
                .setMultiChoiceItems(R.array.items, null, new DialogInterface.OnMultiChoiceClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which, boolean isChecked) {
                        L.e("第%d个选择%b", which, isChecked);
                    }
                }).show();
    }

3.单选框
 private void bt3Click() {
        AlertDialog.Builder builder = new AlertDialog.Builder(this, R.style.LightDialog);
        builder.setTitle("单选框");
        //方法1
        builder.setSingleChoiceItems(R.array.items, 1, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                L.e(which);
            }
        });
        //方法2:类似于列表
        builder.setSingleChoiceItems(
                new ArrayAdapter<>(this, R.layout.item_dialog, R.id.tv_item_dialog, new String[]{"a", "b", "c"}),
                1,
                new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        L.e(which);
                    }
                });
        builder.show();
    }
4.列表框
 private void bt4Click() {
        AlertDialog.Builder builder = new AlertDialog.Builder(this, R.style.LightDialog);
        builder.setTitle("列表框");
        //方法1
      /*  builder.setItems(R.array.items, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                L.e(which);
            }
        });*/
        //方法2
        builder.setAdapter(
                new ArrayAdapter<>(this, R.layout.item_dialog, R.id.tv_item_dialog, new String[]{"a", "b", "c"}),
                new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        L.e(which);
                    }
                });
        builder.show();
    }

5.等待框
    private void bt5Click() {
        ProgressDialog progressDialog = new ProgressDialog(this);
        progressDialog.setTitle("等待框");
        progressDialog.setMessage("等待中");
        progressDialog.show();
    }
6.进度框
    private void bt6Click() {
        ProgressDialog progressDialog = new ProgressDialog(this);
        progressDialog.setTitle("进度条");
        progressDialog.setMessage("等待中");
        progressDialog.setIndeterminate(false);
        progressDialog.setMax(100);
        progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        progressDialog.show();
        progressDialog.setProgress(60);
    }
7.自定义View框
 private void bt7Click() {

        AlertDialog.Builder builder = new AlertDialog.Builder(this, R.style.LightDialog);
        builder.setTitle("自定义View Dialog");
        AlertDialog alertDialog = null;
        View view = LayoutInflater.from(this).inflate(R.layout.view_dialog, null);
        builder.setView(view);
        alertDialog = builder.show();
        final AlertDialog finalAlertDialog = alertDialog;
        view.findViewById(R.id.tv_determine)
                .setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        finalAlertDialog.dismiss();
                    }
                });
        view.findViewById(R.id.tv_cancel)
                .setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        finalAlertDialog.dismiss();
                    }
                });
    }
8.自定义Dialog

    private void bt8Click() {
        CustomizeDialog customizeDialog = new CustomizeDialog(this);
        customizeDialog.setOnButtonClickListener(new CustomizeDialog.OnButtonClickListener() {
            @Override
            public void onCancelClick(Dialog dialog) {
                dialog.dismiss();
                Toast.makeText(MainActivity.this, "取消", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onDetermineClick(Dialog dialog) {
                dialog.dismiss();
                Toast.makeText(MainActivity.this, "确定", Toast.LENGTH_SHORT).show();
            }
        });
        customizeDialog.show();
    }
9.封装DialogUtils

    private void bt9Click() {
        View view = LayoutInflater.from(this).inflate(R.layout.view_dialog, null);
        final Dialog dialog = new DialogUtils()
                .with(this, R.style.NoBackgroundDialog)
                .contentView(view)
                .gravity(Gravity.BOTTOM)
                .width((int) (getResources().getDisplayMetrics().widthPixels * 0.9))
                .show();
        TextView tvCancel = view.findViewById(R.id.tv_cancel);
        TextView tvDetermine = view.findViewById(R.id.tv_determine);
        tvCancel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dialog.dismiss();
            }
        });
        tvDetermine.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dialog.dismiss();
            }
        });
    }

DialogUtils:对于需要自定义View的Dialog,一些常用的操作可以简单封装起来


import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.support.annotation.LayoutRes;
import android.view.View;


public class DialogUtils {

    private Params p;

    public DialogUtils() {
        p = new Params();
    }

    public DialogUtils with(Activity context, int theme) {
        p.context = context;
        p.mTheme = theme;
        return this;
    }

    public DialogUtils contentView(@LayoutRes int layoutResId) {
        p.mLayoutResId = layoutResId;
        return this;
    }

    public DialogUtils contentView(View view) {
        p.mContentView = view;
        return this;
    }

    public DialogUtils gravity(int gravity) {
        p.mGravity = gravity;
        return this;
    }

    public DialogUtils width(int widthPixels) {
        p.mWidth = widthPixels;
        return this;
    }

    public DialogUtils cancelable(boolean cancelable) {
        p.mCancelable = cancelable;
        return this;
    }

    public DialogUtils canceledOnTouchOutside(boolean canceledOnTouchOutside) {
        p.mCanceledOnTouchOutside = canceledOnTouchOutside;
        return this;
    }

    public Dialog create() {
        return apply(p);
    }

    public Dialog show() {
        Dialog dialog = this.create();
        dialog.show();
        return dialog;
    }

    private Dialog apply(Params p) {
        Dialog dialog = new Dialog(p.context, p.mTheme);
        if (p.mLayoutResId == 0 && p.mContentView != null) {
            dialog.setContentView(p.mContentView);
        }
        if (p.mLayoutResId != 0 && p.mContentView == null) {
            dialog.setContentView(p.mLayoutResId);
        }
        if (p.mLayoutResId != 0 && p.mContentView != null) {
            dialog.setContentView(p.mContentView);
        }
        if (p.mWidth != -1) {
            dialog.getWindow().getAttributes().width = p.mWidth;
        }
        if (p.mGravity != -1) {
            dialog.getWindow().getAttributes().gravity = p.mGravity;
        }
        dialog.setCancelable(p.mCancelable);
        dialog.setCanceledOnTouchOutside(p.mCanceledOnTouchOutside);
      
        return dialog;
    }

    public class Params {
        Context context;
        int mTheme;
        int mLayoutResId;
        View mContentView;//优先使用contentView
        int mGravity = -1;
        int mWidth = -1;
        boolean mCancelable = true;
        boolean mCanceledOnTouchOutside = true;
    }
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容