打造Android通用的自定义AlertDialog提示框

前段时间出差去了,博文一直也没有更新,现在回来了特此补上.学无止境,仅此而已.

有图好说话.

这里写图片描述

点击”是的”之后,弹出的toast提示语,大家可以忽略(调试时写的).

通用性自定义AlertDialog的通用性表现在:

1.普通AlertDialog的功能它都具备
2.根据new AlertDialog(…)时候,传入的参数是否为空(包括”null”和”“),此自定义的AlertDialog会自动改变弹出的提示框的样式.什么意思呢?
比如:我传入的AlertDialog的标题title为空(“”),那么弹出的样式如下:
这里写图片描述

比如,如果我传入的AlertDialog的positive按钮为空(“”),那么弹出的演示如下:
这里写图片描述
其他地方都无需修改.

直接跳出自定义AlertDialog的主要代码贴出:

/**
 * 通用对话框类
 */
public class AlertDialog extends Dialog implements android.view.View.OnClickListener {

    private Context context;
    private String title;
    private String message;
    private String strPositive;
    private String strNegative;
    private OnDialogButtonClickListener listener;
    private boolean cancelable = true;
    private TextView tvTitle;
    private TextView tvMessage;
    private TextView btnPositive;
    private TextView btnNegative;
    private View viewDeliver;


    /**
     * @param context
     * @param title
     * @param message
     * @param strPositive "确定"类按钮文本
     * @param strNegative "取消"类按钮文本
     * @param listener
     */
    public AlertDialog(Context context, String title, String message,
                       String strPositive, String strNegative, OnDialogButtonClickListener listener) {
        super(context, R.style.MyDialog);

        this.context = context;
        this.title = title;
        this.message = message;
        this.strPositive = strPositive;
        this.strNegative = strNegative;
        this.listener = listener;
    }


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.dialog_custom);

        //alertDialog是否可以点击外围消失
        setCanceledOnTouchOutside(cancelable);
        setCancelable(cancelable);

        tvTitle = findViewById(R.id.tv_dialog_title);
        tvMessage = findViewById(R.id.tvAlertDialogMessage);
        btnPositive = findViewById(R.id.tv_dialog_positive);
        btnNegative = findViewById(R.id.tv_dialog_negative);
        viewDeliver = findViewById(R.id.view_deliver);

        //如果title为空,则隐藏alertDialog标题
        tvTitle.setVisibility(StringUtil.isNotEmpty(title, true) ? View.VISIBLE : View.GONE);
        tvTitle.setText("" + StringUtil.getCurrentString());

        if (StringUtil.isNotEmpty(strPositive, true)) {
            btnPositive.setText(StringUtil.getCurrentString());
            btnPositive.setOnClickListener(this);
        } else {
            btnPositive.setVisibility(View.GONE);
            viewDeliver.setVisibility(View.GONE);
        }

        if (StringUtil.isNotEmpty(strNegative, true)) {
            btnNegative.setText(StringUtil.getCurrentString());
            btnNegative.setOnClickListener(this);
        } else {
            btnNegative.setVisibility(View.GONE);
            viewDeliver.setVisibility(View.GONE);
        }

        tvMessage.setText(StringUtil.getTrimedString(message));

        final WindowManager.LayoutParams params = this.getWindow().getAttributes();
        params.gravity = Gravity.CENTER;
        this.getWindow().setAttributes(params);
    }

    @Override
    public void onClick(final View v) {
        if (v.getId() == R.id.tv_dialog_positive) {
            listener.onDialogButtonClick(true);
        } else if (v.getId() == R.id.tv_dialog_negative) {
            listener.onDialogButtonClick(false);
        }
        dismiss();
    }


    /**
     * 自定义Dialog监听器
     */
    public interface OnDialogButtonClickListener {

        /**
         * 点击按钮事件的回调方法
         *
         * @param isPositive
         */
        void onDialogButtonClick(boolean isPositive);
    }

}

代码很简单,可以直接拿走用,我也就不再废话,相信你能看懂.

下面是代码中需要用到的两块代码:

Step 1:

/**
 * 通用字符串(String)相关类,为null时返回""
 *
 * @author Lemon
 * @use StringUtil.xxxMethod(...);
 */
public class StringUtil {
    private static final String TAG = "StringUtil";

    public StringUtil() {
    }

    private static String currentString = "";

    /**
     * 获取刚传入处理后的string
     *
     * @return
     * @must 上个影响currentString的方法 和 这个方法都应该在同一线程中,否则返回值可能不对
     */
    public static String getCurrentString() {
        return currentString == null ? "" : currentString;
    }

    /**
     * 获取string,为null则返回""
     *
     * @param s
     * @return
     */
    public static String getString(String s) {
        return s == null ? "" : s;
    }

    /**
     * 获取去掉前后空格后的string,为null则返回""
     *
     * @param s
     * @return
     */
    public static String getTrimedString(String s) {
        return getString(s).trim();
    }

    /**
     * 判断字符是否非空
     *
     * @param s
     * @param trim 是否剔除前导空白字符和尾部空白字符
     * @return
     */
    public static boolean isNotEmpty(String s, boolean trim) {
        if (s == null) {
            return false;
        }
        if (trim) {
            //从当前 String 对象移除所有前导空白字符和尾部空白字符。
            s = s.trim();
        }
        if (s.length() <= 0) {
            return false;
        }
        currentString = s;
        return true;
    }

}

上述代码是个StringUtil工具类,只不过进行简单的封装了下,它的作用主要是:
在调用构造器

    /**
     * @param context
     * @param title
     * @param message
     * @param strPositive "确定"类按钮文本
     * @param strNegative "取消"类按钮文本
     * @param listener
     */
    public AlertDialog(Context context, String title, String message,
                       String strPositive, String strNegative, OnDialogButtonClickListener listener) {
        super(context, R.style.MyDialog);

        this.context = context;
        this.title = title;
        this.message = message;
        this.strPositive = strPositive;
        this.strNegative = strNegative;
        this.listener = listener;
    }

进行传参的时候,根据参数是否为空,来进行弹出样式的改变,比如隐藏相应的控件.这块也是实现通用性的重点.

Step 2:

<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>

    <style name="MyDialog">
        <!-- alertDialog窗口背景色 -->
        <item name="android:windowBackground">@android:color/transparent</item>
        <!--dialog是否有边框-->
        <item name="android:windowFrame">@null</item>
        <!--dialog是否有标题-->
        <item name="android:windowNoTitle">true</item>
        <!--是否浮现在activity之上-->
        <item name="android:windowIsFloating">true</item>
        <!--是否半透明-->
        <item name="android:windowIsTranslucent">true</item>
        <!--是否有遮盖(eg.Activity的闪屏页)-->
        <item name="android:windowContentOverlay">@null</item>
        <!--进出动画-->
        <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
        <!--背景是否模糊显示-->
        <item name="android:backgroundDimEnabled">true</item>
    </style>


    <style name="text" parent="wrap_wrap">
        <item name="android:gravity">center</item>
        <item name="android:textColor">@color/dialog_btn_cancel</item>
    </style>

    <style name="wrap_wrap">
        <item name="android:layout_width">wrap_content</item>
        <item name="android:layout_height">wrap_content</item>
    </style>


    <style name="text_middle" parent="text">
        <item name="android:textSize">15sp</item>
    </style>

    <style name="text_middle_black" parent="text_middle">
        <item name="android:textColor">@color/black</item>
    </style>
</resources>

上述代码主要是提供自定义Dialog时,必不可少R.style.MyDialog样式.

 super(context, R.style.MyDialog);

代码中关于其中的各个属性都做了注释,这里不在赘述.小伙伴也可以自行控制各个属性值,来看下效果.
至于自定义AlertDialog的布局文件,比较简单,这里就不再贴出来了.需要关注的一点就是:

扫描二维码关注公众号,回复: 2242437 查看本文章
  <TextView
            android:id="@+id/tvAlertDialogMessage"
            style="@style/text_middle"
            android:layout_gravity="center"
            android:text="内容"
            android:layout_margin="15dp"
            android:gravity="center|left" 

上述代码是主要用于设置弹框的内容,其中的

 android:gravity="center|left" 

可以使得当弹框中的内容有多行的时候,自动左对齐,避免了那种参差不齐的效果.

好了,至此完结.如果小伙伴有问题,请留言.愿前进的路上,你我共同进步!

另附上Demo下载链接:
https://download.csdn.net/download/zhangqunshuai/10537799

猜你喜欢

转载自blog.csdn.net/zhangqunshuai/article/details/81019504