本文主要是定義直款頂端黑色背景的自定義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>