自定义的Dialog

2018-11-05  本文已影响0人  mt大山

开发中经常要用到自定义的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);
    }
上一篇 下一篇

猜你喜欢

热点阅读