Builder模式在Android自定义底部对话框的实现

来源:互联网 发布:美国出口数据 编辑:程序博客网 时间:2024/05/16 07:35

一、什么事Builder模式

定义:
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

模式的使用场景:
相同的方法,不同的执行顺序,产生不同的事件结果时;
多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时;
产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能,这个时候使用建造者模式非常合适;


废话不多说,上代码先

1.构建对话框类

public class NewGhostDialog {    private Context context;    private Dialog dialog;    private GridView gridView;    private ArrayList<Icon> iconList = new ArrayList<>();    public NewGhostDialog(Context context) {        this.context = context;        WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);    }    /**     * 创建     * @return     */    public NewGhostDialog builder(){        initView();        setListener();        return this;    }    private void initView(){        View view = LayoutInflater.from(context).inflate(R.layout.dialog_ghost_new, null);        // 获取自定义Dialog布局中的控件        gridView = (GridView) view.findViewById(R.id.ghostGV);        // 定义Dialog布局和参数        dialog = new Dialog(context, R.style.GhostDialogStyle);        dialog.setContentView(view);        Window dialogWindow = dialog.getWindow();        dialogWindow.setGravity(Gravity.LEFT | Gravity.BOTTOM);        WindowManager.LayoutParams lp = dialogWindow.getAttributes();        lp.x = 0;        lp.y = 0;        lp.width = WindowManager.LayoutParams.MATCH_PARENT;//                lp.height = WindowManager.LayoutParams.WRAP_CONTENT;        dialogWindow.setAttributes(lp);        gridView.setAdapter(new GhostAdapter());    }    /**     *     * @param picRes 图标图片     * @param name 图标名字     * @param listener 点击监听     * @return     */    public NewGhostDialog addItem(int picRes, String name, NewGhostDialog.OnGhostItemClickListener listener) {        if (iconList == null) {            iconList = new ArrayList<>();        }        iconList.add(new Icon(picRes, name, listener));        return this;    }    /**     * 可否按返回键取消     * @param cancel     * @return     */    public NewGhostDialog setCancelable(boolean cancel) {        dialog.setCancelable(cancel);        return this;    }    /**     * 可否按对话框外部区域取消     * @param cancel     * @return     */    public NewGhostDialog setCanceledOnTouchOutside(boolean cancel) {        dialog.setCanceledOnTouchOutside(cancel);        return this;    }    /**     * 显示     * @return     */    public NewGhostDialog show() {        dialog.show();        return this;    }    /**     * 设置点击监听     * @return     */    public NewGhostDialog setListener(){        gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {            @Override            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {                //调用图标点击接口,顺便把图标位置传递过去                iconList.get(position).listener.onClick(position);                dialog.dismiss();            }        });        return this;    }    /**     * 图标类     */    public class Icon{        public int iconRes;        public String info;        public NewGhostDialog.OnGhostItemClickListener listener;        public Icon(int iconRes, String info, NewGhostDialog.OnGhostItemClickListener listener) {            this.iconRes = iconRes;            this.info = info;            this.listener = listener;        }    }    private class GhostAdapter extends BaseAdapter{        @Override        public int getCount() {            return iconList.size();        }        @Override        public Icon getItem(int position) {            Icon icon = null;            if (null != iconList)            {                icon = iconList.get(position);            }            return icon;        }        @Override        public long getItemId(int position) {            return position;        }        @Override        public View getView(int position, View convertView, ViewGroup parent) {            ViewHolder viewHolder;            if (null == convertView)            {                viewHolder = new ViewHolder();                LayoutInflater mInflater = LayoutInflater.from(context);                convertView = mInflater.inflate(R.layout.item_ghost_icon, null);                viewHolder.infoTV = (TextView) convertView.findViewById(R.id.infoTV);                viewHolder.iconIV = (ImageView) convertView.findViewById(R.id.iconIV);                convertView.setTag(viewHolder);            }            else            {                viewHolder = (ViewHolder) convertView.getTag();            }            Icon icon = getItem(position);            if (null != icon)            {                viewHolder.iconIV.setImageResource(icon.iconRes);                viewHolder.infoTV.setText(icon.info);            }            return convertView;        }    }    private static class ViewHolder    {        TextView infoTV;        ImageView iconIV;    }    /**     * 点击事件接口     */    public interface OnGhostItemClickListener {        void onClick(int position);    }}

知识点:①ViewHolder的使用优化

②接口的定义与调用


item_ghost_icon

<?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:gravity="center"    android:orientation="vertical"    >    <!-- item点击效果添加这个到上面 android:background="@drawable/item_background_selector"-->    <ImageView        android:id="@+id/iconIV"        android:layout_width="40dip"        android:layout_height="40dip"        android:scaleType="fitXY"        android:src="@mipmap/ic_launcher" />    <TextView        android:id="@+id/infoTV"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_marginTop="2dp"        android:text="@string/app_name"        android:textColor="#000000"        android:textSize="14sp" /></LinearLayout>

dialog_ghost_new

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:background="@color/white">    <GridView        android:id="@+id/ghostGV"        android:gravity="center"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_marginLeft="0px"        android:layout_marginRight="0px"        android:listSelector="@android:color/transparent"        android:numColumns="3"/></RelativeLayout>

dialog进退场动画

<style name="GhostDialogStyle" parent="@android:style/Theme.Dialog">    <!-- 背景透明 -->    <item name="android:windowBackground">@android:color/transparent</item>    <item name="android:windowContentOverlay">@null</item>    <!-- 浮于Activity之上 -->    <item name="android:windowIsFloating">true</item>    <!-- 边框 -->    <item name="android:windowFrame">@null</item>    <!-- Dialog以外的区域模糊效果 -->    <item name="android:backgroundDimEnabled">true</item>    <!-- 无标题 -->    <item name="android:windowNoTitle">true</item>    <!-- 半透明 -->    <item name="android:windowIsTranslucent">true</item>    <!-- Dialog进入及退出动画 -->    <item name="android:windowAnimationStyle">@style/ActionSheetDialogAnimation</item></style><!-- GhostDialog进出动画 --><style name="ActionSheetDialogAnimation" parent="@android:style/Animation.Dialog">    <item name="android:windowEnterAnimation">@anim/dialog_ghost_in</item>    <item name="android:windowExitAnimation">@anim/dialog_ghost_out</item></style>

上面的文件就可以做为一个控件啦,调用方式

new NewGhostDialog(NWMainActivity.this).builder()        .addItem(R.mipmap.ic_launcher, "新世界", new NewGhostDialog.OnGhostItemClickListener() {            @Override            public void onClick(int position) {                UIToast.showToastShort(NWMainActivity.this, "第一个");            }        })        .addItem(R.mipmap.ic_launcher, "新地球", new NewGhostDialog.OnGhostItemClickListener() {            @Override            public void onClick(int position) {                UIToast.showToastShort(NWMainActivity.this, "第二个");            }        })        .addItem(R.mipmap.ic_launcher, "新宇宙", new NewGhostDialog.OnGhostItemClickListener() {            @Override            public void onClick(int position) {                UIToast.showToastShort(NWMainActivity.this, "第三个");            }        })        .setCanceledOnTouchOutside(true)        .setCancelable(true)        .show();



0 0