美文网首页
自定义的Dialog

自定义的Dialog

作者: mt大山 | 来源:发表于2018-11-05 15:02 被阅读0次

开发中经常要用到自定义的Dialog ,所以封装一个方便以后使用。
先创建一个类 DialogUtils
生成构造方法

public class DialogUtils {

    private Context context;
    private DialogInterface dialogInterface;

    public DialogUtils(Context context, DialogInterface dialogInterface) {
        this.context = context;
        this.dialogInterface = dialogInterface;
    }
}

创建带一个按钮的Dialog

    /***
     *
     * @param msg 内容信息
     * @param btnMsg  确定按钮的文字提示
     * @param layoutID  布局
     * @param valueId  显示内容的Id
     * @param btnId    按钮的Id
     * @param canceledOnTouchOutside 点击外部是否取消
     */
   public void showOneBtnDialog(String msg,String btnMsg ,int layoutID, int valueId, int btnId,boolean canceledOnTouchOutside) {
      final Dialog dialog = new Dialog(context);
        dialog.setCanceledOnTouchOutside(canceledOnTouchOutside);
        View view = LayoutInflater.from(context).inflate(layoutID, null, false);
        TextView valueTv = view.findViewById(valueId);
        Button button = view.findViewById(btnId);
        button.setText(btnMsg);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                dialog.dismiss();
                dialogInterface.onOkBtnClick(view);
            }
        });
        valueTv.setText(msg);
        dialog.setView(view);
        dialog.show();
    }

创建带两个按钮的dialog

   /***
     *
     * @param msg 内容信息
     * @param btnMsg  确定按钮的文字提示
     * @param layoutID  布局
     * @param valueId  显示内容的Id
     * @param btnOkId 确定按钮的Id
     * @param btnCancleId  取消按钮的Id
     * @param canceledOnTouchOutside 点击外部是否取消
     */
    public void showTwoBtnDialog(String msg,String btnMsg ,int layoutID, int valueId, int btnOkId,int btnCancleId, boolean canceledOnTouchOutside) {
       final Dialog dialog = new Dialog(context);
        dialog.setCanceledOnTouchOutside(canceledOnTouchOutside);
        View view = LayoutInflater.from(context).inflate(layoutID, null, false);
        TextView valueTv = view.findViewById(valueId);
        Button button = view.findViewById(btnOkId);
        Button button1 = view.findViewById(btnCancleId);
        button.setText(btnMsg);
        valueTv.setText(msg);
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                dialog.dismiss();
                dialogInterface.onCancleBtnClick(view);
            }
        });
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                dialog.dismiss();
                dialogInterface.onOkBtnClick(view);
            }
        });
        dialog.setView(view);
        dialog.show();
    }

按钮点击事件的回调方法

public interface DialogInterface {
    void onOkBtnClick(View view);
    void onCancleBtnClick(View view);
}

在Activity里的应用
首先实现DialogInterface接口
重写下面两个方法



  @Override
    public void onOkBtnClick(View view) {
        switch (view.getId()){
            case R.id.OkBtn:
                Toast.makeText(this, "一个按钮点击了确定", Toast.LENGTH_SHORT).show();
                break;
            case R.id.two_OkBtn:
                Toast.makeText(this, "2个按钮点击了确定", Toast.LENGTH_SHORT).show();
                break;
        }
    }

    @Override
    public void onCancleBtnClick(View view) {
        Toast.makeText(this, "点击了取消", Toast.LENGTH_SHORT).show();
    }

然后在想用的地方调用

  final DialogUtils utils = new DialogUtils(this, this);
        findViewById(R.id.oneBtn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                utils.showOneBtnDialog("这是一个按钮的dialog", "确定", R.layout.one_dialog, R.id.value_tv, R.id.OkBtn, false);
            }
        });
        findViewById(R.id.twoBtn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                utils.showTwoBtnDialog("这是两个按钮的dialog", "确定", R.layout.two_dialog, R.id.value_tv, R.id.two_OkBtn, R.id.cancleBtn, true);
            }
        });

如果要改变Dialog宽高按照如下设置

 Window window = dialog.getWindow();
        int screenWidth = context.getResources().getDisplayMetrics().widthPixels;
        WindowManager.LayoutParams lp = window.getAttributes();
        lp.width = (int) (screenWidth*0.6);
        window.setAttributes(lp);

如果需要设置圆角和动画等其他的设置

  <style name="ActionSheetDialogStyle" parent="@android:style/Theme.Dialog">
        <!-- 背景透明 -->
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:windowContentOverlay">@null</item>
        <!-- 浮于Activity之上 -->
        <item name="android:windowIsFloating">true</item>
        <!-- 边框 -->
        <item name="android:windowFrame">@null</item>
        <!-- Dialog以外的区域模糊效果 -->
        <item name="android:backgroundDimEnabled">true</item>
        <!-- 无标题 -->
        <item name="android:windowNoTitle">true</item>
        <!-- 半透明 -->
        <item name="android:windowIsTranslucent">true</item>
        <!-- Dialog进入及退出动画 -->
        <item name="android:windowAnimationStyle">@style/ActionSheetDialogAnimation</item>
    </style>
    <style name="ActionSheetDialogAnimation" parent="@android:style/Animation.Dialog">
        <item name="android:windowEnterAnimation">@anim/show_dialog</item>
        <item name="android:windowExitAnimation">@anim/out_diaolg</item>
    </style>

设置圆角

<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <corners android:radius="15dp"></corners>
    <solid android:color="#ffffff"></solid>
</shape>

设置完代码如下

 /***
     *
     * @param msg 内容信息
     * @param btnMsg  确定按钮的文字提示
     * @param layoutID  布局
     * @param valueId  显示内容的Id
     * @param btnId    按钮的Id
     * @param canceledOnTouchOutside 点击外部是否取消
     */
    public void showOneBtnDialog(String msg,String btnMsg ,int layoutID, int valueId, int btnId,boolean canceledOnTouchOutside) {
        final Dialog dialog = new Dialog(context,R.style.ActionSheetDialogStyle);
        dialog.setCanceledOnTouchOutside(canceledOnTouchOutside);
        View view = LayoutInflater.from(context).inflate(layoutID, null, false);
        TextView valueTv = view.findViewById(valueId);
        Button okBtn = view.findViewById(btnId);
        okBtn.setText(btnMsg);
        okBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                dialog.dismiss();
                dialogInterface.onOkBtnClick(view);
            }
        });
        valueTv.setText(msg);
        dialog.setContentView(view);
        dialog.show();
        Window window = dialog.getWindow();
        int screenWidth = context.getResources().getDisplayMetrics().widthPixels;
        WindowManager.LayoutParams lp = window.getAttributes();
        lp.width = (int) (screenWidth*0.6);
        window.setAttributes(lp);
    }

相关文章

  • Dialog

    安卓dialog的使用+如何自定义dialog自定义Dialog自定义Dialog 自定义

  • 自定义Dialog

    自定义Dialog的主题 自定义Dialog的布局文件 继承Dialog 并在onCreate方法中将布局设置给D...

  • 【Android】自定义全屏dialog

    一、在themes.xml中添加自定义dialog的样式 二、创建dialog基类 三、创建自定义dialog的布...

  • Android自定义Dialog及其点击事件

    在项目开发中,经常要用到dialog。但是系统的dialog太丑,所有我们要自定义dialog。下面的先介绍自定义...

  • 实现图片Dialog中带ViewPager

    效果图 实现思路 自定义Dialog,为Dialog添加自定义布局,自定义PagerAdapter以及PageTr...

  • 一个漂亮的自定义Dialog

    这是一个自定义的dialog项目 自定义的dialog,具有如下特点 圆角的dialog View 圆形图片的ti...

  • Android圆角对话框Dialog

    需求:模仿iOS样式Dialog对话框。 自定义Dialog 核心代码: Dialog样式: Dialog布局文件...

  • Dialog

    dialog效果的实现由两种,一种是activity采用dialog风格,另一种是自定义的dialog,其中自定义...

  • 自定义Dialog

    仿IOS自定义的Dialog: 1、Util帮助类创建dialog 2、布局文件 :loading_dialog....

  • Flutter Dialog 动画

    本文对 Dialog 做一次系统性学习记录,包括系统 Dialog,自定义 Dialog,Dialog 动画。 A...

网友评论

      本文标题:自定义的Dialog

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