android设计模式——建造者模式

先看下AlertDialog,这个比较简单,都是android系统自定义的,布局文件就一个按钮,我就不贴代码了;

package com.example.builder;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity {
    private Button bt_click;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        bt_click = (Button) findViewById(R.id.bt_click);
        MyOnClick moc = new MyOnClick();
        bt_click.setOnClickListener(moc);
    }

    private class MyOnClick implements OnClickListener {

        @Override
        public void onClick(View v) {
            // 首先创造一个创建者出来,而不是直接new dialaog,
            AlertDialog.Builder builder = new AlertDialog.Builder(
                    MainActivity.this);
            // 每个set#()方法都返回当前Builder对象
            builder.setMessage("过年好")
                    .setIcon(R.drawable.ic_launcher)
                    .setTitle("年")
                    .setPositiveButton("过年好",
                            new DialogInterface.OnClickListener() {

                                @Override
                                public void onClick(DialogInterface dialog,
                                        int which) {
                                    Toast.makeText(MainActivity.this, "过年好",
                                            3000).show();
                                }
                            })
                    .setNegativeButton("不好",
                            new DialogInterface.OnClickListener() {

                                @Override
                                public void onClick(DialogInterface dialog,
                                        int which) {
                                    Toast.makeText(MainActivity.this, "不好",
                                            3000).show();
                                }
                            })
                    .setNeutralButton("不知道",
                            new DialogInterface.OnClickListener() {

                                @Override
                                public void onClick(DialogInterface dialog,
                                        int which) {
                                    Toast.makeText(MainActivity.this, "不知道",
                                            3000).show();
                                }
                            });
            // 使用builder创建对话框
            AlertDialog alertDdialog = builder.create();
            // 显示对话框
            alertDdialog.show();
        }

    }
}

建造者模式有一个优点,就是你想要什么样的对话框不需要自己去创建,告诉建造者就可以了,建造者会按照你的要求创建,如本例你完全可以告诉创建者你只要两个按钮而不要三个按钮,建造者也会按照你的要求创建对话框。

下面我们分析下系统的AlertDialog。

builder:建造者
AlertController:制造产品的机器,可以定制很多的产品,不同的设置,机器建造的产品也不同
AlertParams:制造产品的机器的参数,不同的参数,通过机器建造出的产品也不同,拥有可供选择的多个参数,如,title,message,button等。
客户告诉建造者自己想要的产品,建造者根据根据相应的要求设置相应的参数,创建出客户想要的产品,至于客户,他们根本不需要关心建造者是如何建造的。

 public Builder setTitle(CharSequence title) {
            P.mTitle = title;
            return this;

这里setTitle实际上是为p复制,p就是机器的参数

 public static class Builder {
        private final AlertController.AlertParams P;
        private int mTheme;

再看看builder.create()的方法,

   public AlertDialog create() {
            final AlertDialog dialog = new AlertDialog(P.mContext, mTheme, false);

各种参数设置完毕后,建造者就开始create产品了,我们再看下该构造方法的源码

这里写图片描述

源码分析完了,下面我们自己写一个自己的dialog
main_xml文件只有一个按钮我就不贴上来了;
看MainActivity代码

package com.example.builder;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity {
    private Button bt_click;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        bt_click = (Button) findViewById(R.id.bt_click);
        MyOnClick moc = new MyOnClick();
        bt_click.setOnClickListener(moc);
    }

    private class MyOnClick implements OnClickListener {

        @Override
        public void onClick(View v) {
            MyDialog.Builder builder=new MyDialog.Builder(MainActivity.this);
            builder.setTitle("过年了");
            builder.setMessage("你喜欢过年吗?");
            builder.setOnConfirmListener(new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Toast.makeText(MainActivity.this, "喜欢", 3000).show();
                }
            });
            builder.setOnOtherOneListener(new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Toast.makeText(MainActivity.this, "关你屁事", 3000).show();
                }
            });
            MyDialog dialog =builder.create();
            dialog.show();
        }

    }
}

MyDialog的源码

package com.example.builder;

import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MyDialog extends Dialog {
    public MyDialog(Context context, boolean cancelable,
            OnCancelListener cancelListener) {
        super(context, cancelable, cancelListener);
    }

    public MyDialog(Context context, int theme) {
        super(context, theme);
    }

    public MyDialog(Context context) {
        super(context);
    }

    // 定义一台机器
    public static class MyController {
        // 机器的功能配置,机器的属性
        public MyParams params;

        public static class MyParams {
            public Context context;
            // 标题
            public String title;
            // 信息
            public String message;
            // 按钮监听,注意不是按钮,按钮由布局文件my_dialog确定
            public DialogInterface.OnClickListener onConfirmListener;
            public DialogInterface.OnClickListener onCancelListener;
            public DialogInterface.OnClickListener onOtherOneListener;
            public DialogInterface.OnClickListener onOtherTwoListener;

        }
    }

    // 建造者
    public static class Builder {
        // 机器,不使用系统架构
        public Context context;
        public final MyController.MyParams params;// 在构造方法中赋值

        public Builder(Context context) {
            params = new MyController.MyParams();
            params.context = context;
        }

        public Builder setTitle(String title) {
            params.title = title;
            return this;// 返回当前的builder对象
        }

        public Builder setMessage(String message) {
            params.message = message;
            return this;// 返回当前的builder对象
        }

        public Builder setOnCancelListener(
                DialogInterface.OnClickListener OnCancelListener) {
            params.onCancelListener = OnCancelListener;
            return this;
        }

        public Builder setOnConfirmListener(
                DialogInterface.OnClickListener onConfirmListener) {
            params.onConfirmListener = onConfirmListener;
            return this;
        }

        public Builder setOnOtherOneListener(
                DialogInterface.OnClickListener onOtherOneListener) {
            params.onOtherOneListener = onOtherOneListener;
            return this;
        }

        public Builder setOnOtherTwoListener(
                DialogInterface.OnClickListener onOtherTwoListener) {
            params.onOtherTwoListener = onOtherTwoListener;
            return this;
        }

        public MyDialog create() {
            final MyDialog dialog = new MyDialog(params.context);
            // 在这里加载布局,确定dialog布局,系统是在new机器的时候加载布局的
            View view = LayoutInflater.from(params.context).inflate(
                    R.layout.my_dialog, null);
        //消除对话框中那条可恶的横线及其以上的部分
            dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
            //将布局放到dialog上
            dialog.setContentView(view);
            if (!TextUtils.isEmpty(params.title)) {// Returns true if the string
                                                    // is null or 0-length.
                TextView tv_title = (TextView) view.findViewById(R.id.tv_title);
                tv_title.setText(params.title);
            }
            if (!TextUtils.isEmpty(params.message)) {// Returns true if the
                                                        // string is null or
                                                        // 0-length.
                TextView tv_message = (TextView) view
                        .findViewById(R.id.tv_message);
                tv_message.setText(params.message);
            }
            Button bt_confirm = (Button) view.findViewById(R.id.bt_confirm);
            if (params.onConfirmListener != null) {// 表示用户设置了监听
                bt_confirm.setVisibility(View.VISIBLE);
                // 为按钮设置监听
                bt_confirm.setOnClickListener(new View.OnClickListener() {

                    @Override
                    public void onClick(View v) {
                        // dialog要求是常量,dialog: The dialog that received the
                        // click.
                        params.onConfirmListener.onClick(dialog, 0);
                    }
                });
            } else {
                bt_confirm.setVisibility(View.GONE);//
            }
            Button bt_cancel = (Button) view.findViewById(R.id.bt_cancel);
            if (params.onCancelListener != null) {// 表示用户设置了监听
                bt_cancel.setVisibility(View.VISIBLE);
                // 为按钮设置监听
                bt_cancel.setOnClickListener(new View.OnClickListener() {

                    @Override
                    public void onClick(View v) {
                        // dialog要求是常量,dialog: The dialog that received the
                        // click.
                        params.onCancelListener.onClick(dialog, 0);
                    }
                });
            } else {
                bt_cancel.setVisibility(View.GONE);//
            }
            Button bt_other_one = (Button) view.findViewById(R.id.bt_other_one);
            if (params.onOtherOneListener != null) {// 表示用户设置了监听
                bt_other_one.setVisibility(View.VISIBLE);
                // 为按钮设置监听
                bt_other_one.setOnClickListener(new View.OnClickListener() {

                    @Override
                    public void onClick(View v) {
                        // dialog要求是常量,dialog: The dialog that received the
                        // click.
                        params.onOtherOneListener.onClick(dialog, 0);
                    }
                });
            } else {
                bt_other_one.setVisibility(View.GONE);//
            }
            Button bt_other_two = (Button) view.findViewById(R.id.bt_other_two);
            if (params.onOtherTwoListener != null) {// 表示用户设置了监听
                bt_other_two.setVisibility(View.VISIBLE);
                // 为按钮设置监听
                bt_other_two.setOnClickListener(new View.OnClickListener() {

                    @Override
                    public void onClick(View v) {
                        // dialog要求是常量,dialog: The dialog that received the
                        // click.
                        params.onOtherTwoListener.onClick(dialog, 0);
                    }
                });
            } else {
                bt_other_two.setVisibility(View.GONE);//
            }
            return dialog;
        }

    }
}

my_dialog.xml文件的布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <!-- 可以随心所欲的设置样式 -->

    <TextView
        android:id="@+id/tv_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="你想穿越吗?" />

    <TextView
        android:id="@+id/tv_message"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="你敢穿越到清朝末年吗?  " />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <Button
            android:id="@+id/bt_confirm"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:padding="3dp"
            android:text="确定"
            android:textColor="@android:color/holo_blue_bright" />

        <Button
            android:id="@+id/bt_cancel"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:padding="3dp" 
            android:text="取消"
            android:textColor="@android:color/holo_blue_bright" />

        <Button
            android:id="@+id/bt_other_one"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:padding="3dp" 
            android:text="其他一"
            android:textColor="@android:color/holo_blue_bright" />

        <Button
            android:id="@+id/bt_other_two"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:padding="3dp"
            android:text="其他二"
            android:textColor="@android:color/holo_blue_bright"  />
    </LinearLayout>

</LinearLayout>

看下这张效果图
这里写图片描述

但是大家有没有发现那个横线很恶心,哎,我想了好久才找到消除他的方法,在代码里面了大家看看吧。

如果想点击弹出的对话框按钮后消失,可以做如下修改,加入dismiss()方法
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值