Dialog的简单封装

许久没来,突发奇想,想要把自己用到的一些项目分享出去,那就从最简单的一个开启:dialog的简单封装使用。

先上图,看下大致的用法:

new WrapperDialog(this) {
    @Override
    public int getLayoutRes() {
        return R.layout.dialog_normal;
    }

    @Override
    protected void setDialogParams(Dialog dialog) {
        setDialogParams(dialog, Gravity.CENTER);
    }

    @Override
    public void help(ViewHelper helper) {
        helper.setOnClickListener(R.id.tv_confirm, new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dismiss();
            }
        });
    }
}.show();

如上,只需要实现抽象方法即可。之前dialog里经常有圆角的问题,里面有解决方法。

封装的思想基于RecyclerView使用ViewHolder,复用View的控件,但dialog可能用不到fu'y复用这一思想,但我们可以用用其来提供控件的简单获取。那就简单封装下,取名为ViewHelper吧,如下

public class ViewHelper {
    private SparseArray<View> views;
    public View itemView;

    public ViewHelper(final View itemView) {
        this.itemView = itemView;
        this.views = new SparseArray<>();
    }


    public View getItemView() {
        return itemView;
    }

    public <T extends View> T getView(int viewId) {
        View view = views.get(viewId);
        if (view == null) {
            view = itemView.findViewById(viewId);
            views.put(viewId, view);
        }

        return (T) view;
    }
 public ViewHelper setText(int viewId, CharSequence value) {
     TextView view = getView(viewId);
     view.setText(value);
     return this;
 }
}

另外,Dialog就基于ViewHelper做点简单的封装,真的简单,你看下面:

public abstract class WrapperDialog implements OnViewHelper {

    protected Dialog dialog;
    protected Context context;
    protected ViewHelper helper;

    public WrapperDialog(Context context) {
        this(context, R.style.AlertTheme);
    }

    public WrapperDialog(Context context, int themeResId) {
        this.context = context;
        this.dialog = new Dialog(context, themeResId);
        dialog.setContentView(getHelperView(null, getLayoutRes(), this));
        setDialogParams(dialog);
    }


    /**
     * 实例化对应layoutId的view同时生成ViewHelper
     *
     * @param group    可为null
     * @param layoutId
     * @param listener
     * @return
     */
    protected View getHelperView(ViewGroup group, int layoutId, OnViewHelper listener) {
        helper = new ViewHelper(LayoutInflater.from(context).inflate(layoutId, group, false));
        if (listener != null) {
            listener.help(helper);
        }
        return helper.getItemView();
    }


    public WrapperDialog show() {
        if (dialog != null && !isShowing()) {
            dialog.show();
        }
        return this;
    }

    public WrapperDialog dismiss() {
        if (isShowing()) {
            dialog.dismiss();
        }
        return this;
    }

    public boolean isShowing() {
        if (dialog != null && dialog.isShowing()) {
            return true;
        }
        return false;
    }


    public Dialog getDialog() {
        return dialog;
    }

    /**
     * 设置参数的参考实现
     *
     * @param dialog
     * @param width
     * @param height
     * @param gravity
     */
    protected void setDialogParams(Dialog dialog, int width, int height, int gravity) {
        Window window = dialog.getWindow();
        WindowManager.LayoutParams params = window.getAttributes();
        params.width = width;
        params.height = height;
        window.setGravity(gravity);
        window.setAttributes(params);
    }


    /**
     * 设置参数的参考实现
     *
     * @param gravity
     */
    public void setDialogParams(Dialog dialog, int gravity) {
        Window window = dialog.getWindow();
        WindowManager.LayoutParams params = window.getAttributes();
        params.width = WindowManager.LayoutParams.WRAP_CONTENT;
        params.height = WindowManager.LayoutParams.WRAP_CONTENT;
        window.setGravity(gravity);
        window.setAttributes(params);
    }

    public abstract int getLayoutRes();

    /**
     * 设置dialog的参数
     *
     * @param dialog
     */
    protected abstract void setDialogParams(Dialog dialog);

    @Override
    public abstract void help(ViewHelper helper);


    public ViewHelper getViewHelper() {
        return helper;
    }

    public WrapperDialog addHelperCallback(HelperCallback callback) {
        callback.help(dialog, helper);
        return this;
    }

    public WrapperDialog addHelperAbsCallback(HelperAbsCallback callback) {
        callback.help(this, dialog, helper);
        return this;
    }

    public interface HelperCallback {
        /**
         * 默认帮助方式
         *
         * @param dialog 用来设置dialog的一些默认参数
         * @param helper 用于布局修改与实现
         */
        void help(Dialog dialog, ViewHelper helper);
    }


    public interface HelperAbsCallback {
        void help(WrapperDialog wrapper, Dialog dialog, ViewHelper helper);
    }

}

附图几张,以此实现的效果:

源码地址:点我

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对话框的封装可以分为以下几个步骤: 1. 定义对话框类:继承自对应的对话框基类,例如 QDialog。 2. 添加构造函数:可以添加一个带参数的构造函数,用于传递参数和设置标志位。 3. 添加界面控件:在对话框中添加需要的界面控件,例如输入框、下拉框、按钮等。 4. 添加信号和槽函数:为界面控件添加信号和槽函数,用于实现控件之间的交互。 5. 添加保存数据函数:实现保存数据的功能,如果是修改数据,需要传入原始数据以便更新。 6. 添加取消按钮:添加一个取消按钮,点击后关闭对话框。 7. 封装对话框:将对话框封装成一个函数,方便在其他地方调用。 以下是一个简单的对话框封装示例: ```python from PyQt5.QtWidgets import QDialog, QLabel, QLineEdit, QPushButton, QVBoxLayout class DataDialog(QDialog): def __init__(self, parent=None, data=None): super().__init__(parent) self.data = data self.is_modify = (data is not None) self.init_ui() def init_ui(self): self.setWindowTitle('添加数据' if not self.is_modify else '修改数据') self.name_label = QLabel('名称') self.name_edit = QLineEdit() self.name_edit.setText(self.data['name'] if self.is_modify else '') self.value_label = QLabel('数值') self.value_edit = QLineEdit() self.value_edit.setText(str(self.data['value']) if self.is_modify else '') self.save_button = QPushButton('保存') self.save_button.clicked.connect(self.save_data) self.cancel_button = QPushButton('取消') self.cancel_button.clicked.connect(self.close) layout = QVBoxLayout() layout.addWidget(self.name_label) layout.addWidget(self.name_edit) layout.addWidget(self.value_label) layout.addWidget(self.value_edit) layout.addWidget(self.save_button) layout.addWidget(self.cancel_button) self.setLayout(layout) def save_data(self): name = self.name_edit.text() value = float(self.value_edit.text()) if not name: return if self.is_modify: self.data['name'] = name self.data['value'] = value else: self.data = {'name': name, 'value': value} self.accept() def show_data_dialog(parent=None, data=None): dialog = DataDialog(parent, data) if dialog.exec_() == QDialog.Accepted: return dialog.data else: return None ``` 在使用时,可以直接调用 show_data_dialog 函数来显示对话框,并获取用户输入的数据。例如: ```python data = show_data_dialog(parent=self, data=my_data) if data: # 保存数据 else: # 取消保存 ``` 这样就实现了一个简单的对话框封装

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值