目的:實(shí)現(xiàn)一個(gè)自定義dialog,用于退出,從底部滑入和滑出
要解決的問(wèn)題:
1.dialog的位置要修改到底部;
2.dialog有默認(rèn)的padding,要去這些padding,讓dialog于屏幕同寬;(這個(gè)無(wú)法通過(guò)設(shè)置Gravity.width辦到)
3.dialog的滑入和滑出動(dòng)畫(huà);(style中有enter和exit Animation屬性)
解決方案:
示例:寫一個(gè)LogoutDialog繼承自Dialog類
關(guān)于問(wèn)題1和2:
Window window = this.getWindow();
//去掉dialog的title,要在setContentView()前
window.requestFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.layout_logout_confirm);
//去掉dialog默認(rèn)的padding
window.getDecorView().setPadding(0, 0, 0, 0);
WindowManager.LayoutParams lp = window.getAttributes();
lp.width = WindowManager.LayoutParams.MATCH_PARENT;
lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
//設(shè)置dialog的位置在底部
lp.gravity = Gravity.BOTTOM;
window.setAttributes(lp);
給dialog加入動(dòng)畫(huà)
給dialog設(shè)置一個(gè)style,在style中設(shè)置,也可以在代碼中寫(但是相對(duì)繁瑣)。
WindowManager.LayoutParams lp = window.getAttributes();
lp.windowAnimations = R.style.MyDialogAnimation;//設(shè)置Animation,style中做了設(shè)置,此處可不寫
style :
<style name="MyDialogStyle" parent="@android:style/Theme.Dialog">
<item name="android:windowAnimationStyle">@style/MyDialogAnimation</item>
</style>
<style name="MyDialogAnimation">
<item name="android:windowEnterAnimation">@anim/dialog_slide_up</item>
<item name="android:windowExitAnimation">@anim/dialog_slide_down</item>
</style>
anim :
dialog_slide_down:
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="300"
android:fromYDelta="0"
android:toYDelta="100%p"/>
</set>
dialog_slide_up:
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="300"
android:fromYDelta="100%p"
android:toYDelta="0"/>
</set>
完整代碼:
public class MyLogoutConfirmDialog extends Dialog implements View.OnClickListener {
@ViewInject(id = R.id.logout_dialog_exit, click = true)
RelativeLayout exitButton;
@ViewInject(id = R.id.logout_dialog_cancel, click = true)
RelativeLayout cancelButton;
MyDialogClickListener myDialogClickListener;
public MyLogoutConfirmDialog(Context context, MyDialogClickListener myDialogClickListener) {
super(context, R.style.MyDialogStyle);
this.myDialogClickListener = myDialogClickListener;
init();
}
private void init() {
Window window = this.getWindow();
window.requestFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.layout_logout_confirm);
ViewInjectUtils.initInjectedView(this, window.getDecorView());
window.getDecorView().setPadding(0, 0, 0, 0);
WindowManager.LayoutParams lp = window.getAttributes();
lp.windowAnimations = R.style.MyDialogAnimation;
lp.width = WindowManager.LayoutParams.MATCH_PARENT;
lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
lp.gravity = Gravity.BOTTOM;
window.setAttributes(lp);
show();
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.logout_dialog_exit:
dismiss();
myDialogClickListener.exit();
break;
case R.id.logout_dialog_cancel:
dismiss();
break;
}
}
public interface MyDialogClickListener {
void exit();
}
}
THE END