本文主要是定义直款顶端黑色背景的自定义Dialog,之前在用的时候发现PopupWindow需要依赖于Activity的创建,需要在OnWindowFoucus之后才能展示,这样就导致一进界面就加载会报Activiy没有创建完的Exception,但是Dialog就不会有这个问题。
这个顶部自定义Dialog有左右两个按钮,可有动态设置按钮文字,以及监听,还可以设置自动关闭功能。
首先是自定义Dialog
private static class TipsDialog extends Dialog {
private String leftText;
private String title;
private String rightText;
private Button leftButton;
private Button rightButton;
private TextView titleTV;
private BoTaiTipsInterface lCall;
private BoTaiTipsInterface RCall;
private final int SHOW_TIME = 3000;
Handler handler;
public TipsDialog(Activity activity, String title, String left, String right, BoTaiTipsInterface leftInterface, BoTaiTipsInterface rightInterface, int cancelTime) {
super(activity, R.style.TipsDialogStyle); <span style="font-family: Arial, Helvetica, sans-serif;">// </span>这里一定要添加style,否则不会展示
this.leftText = left;
this.rightText = right;
this.lCall = leftInterface;
this.RCall = rightInterface;
this.title = title;
handler = new Handler(Looper.getMainLooper()) {//延时自动关闭功能
@Override
public void handleMessage(Message msg) {
dismissDialog();
}
};
if (cancelTime != 0) {
handler.sendEmptyMessageDelayed(1, cancelTime);
} else {
handler.sendEmptyMessageDelayed(1, SHOW_TIME);
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
try {
View mBannerView = LayoutInflater.from(getContext()).inflate(R.layout.dialog_banner, null);
setCancelable(false);
leftButton = (Button) mBannerView.findViewById(R.id.left_button);
rightButton = (Button) mBannerView.findViewById(R.id.right_button);
titleTV = (TextView) mBannerView.findViewById(R.id.title);
if (StringUtils.isEmpty(title)) {
titleTV.setVisibility(View.INVISIBLE);
} else {
titleTV.setText(title);
}
if (StringUtils.isEmpty(leftText)) {
leftButton.setVisibility(View.INVISIBLE);
} else {
leftButton.setText(leftText);
if (null != lCall) {
lCall.onKey();
}
}
if (StringUtils.isEmpty(rightText)) {
rightButton.setVisibility(View.INVISIBLE);
} else {
rightButton.setText(rightText);
if (null != RCall) {
RCall.onKey();
}
}
setContentView(mBannerView);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void dismiss() {
try {
handler.removeMessages(1);
super.dismiss();
} catch (Exception e) {
}
}
}
Handler通过发送延迟消息达到定时关闭的功能。
Style:
<style name="TipsDialogStyle" >
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowFrame">@null</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowIsFloating">true</item>
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowAnimationStyle">@style/TipsDialogAnimStyle</item>
</style>
<style name="TipsDialogAnimStyle">
<item name="android:windowEnterAnimation">@anim/tips_dialog_alpha_in</item>
<item name="android:windowExitAnimation">@anim/tips_dialog_alpha_out</item>
</style>
展示自定义Dialog控制类
private static TipsDialog mDialog;
public static void showNoButtonDialog(Activity activity, String title, int time) {
showDialog(activity, title, null, null, null, null, time);
}
/**
* @param activity
* @param title
* @param left
* @param right
* @param leftInterface
* @param rightInterface
*/
public static void showDialog(Activity activity, String title, String left, String right, BoTaiTipsInterface leftInterface, BoTaiTipsInterface rightInterface, int showTime) {
try {
if (activity == null) {
return;
}
if (mDialog != null && mDialog.isShowing()) {
mDialog.dismiss();
}
mDialog = new TipsDialog(activity, title, left, right, leftInterface, rightInterface, showTime);
mDialog.show();
Window dialogWindow = mDialog.getWindow();
WindowManager.LayoutParams lp = dialogWindow.getAttributes();
WindowManager m = activity.getWindowManager();
Display d = m.getDefaultDisplay(); // 获取屏幕宽、高用
lp.dimAmount = 0;//背景不变暗
lp.width = (int) (d.getWidth());//宽度撑满屏幕
mDialog.setCanceledOnTouchOutside(true);
dialogWindow.setGravity(Gravity.LEFT | Gravity.TOP);//展示位置
dialogWindow.setAttributes(lp);
} catch (Exception e) {
e.printStackTrace();
}
}
/***
* 取消dialog显示
*/
public static void dismissDialog() {
try {
if (mDialog != null && mDialog.isShowing()) {
mDialog.dismiss();
}
} catch (Exception e) {
e.printStackTrace();
}
}
lp.dimAmount = 0;这个参数和<span style="color: rgb(68, 68, 68); font-family: simsun; font-size: 14px; line-height: 21px; background-color: rgb(243, 248, 251);"> </span><wbr style="color: rgb(68, 68, 68); font-family: simsun; font-size: 14px; line-height: 21px; background-color: rgb(243, 248, 251);"><span style="color: rgb(68, 68, 68); font-family: simsun; font-size: 14px; line-height: 21px; background-color: rgb(243, 248, 251);"><item name="android:backgroundDimEnabled">false</item>按说是一样的,不过自定义的好像不太好用,所以还是使用lp.dimamount=0;这个动态方法进行设置</span></wbr>