美文网首页Android
Android UI篇——DialogFragment系列五之I

Android UI篇——DialogFragment系列五之I

作者: lvTravler | 来源:发表于2019-08-28 22:51 被阅读0次

    《DialogFragment系列一之源码分析》
    《DialogFragment系列二之Dialog封装》
    《DialogFragment系列三之AlertDialog实现》
    《DialogFragment系列四之StatusDialog(Progress、Success、Error)实现》
    《DialogFragment系列五之ItemDialog(eg:BottomDialog)实现》
    《DialogFragment系列六之常见问题》

    关于DialogFragment的文章已经好几篇了,因为最近项目使用到弹框的地方比较多,所以就自定义了一系列。今天做了一个分享功能【微信好友分享、朋友圈分享、收藏】(可以配合此弹出框跑通分享功能),需要用到底部弹框(BottomDialog),写了一个再和大家分享交流。

    自定义时尽量是使其应用范围比较广,例如不仅可以底部显示,还可以中间显示甚至底部显示,不仅可以列表显示,还可以网格显示,总之遵从使其扩展性更高的原则,下面先看一下效果图,再分析一下代码。

    效果图:

    ItemDialog.png

    代码实现:

    public class ItemDialog extends Dialog implements BaseViewHolder.OnItemClickListener<ItemBean> {
        private DialogParams mDialogParams;
    
        private ItemDialog() {
            mDialogParams = new DialogParams();
        }
    
        public static Builder with(AppCompatActivity activity) {
            return new Builder(activity);
        }
    
        @Override
        protected int setLayoutRes() {
            return R.layout.dialog_item;
        }
    
        @Override
        public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
            if (mDialogParams.backgroundColor != -1 && mDialogParams.backgroundColor != 0) {
                view.setBackgroundColor(getContext().getResources().getColor(mDialogParams.backgroundColor));
            }
            RecyclerView recDialogItemShow = view.findViewById(R.id.rec_dialog_item_show);
            recDialogItemShow.setHasFixedSize(true);
            switch (mDialogParams.showType) {
                case ShowType.LIST:
                    recDialogItemShow.setLayoutManager(new LinearLayoutManager(getContext()));
                    break;
                case ShowType.GRID:
                    recDialogItemShow.setLayoutManager(new GridLayoutManager(getContext(), mDialogParams.spanCount));
                    break;
            }
            ItemDialogAdapter adapter = new ItemDialogAdapter(getContext(), R.layout.item_item_dialog, null);
            recDialogItemShow.setAdapter(adapter);
            adapter.setOnItemClickListener(this);
            adapter.refreshAdapter(mDialogParams.data);
        }
    
        @Override
        protected boolean setCancelable() {
            return mDialogParams.isCancelable;
        }
    
        @Override
        protected int setGravity() {
            return mDialogParams.gravity;
        }
    
        @Override
        protected int setAnimations() {
            return mDialogParams.animations;
        }
    
        @Override
        public void onItemClick(BaseViewHolder viewHolder, int position, ItemBean itemData, Object type) {
            if (mDialogParams.onItemClickListener != null) {
                dismiss();
                mDialogParams.onItemClickListener.onItemClick(position, itemData);
            }
        }
    
        @Override
        public void onItemLongClick(BaseViewHolder viewHolder, int position, ItemBean itemData, Object type) {
    
        }
    
        public class DialogParams {
            /**
             * 是否可以点击外部dismiss
             */
            boolean isCancelable = true;
            /**
             * 展示类型
             */
            @ShowType
            int showType = -1;
            /**
             * Grid形式展示时每行显示的数量
             */
            int spanCount = -1;
            /**
             * 展示数据
             */
            List<ItemBean> data;
            /**
             * 监听
             */
            OnItemClickListener onItemClickListener;
            /**
             * 位置
             *
             * @see android.view.Gravity
             */
            int gravity = -1;
            /**
             * 背景颜色
             */
            int backgroundColor = -1;
            /**
             * 动画
             */
            int animations = -1;
        }
    
        public static class Builder {
            AppCompatActivity activity;
            DialogParams P;
            ItemDialog dialog;
    
            public Builder(AppCompatActivity activity) {
                dialog = new ItemDialog();
                this.P = dialog.mDialogParams;
                this.activity = activity;
            }
    
            public Builder setShowType(@ShowType int val) {
                P.showType = val;
                return this;
            }
    
            public Builder setSpanCount(int val) {
                P.spanCount = val;
                return this;
            }
    
            public Builder setData(@NonNull List<ItemBean> val) {
                P.data = val;
                return this;
            }
    
            public Builder setOnItemClickListener(@NonNull OnItemClickListener val) {
                P.onItemClickListener = val;
                return this;
            }
    
            public Builder setCancelable(boolean val) {
                P.isCancelable = val;
                return this;
            }
    
            public Builder setGravity(int val) {
                P.gravity = val;
                return this;
            }
    
            public Builder setBackgroundColor(@ColorRes int val) {
                P.backgroundColor = val;
                return this;
            }
    
            public Builder setAnimations(@StyleRes int val) {
                P.animations = val;
                return this;
            }
    
            public ItemDialog show() {
                if (P.data == null) {
                    throw new IllegalArgumentException("Please set data");
                }
    
                if (P.showType == -1) {
                    throw new IllegalArgumentException("Please set showType");
                }
    
                dialog.show(activity);
                return dialog;
            }
        }
    
        public @interface ShowType {
    
            int LIST = 0x000000051;
    
            int GRID = 0x000000061;
    
        }
    
        public interface OnItemClickListener {
            void onItemClick(int position, ItemBean itemData);
        }
    }
    

    还是使用构造者模式,还是extends Dialog,布局使用了RecyclerView,支持List和Grid显示,Grid显示时可以定义每行显示的个数,对每一个Item进行了Click监听并设置了回调接口(所以就起了个ItemDialog);支持上中下位置显示setGravity(),支持自定义动画等。

    使用方式(详情请点击)

    public void showItemDialog() {
            List<ItemBean> itemBeanList = Utils.getItemBeanList();
            ItemDialog.with(MainActivity.this)
                    .setCancelable(true)
                    .setData(itemBeanList)
                    .setOnItemClickListener(new ItemDialog.OnItemClickListener() {
                        @Override
                        public void onItemClick(int position, ItemBean itemData) {
                            showSuccessDialog();
                        }
                    })
                    .setSpanCount(itemBeanList.size())
                    .setAnimations(R.style.Dialog_Anim_Bottom_In_Bottom_Out)
                    .setGravity(Gravity.BOTTOM)
                    .setShowType(ItemDialog.ShowType.GRID)
                    .show();
     }
    

    后记:

    在写博客的时候发现还可以将Adapter抽出来,这样就可以灵活定义布局,感兴趣的同学可以抽取一下!

    读者有问或其他观点请留言交流,共同进步!

    源码Github传送门,觉得不错就给个star吧,谢谢!

    相关文章

      网友评论

        本文标题:Android UI篇——DialogFragment系列五之I

        本文链接:https://www.haomeiwen.com/subject/hhuvectx.html