最近一直在做 java 相关的东西, 虽然一直在看 Android 但感觉有点留于理论,总这样毕竟不行,写的多不一定懂得多,但要想懂得多就一
定要写的多,于是今天动手写了一下 Dialog 有关的东西,算是对 Dialog 的一个整理吧。

AlertDialog 的使用就不说了,随便百度一下就能找到,这里要说的,主要就是自定义的 Dialog。

然后还是先上代码吧:
public class CustomDialog extends AlertDialog {
 protected CustomDialog(Context context) {
 super(context);
 } protected CustomDialog(Context context, boolean cancelable, OnCancelListener cancelListener) {
 super(context, cancelable, cancelListener);
 } protected CustomDialog(Context context, @StyleRes int themeResId) {
 super(context, themeResId);
 } public static class Builder {
 private Context mContext;
 private CustomDialog dialog;
 private View layout;
 private int mIcon = -1;
 private String mText;
 private String mContent;
 private String mPoiBtn;
 private View.OnClickListener mPoiListener;
 private String mNegBtn;
 private View.OnClickListener mNegListener;
 private int animateType = -1;
 public static final int LOW_DISAPPEAR_ANIMATION = 1;
 public static final int ROTATE_DISAPPEAR_ANIMATION = 2; public Builder(Context context) {
 mContext = context;
 dialog = new CustomDialog(context, R.style.Theme_AppCompat_Dialog_Alert);
 layout = View.inflate(mContext, R.layout.custom_dialog1, null); }
 public Builder setTitleIcon(int iconRes) {
 mIcon = iconRes;
 return this;
 } public Builder setTitle(CharSequence text) {
 mText = (String) text;
 return this;
 } public Builder setContent(CharSequence text) {
 mContent = (String) text;
 return this;
 } public Builder setPositiveButton(CharSequence text, @NonNull View.OnClickListener
 clickListener) {
 mPoiBtn = (String) text;
 mPoiListener = clickListener;
 return this;
 } public Builder setNegativeButton(CharSequence text, @NonNull View.OnClickListener
 clickListener) {
 mNegBtn = (String) text;
 mNegListener = clickListener;
 return this;
 } public Builder create() {
 ImageView titleIcon = (ImageView) layout.findViewById(R.id.title_icon);
 TextView contentView = (TextView) layout.findViewById(R.id.custom_content);
 TextView titleView = (TextView) layout.findViewById(R.id.title);
 TextView poiBtn = (TextView) layout.findViewById(R.id.custom_confirm);
 TextView negBtn = (TextView) layout.findViewById(R.id.custom_cancel);
 poiBtn.setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(View v) {
 dialog.dismiss();
 }
 });
 if (mIcon != -1) {
 titleIcon.setImageBitmap(BitmapFactory.decodeResource(mContext.getResources(),
 mIcon));
 } if (!TextUtils.isEmpty(mText)) {
 titleView.setText(mText);
 } if (!TextUtils.isEmpty(mContent)) {
 contentView.setText(mContent);
 } if (!TextUtils.isEmpty(mPoiBtn)) {
 poiBtn.setText(mPoiBtn);
 poiBtn.setOnClickListener(mPoiListener);
 } else {
 poiBtn.setVisibility(View.GONE);
 } if (!TextUtils.isEmpty(mNegBtn)) {
 negBtn.setText(mNegBtn);
 negBtn.setOnClickListener(mNegListener);
 } else {
 negBtn.setVisibility(View.GONE);
 } dialog.setCancelable(true);
 dialog.setCanceledOnTouchOutside(true);
 return this;
 }
 int i = 0;
 public CustomDialog show(){
 Window mWin = dialog.getWindow();
 dialog.show();
 dialog.setContentView(layout, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ActionBar.LayoutParams.WRAP_CONTENT));
 switch (animateType){
 case LOW_DISAPPEAR_ANIMATION:
 mWin.setWindowAnimations(R.style.dialog_Low_appear_animation);
 break;
 case ROTATE_DISAPPEAR_ANIMATION:
 mWin.setWindowAnimations(R.style.dialog_rotate_appear_animation);
 break;
 } return dialog;
 } public Builder setDisappearAnimator(int animateType){
 this.animateType = animateType;
 return this;
 } }
}代码算不上多,做个分类的话,主要是有 3 部分: Builder 的构建,内容的设置,Dilalog的显示
首先说一下 Builder 的构建, 构建方法主要完成了 2 个功能, CustomDialog 的实例化 和 布局的填充,这里需要注意的有一点,不要急着吧
填充的布局添加到 dialog 实例中去, 在 dialog 的 show 方法之前调用 setContentView 或是 addContentView ,这样都会导致报错 RequestFeature must be called before adding content;内容设置的代码,主要就是采用了一种链式的设计方法,每个方法都可以返回 Builder 类本身, 这样就可以一条直线的调用方法了,这样写起来 比较简洁;
最后,就是 dialog 的显示了, 记住在 show 之后调用 setContentView 或是 addContentView 就可以了, 置于 setCancelable() 和 setCancelableOnTouchOutside() 这个是对 dialog 消失时的设置,主要就两个 boolean 值,可以自己看一下;
下面是 R.layout.custom_dialog1 的布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:background="@drawable/shape_custom_bg_grey">
 <LinearLayout
 android:layout_width="match_parent"
 android:layout_height="40dp"
 android:gravity="center">
 <ImageView
 android:id="@+id/title_icon"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 />
 <TextView
 android:id="@+id/title"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:text="这里放置默认的标题"
 android:textSize="20sp"/>
 </LinearLayout>
 <TextView
 android:id="@+id/custom_content"
 android:layout_width="match_parent"
 android:layout_height="120dp"
 android:padding="10dp"
 android:text="这里可以放置正文内容"
 android:textAlignment="center"
 android:textSize="16sp"/>
 <LinearLayout
 android:layout_width="match_parent"
 android:layout_height="40dp">
 <TextView
 android:id="@+id/custom_cancel"
 android:layout_width="0dp"
 android:layout_height="match_parent"
 android:layout_weight="1"
 android:text="取消"
 android:textSize="18sp"
 android:gravity="center"
 android:background="@color/cancelBtn"
 />
 <TextView
 android:id="@+id/custom_confirm"
 android:layout_width="0dp"
 android:layout_height="match_parent"
 android:layout_weight="1"
 android:text="确定"
 android:textSize="18sp"
 android:gravity="center"
 android:background="@color/confirmBtn"
 />
 </LinearLayout></LinearLayout>
最最后, 补充一下 Dialog 的入场动画和出场动画的定义方法
Dialog 主要是依附于一个 Window 对象来进行显示隐藏的,Window 对象的获取可以通过 dialog.getWindow 获得, 所以,dialog的出入场 动画其实就是 Window 的出入场动画,那么就简单了,通过 xml 来定义;
首先是 res/values/style.xml 文件
<style name="dialog_Low_appear_animation" parent="android:Animation">
 <item name="android:windowEnterAnimation">@anim/dialog_low_enter_animation</item>
 <item name="android:windowExitAnimation">@anim/dialog_low_exit_animation</item>
</style>然后,显然后是 res/anim 下新建 dialog_low_enter_animation 和 dialog_low_exit_animation 的 Resource 文件;
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
 <translate android:fromXDelta="0" android:toXDelta="0" android:fromYDelta="100%" android:toYDelta="0"
 android:duration="500"/>
 <alpha android:fromAlpha="0" android:toAlpha="1" android:duration="500"/></set>
入场和出场的参数自己看着怎么定义合适,也就不多说了。
附上使用方法

CustomDialog dialog = new CustomDialog.Builer().setTitle("").setContent("")
 .setPositiveButton("确定", new View.OnclickListerner(){
 @override
 public void onClick(View view){
 dialog.dismiss();
 }
 })
 .setNegativeButton("取消", new View.OnClickListener(){
 @override
 public void onClick(View view){
 dialog.dismiss();
 }
 })
 .setDisappearAnimation(CustomDialog.Builder.LOW_DISAPPEAR_ANIMATION)
 .creat().show();

写到这里,好吧,dialog 的用法基本就写完了,关于原理方面的东西现在还没有涉及,以后涉猎了再来接着补充。