Android通用弹出框Dialog工具类

应用开发中一般都会将Dialog做成统一风格,基本上包含Title、Message、Button(单/双)三部分,大多数情况下都是对这三部分的不同组合,比如Message+Button(单/双)、Title+Button(单/双)、Message,个人针对这个需求做了个通用的工具类PopupDialog,方便使用,这里共享给有需要的童鞋:

预览图:





PopupDialog.java:

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.res.Resources;
import android.graphics.Point;
import android.os.Build;
import android.os.Bundle;
import android.text.method.ScrollingMovementMethod;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Display;
import android.view.LayoutInflater;
import android.view.View;
import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;

import java.lang.reflect.Method;

/**
 * Created by weishj on 2018/1/11.
 */
public class PopupDialog extends AlertDialog {
	private static final String TAG = "PopupDialog";
	private View view;
	private Context context;
	private TextView title;
	private ImageView close;
	private TextView msg;
	private TextView confirm;
	private TextView cancel;
	private LinearLayout bottomLl;
	private RelativeLayout topRl;
	private View verticalLine;
	private int width;

	protected PopupDialog(Context context, boolean cancelable, boolean canceledOnTouchOutside) {
		super(context, R.style.Dialog_Common);
		this.context = context;
		double deviceWidth = getScreenWidth(this.context);
		width = (int) (deviceWidth * 0.7);
		setCancelable(cancelable);
		setCanceledOnTouchOutside(canceledOnTouchOutside);
		LayoutInflater inflater = LayoutInflater.from(this.context);
		view = inflater.inflate(R.layout.popup_dialog, null);
		initView();
	}

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(width, LinearLayout.LayoutParams
				.WRAP_CONTENT, 0);
		setContentView(view, params);
	}

	public void setDialogTitle(CharSequence title, boolean closeBtn) {
		if (title == null || "".equals(title)) {
			if (this.title != null) {
				this.title.setVisibility(View.GONE);
			}
		} else {
			if (this.title != null) {
				this.title.setText(title);
			}
		}
		if (closeBtn && this.close != null) {
			this.close.setVisibility(View.VISIBLE);
		}
	}

	public void setDialogMessage(CharSequence msg) {
		if (msg == null || "".equals(msg)) {
			if (this.msg != null) {
				this.msg.setVisibility(View.GONE);
			}
		} else {
			if (this.msg != null) {
				this.msg.setText(msg);
			}
		}
	}

	protected void setDialogButton(int whichButton, CharSequence text, final View.OnClickListener listener) {
		if (text == null || "".equals(text)) {
			switch (whichButton) {
				case DialogInterface.BUTTON_POSITIVE: {
					if (this.confirm != null) {
						this.confirm.setVisibility(View.GONE);
					}
					break;
				}
				case DialogInterface.BUTTON_NEGATIVE: {
					if (this.cancel != null) {
						this.cancel.setVisibility(View.GONE);
					}
					break;
				}
				default: {
					Log.e(TAG, "Button can not be found. whichButton=" + whichButton);
				}
			}
		} else {
			switch (whichButton) {
				case DialogInterface.BUTTON_POSITIVE: {
					if (this.confirm != null) {
						this.confirm.setText(text);
						this.confirm.setOnClickListener(new View.OnClickListener() {
							@Override
							public void onClick(View v) {
								if (listener != null) {
									listener.onClick(v);
								}
								dismiss();
							}
						});
					}
					break;
				}
				case DialogInterface.BUTTON_NEGATIVE: {
					if (this.cancel != null) {
						this.cancel.setText(text);
						this.cancel.setOnClickListener(new View.OnClickListener() {
							@Override
							public void onClick(View v) {
								if (listener != null) {
									listener.onClick(v);
								}
								dismiss();
							}
						});
					}
					break;
				}
				default: {
					Log.e(TAG, "Button can not be found. whichButton=" + whichButton);
				}
			}
		}
	}

	public void setDialogButton(String confirm, View.OnClickListener positiveClickListener, String cancel, View
			.OnClickListener negativeClickListener) {
		if ((confirm == null || "".equals(confirm)) && (cancel == null || "".equals(cancel))) {
			if (this.bottomLl != null) {
				this.bottomLl.setVisibility(View.GONE);
			}
		} else if ((confirm != null && !"".equals(confirm)) && (cancel != null && !"".equals(cancel))) {
			setDialogButton(DialogInterface.BUTTON_POSITIVE, confirm, positiveClickListener);
			setDialogButton(DialogInterface.BUTTON_NEGATIVE, cancel, negativeClickListener);
		} else {
			// Hide vertical line
			this.verticalLine.setVisibility(View.GONE);
			// Hide positive button
			setDialogButton(DialogInterface.BUTTON_POSITIVE, null, null);
			if (confirm == null || "".equals(confirm)) {
				setDialogButton(DialogInterface.BUTTON_NEGATIVE, cancel, negativeClickListener);
			} else {
				// confirm is not null and cancel is null
				setDialogButton(DialogInterface.BUTTON_NEGATIVE, confirm, positiveClickListener);
			}

		}
	}

	private void initView() {
		this.title = (TextView) view.findViewById(R.id.common_dialog_title_tv);
		this.close = (ImageView) view.findViewById(R.id.common_dialog_close_iv);
		this.msg = (TextView) view.findViewById(R.id.common_dialog_message_tv);
		// Set Scrollable
		this.msg.setMovementMethod(ScrollingMovementMethod.getInstance());
		this.confirm = (TextView) view.findViewById(R.id.common_dialog_confirm_tv);
		this.cancel = (TextView) view.findViewById(R.id.common_dialog_cancel_tv);
		this.bottomLl = (LinearLayout) view.findViewById(R.id.common_dialog_bottom_ll);
		this.topRl = (RelativeLayout) view.findViewById(R.id.common_dialog_top_rl);
		this.verticalLine = view.findViewById(R.id.common_dialog_vertical_line);

		if (this.close != null) {
			this.close.setOnClickListener(new View.OnClickListener() {
				@Override
				public void onClick(View v) {
					dismiss();
				}
			});
		}
	}

	/**
	 * Obtain a confirm dialog instance
	 *
	 * @param context                context
	 * @param title                  title of the dialog, pass null or "" if no title is needed
	 * @param message                message to show
	 * @param confirm                name of confirm button, pass null or "" if no confirm button is needed
	 * @param positiveClickListener  click listener of confirm button
	 * @param cancel                 name of cancel button, pass null or "" if no confirm button is needed
	 * @param negativeClickListener  click listener of cancel button
	 * @param cancelable             cancelable when press back
	 * @param canceledOnTouchOutside canceled on touch outside
	 * @param closeBtn               whether to show close button
	 *
	 * @return PopupDialog
	 */
	public static PopupDialog create(Context context, String title, String message, String confirm, View.OnClickListener
			positiveClickListener, String cancel, View.OnClickListener negativeClickListener, boolean cancelable,
									 boolean canceledOnTouchOutside, boolean closeBtn) {
		PopupDialog dialog = new PopupDialog(context, cancelable, canceledOnTouchOutside);
		dialog.setDialogTitle(title, closeBtn);
		dialog.setDialogMessage(message);
		dialog.setDialogButton(confirm, positiveClickListener, cancel, negativeClickListener);

		return dialog;
	}

	/**
	 * Obtain a confirm dialog instance
	 *
	 * @param context                context
	 * @param titleRes               resource id of the dialog's title, pass 0 if no title is needed
	 * @param messageRes             resource id of the dialog's message, pass 0 if no title is needed
	 * @param confirmRes             resource id of the dialog's confirm button, pass 0 if no title is needed
	 * @param positiveClickListener  click listener of confirm button
	 * @param cancelRes              resource id of the dialog's cancel button, pass 0 if no title is needed
	 * @param negativeClickListener  click listener of cancel button
	 * @param cancelable             cancelable when press back
	 * @param canceledOnTouchOutside canceled on touch outside
	 * @param closeBtn               whether to show close button
	 *
	 * @return PopupDialog
	 */
	public static PopupDialog create(Context context, int titleRes, int messageRes, int confirmRes, View.OnClickListener
			positiveClickListener, int cancelRes, View.OnClickListener negativeClickListener, boolean cancelable,
								  boolean canceledOnTouchOutside, boolean closeBtn) {
		return create(context, titleRes, messageRes, confirmRes, positiveClickListener, cancelRes, negativeClickListener,
				cancelable, canceledOnTouchOutside, closeBtn, null);
	}

	public static PopupDialog create(Context context, int titleRes, int messageRes, int confirmRes, View.OnClickListener
			positiveClickListener, int cancelRes, View.OnClickListener negativeClickListener, boolean cancelable,
								  boolean canceledOnTouchOutside, boolean closeBtn, OnDismissListener listener) {
		PopupDialog dialog = new PopupDialog(context, cancelable, canceledOnTouchOutside);
		if (listener != null) {
			dialog.setOnDismissListener(listener);
		}
		String title = null;
		try {
			title = titleRes > 0 ? context.getResources().getString(titleRes) : null;
		} catch (Resources.NotFoundException e) {
			Log.w(TAG, "Resource not found. resId=" + titleRes, e);
		}
		dialog.setDialogTitle(title, closeBtn);
		String msg = null;
		try {
			msg = messageRes > 0 ? context.getResources().getString(messageRes) : null;
		} catch (Resources.NotFoundException e) {
			Log.w(TAG, "Resource not found. resId=" + messageRes, e);
		}
		dialog.setDialogMessage(msg);
		String confirm = null;
		String cancel = null;
		try {
			confirm = confirmRes > 0 ? context.getResources().getString(confirmRes) : null;
			cancel = cancelRes > 0 ? context.getResources().getString(cancelRes) : null;
		} catch (Resources.NotFoundException e) {
			Log.w(TAG, "Resource not found.", e);
		}
		dialog.setDialogButton(confirm, positiveClickListener, cancel, negativeClickListener);
		
		return dialog;
	}

	public void setCancel(int cancelRes) {
		cancel.setText(context.getResources().getString(cancelRes));
	}

	private int getScreenWidth(Context context) {
		return getScreenSize(context)[0];
	}

	private int getScreenHeight(Context context) {
		return getScreenSize(context)[1];
	}

	private int[] getScreenSize(Context context) {
		WindowManager windowManager;
		try {
			windowManager = (WindowManager)context.getSystemService("window");
		} catch (Throwable var6) {
			Log.w(TAG, var6);
			windowManager = null;
		}

		if(windowManager == null) {
			return new int[]{0, 0};
		} else {
			Display display = windowManager.getDefaultDisplay();
			if(Build.VERSION.SDK_INT < 13) {
				DisplayMetrics t1 = new DisplayMetrics();
				display.getMetrics(t1);
				return new int[]{t1.widthPixels, t1.heightPixels};
			} else {
				try {
					Point t = new Point();
					Method method = display.getClass().getMethod("getRealSize", new Class[]{Point.class});
					method.setAccessible(true);
					method.invoke(display, new Object[]{t});
					return new int[]{t.x, t.y};
				} catch (Throwable var5) {
					Log.w(TAG, var5);
					return new int[]{0, 0};
				}
			}
		}
	}
}

styles.xml:

	<!-- popup dialog -->
	<style name="Dialog_Common" parent="@android:style/Theme.Dialog">
		<!-- 边框 -->
		<item name="android:windowFrame">@null</item>
		<!-- 是否浮现在activity之上 -->
		<item name="android:windowIsFloating">true</item>
		<!-- 半透明 -->
		<item name="android:windowIsTranslucent">false</item>
		<!-- 无标题 -->
		<item name="android:windowNoTitle">true</item>
		<item name="android:windowBackground">@android:color/transparent</item>
		<!-- 自己想要的背景 -->
		<item name="android:background">@android:color/transparent</item>
		<!-- 模糊 -->
		<item name="android:backgroundDimEnabled">true</item>
	</style>

popup_dialog.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
			  xmlns:tools="http://schemas.android.com/tools"
			  android:orientation="vertical"
			  android:layout_width="match_parent"
			  android:layout_height="wrap_content"
			  android:background="@drawable/popup_dialog_bg">
	<RelativeLayout
		android:id="@+id/common_dialog_top_rl"
		android:layout_width="match_parent"
		android:layout_height="wrap_content"
		android:paddingLeft="15dp"
		android:paddingRight="15dp"
		android:layout_marginBottom="24dp"
		android:gravity="center_vertical">
		<TextView
			android:id="@+id/common_dialog_title_tv"
			android:layout_width="match_parent"
			android:layout_height="wrap_content"
			android:gravity="center_horizontal"
			android:layout_marginTop="20dp"
			android:textSize="18dp"
			android:textColor="#555555"
			tools:text="标题"/>
		<ImageView
			android:id="@+id/common_dialog_close_iv"
			android:layout_width="20dp"
			android:layout_height="20dp"
			android:layout_marginTop="15dp"
			android:layout_alignParentRight="true"
			android:src="@drawable/ic_popup_dialog_close"
			android:visibility="gone"/>
	</RelativeLayout>
	<TextView
		android:id="@+id/common_dialog_message_tv"
		android:layout_width="match_parent"
		android:layout_height="wrap_content"
		android:gravity="center"
		android:layout_marginLeft="15dp"
		android:layout_marginRight="15dp"
		android:layout_marginBottom="17dp"
		android:maxLines="5"
		android:minHeight="25dp"
		android:textSize="14dp"
		android:textColor="#555555"
		tools:text="信息"/>
	<View
		android:layout_width="match_parent"
		android:layout_height="1dp"
		android:background="#F5F5F5"/>
	<LinearLayout
		android:id="@+id/common_dialog_bottom_ll"
		android:layout_width="match_parent"
		android:layout_height="50dp"
		android:orientation="horizontal">
		<TextView
			android:id="@+id/common_dialog_cancel_tv"
			android:layout_width="0dp"
			android:layout_height="match_parent"
			android:layout_weight="1"
			android:gravity="center"
			android:clickable="true"
			android:textColor="#0679FE"
			android:textSize="18dp"
			tools:text="取消"/>
		<View
			android:id="@+id/common_dialog_vertical_line"
			android:layout_width="1dp"
			android:layout_height="match_parent"
			android:background="#F5F5F5"/>
		<TextView
			android:id="@+id/common_dialog_confirm_tv"
			android:layout_width="0dp"
			android:layout_height="match_parent"
			android:layout_weight="1"
			android:gravity="center"
			android:clickable="true"
			android:textColor="#0679FE"
			android:textSize="18dp"
			tools:text="确定"/>
	</LinearLayout>
</LinearLayout>

popup_dialog_bg.xml:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
	<corners android:radius="8dp"/>
	<solid android:color="#FFFFFF"/>
	<stroke
		android:width="1px"
		android:color="#2E000000"/>
</shape>

ic_popup_dialog_close.png:


使用方法:

PopupDialog.create(...).show();
点击按钮时会自动关闭dialog

猜你喜欢

转载自blog.csdn.net/lovelease/article/details/79568731