前段时间出差去了,博文一直也没有更新,现在回来了特此补上.学无止境,仅此而已.
有图好说话.
点击 <是的> 之后,弹出的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的布局文件,比较简单,这里就不再贴出来了.需要关注的一点就是:
<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