万能的Dialog

来源:互联网 发布:通达信公式源码 编辑:程序博客网 时间:2024/06/05 02:28

1. 前言


最近写项目被这个dialog给搞醉了,就拿照相的dialog弹出框来说,一下子是直接显示,一下子又要从这个底部弹到中间,一下子只要从底部弹出,一下子需求又要全屏,不知道以后又会是什么,搞得我是烦不胜烦,所以后来就出来了这个能解决这些问题的万能dialog。

2.分析和实现


2.1分析:

拿这个仿IOS上传图片的实例来说,系统的dialog肯定是不能满足需求的,得要自己设置dialog的View和动画的Style才能够做到:
  
     这里写图片描述
  
我们一般会这么写:

Dialog dialog = new Dialog(context,R.style.from_bottom_dialog);View diaolgRootView = View.inflate(context,R.layout.photo_choose_dialog);dialog.setContentView(diaolgRootView);Window dialogWindow = dialog.getWindow();dialogWindow.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);dialogWindow.setGravity(Gravity.CENTER | Gravity.BOTTOM);dialog.show();// 找到控件,设置值,设置监听

假设我们现在需要选择性别,动画的方式是从底部弹到中间,这个就需要改动了,况且每次都这样写也太过于麻烦。    

2.2实现万能:

ListView有一个万能适配,主要是ViewHolder考虑得真好,所以我打算模仿这种方式也用一个DialogViewHolder来实现界面的处理(文字设置以及点击监听),至于显示的动画方式宽度和高度的不同形式就调用不同的方法来实现。

/** *  * ============================================================ *  * copyright :好莱信息科技有限公司 (c) 2014 *  * author : HUI *  * version :1.0 *  * date created : On November 20, 2014 9:30:34 *  * description :弹出框的view holder *  * revision history : *  * ============================================================ * */public class DialogViewHolder {    private final SparseArray<View> mViews;    private View mDialogView;    private DialogViewHolder(Context context, int layoutId) {        this.mViews = new SparseArray<View>();        mDialogView = GeneralUtil.getView(context, layoutId, null);    }    public static DialogViewHolder get(Context context, int layoutId) {        return new DialogViewHolder(context, layoutId);    }    public View getConvertView() {        return mDialogView;    }    /**     * Set the string for TextView     *      * @param viewId     * @param text     * @return     */    public DialogViewHolder setText(int viewId, CharSequence text) {        TextView view = getView(viewId);        view.setText(text);        return this;    }    /**     * set view visible     *      * @param viewId     * @param text     * @return     */    public DialogViewHolder setViewInViSible(int viewId) {        TextView view = getView(viewId);        view.setVisibility(View.INVISIBLE);        return this;    }    /**     * set view visible     *      * @param viewId     * @param text     * @return     */    public DialogViewHolder setViewViSible(int viewId) {        TextView view = getView(viewId);        view.setVisibility(View.VISIBLE);        return this;    }    /**     * set view gone     *      * @param viewId     * @param text     * @return     */    public DialogViewHolder setViewGone(int viewId) {        TextView view = getView(viewId);        view.setVisibility(View.GONE);        return this;    }    /**     * 设置点击     */    public DialogViewHolder setOnClick(int viewId, OnClickListener onClick) {        View view = getView(viewId);        view.setOnClickListener(onClick);        return this;    }    /**     * Through control the Id of the access to control, if not join views     *      * @param viewId     * @return     */    @SuppressWarnings("unchecked")    public <T extends View> T getView(int viewId) {        View view = mViews.get(viewId);        if (view == null) {            view = mDialogView.findViewById(viewId);            mViews.put(viewId, view);        }        return (T) view;    }}

DialogUtil:

public abstract class DialogUtil {    private Dialog mDialog;    private Window mDialogWindow;    private DialogViewHolder dilaogVh;    private View mRootView;    public DialogUtil(Context context, int layoutId) {        dilaogVh = DialogViewHolder.get(context, layoutId);        mRootView = dilaogVh.getConvertView();        mDialog = new Dialog(context, R.style.dialog);        mDialog.setContentView(mRootView);        mDialogWindow = mDialog.getWindow();        convert(dilaogVh);    }    /**     * 把弹出框view holder传出去     */    public abstract void convert(DialogViewHolder view);    /**     * 从底部一直弹到中间     */    public DialogUtil fromBottomToMiddle() {        mDialogWindow.setWindowAnimations(R.style.main_menu_animstyle);        mDialogWindow.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);        return this;    }    /**     * 从底部弹出     */    public DialogUtil fromBottom() {        fromBottomToMiddle();        mDialogWindow.setGravity(Gravity.CENTER | Gravity.BOTTOM);        return this;    }    /**     * 显示一个Dialog可以传递一个style     */    public DialogUtil showDialog(int style) {        mDialogWindow.setWindowAnimations(style);        mDialog.show();        return this;    }    /**     * 显示一个Dialog可以传递一个是否显示动画     */    public DialogUtil showDialog(boolean isAnimation) {        mDialogWindow.setWindowAnimations(R.style.dialog_scale_animstyle);        mDialog.show();        return this;    }    /**     * 全屏显示     */    public DialogUtil fullScreen() {        WindowManager.LayoutParams wl = mDialogWindow.getAttributes();        wl.height = ViewGroup.LayoutParams.MATCH_PARENT;        wl.width = ViewGroup.LayoutParams.MATCH_PARENT;        mDialog.onWindowAttributesChanged(wl);        return this;    }    /**     * 全屏宽度     */    public DialogUtil fullWidth() {        WindowManager.LayoutParams wl = mDialogWindow.getAttributes();        wl.width = ViewGroup.LayoutParams.MATCH_PARENT;        mDialog.onWindowAttributesChanged(wl);        return this;    }    /**     * 全屏高度     */    public DialogUtil fullHeight() {        WindowManager.LayoutParams wl = mDialogWindow.getAttributes();        wl.height = ViewGroup.LayoutParams.MATCH_PARENT;        mDialog.onWindowAttributesChanged(wl);        return this;    }    /**     * 自己设置高度和宽度     */    public DialogUtil setWidthAndHeight(int width, int height) {        WindowManager.LayoutParams wl = mDialogWindow.getAttributes();        wl.width = width;        wl.height = height;        mDialog.onWindowAttributesChanged(wl);        return this;    }    /**     * 显示dialog     */    public DialogUtil showDialog() {        if (mDialog != null && !mDialog.isShowing()) {            mDialog.show();        }        return this;    }    /**     * cancel dialog     */    public void cancelDialog() {        if (mDialog != null) {            mDialog.dismiss();        }    }}

还是拿上传照片来说,现在就可以这样写了

private DialogUtil mUploadPhotoDialog,mExchangeSexDialog;// 上传图片public void uploadPhoto(){    if(mUploadPhotoDialog == null){        mUploadPhotoDialog = new DialogUtil(this,R.layout.photo_choose_dialog) {            @Override            public void convert(DialogViewHolder view) {                view.setOnClick(R.id.user_cancle, new OnClickListener() {                       @Override                    public void onClick(View v) {                        cancelDialog();                    }                });                 // ...            }        };        // 从底部显示并且全屏        mUploadPhotoDialog.fromBottom().fullWidth();    }    mUploadPhotoDialog.showDialog();}// 修改性别public void exchangeSex(){    if(mExchangeSexDialog == null){        mExchangeSexDialog = new DialogUtil(this,R.layout.photo_choose_dialog) {            @Override            public void convert(DialogViewHolder view) {                view.setText(R.id.image_depot, "男");                view.setText(R.id.photo_camre, "女");            }        };        // 从底部弹到中间,全屏        mExchangeSexDialog.fromBottomToMiddle().fullWidth();    }    mExchangeSexDialog.showDialog();}

源码下载地址:http://download.csdn.net/detail/z240336124/9430544

2 0