【问题标题】:multiple onClickListener on a single Button单个按钮上的多个 onClickListener
【发布时间】:2018-03-03 07:13:58
【问题描述】:

在我的项目中,我必须在应用程序的不同部分使用对话框,而缺点是每次都使用相同的代码来创建和显示对话框!所以我决定做一个函数来创建和显示一个对话框,只要我需要,我就调用它,

问题是,我的 Dialog 上有 2 个按钮,在重构 onClickListener 之前我可以轻松使用

dialog.dismiss();
// more codes ...

在 setOnClickListener 中 但现在有了传入的 OnClickListener 对象,我无法控制对话框实例...... 这是我写的函数

    public static void warningAndErrorDialog(Activity activity, int titleResourceId, int iconResourceId, int contentResourceId
        , HashMap<CustomDialogButton, View.OnClickListener> buttons) {

    Typeface iranSansFont = setFont(activity, FontStyle.IRAN_SANS_REGULAR);
    final Dialog dialog = new Dialog(activity);
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
    dialog.setContentView(R.layout.dialog);

    CustomFontTextView cftvTitle = (CustomFontTextView)
            dialog.findViewById(R.id.txtViwDialogTitle);
    if(activity.getString(titleResourceId) != null)
         cftvTitle.setText(titleResourceId);
    else cftvTitle.setText(" ");

    CustomFontTextView cftvContent = (CustomFontTextView)
            dialog.findViewById(R.id.txtViwDialogContent);
    if(activity.getString(contentResourceId) != null)
        cftvContent.setText(contentResourceId);
    else cftvTitle.setText(" ");

    ImageView imgViwDialogTitle = dialog.findViewById(R.id.imgViwDialogTitle);
    imgViwDialogTitle.setImageResource(iconResourceId);


    Button btnYes = null;
    Button btnNo = null;

    for (Map.Entry<CustomDialogButton, View.OnClickListener> button : buttons.entrySet())
        switch (button.getKey()) {
            case YES:
                if (btnYes != null) break;
                btnYes = dialog.findViewById(R.id.btnYes);
                btnYes.setTypeface(iranSansFont);
                if (button.getValue() != null)
                    btnYes.setOnClickListener(button.getValue());
                break;
            case NO:
                if (btnNo != null) break;
                btnNo = dialog.findViewById(R.id.btnNo);
                if (button.getValue() != null) {
                    btnNo.setTypeface(iranSansFont);
                    btnNo.setOnClickListener(button.getValue());
                } else
                    btnNo.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            dialog.dismiss();
                        }
                    });
                break;
            case OK:
                btnYes = dialog.findViewById(R.id.btnYes);
                btnYes.setText(R.string.ok);
                if (button.getValue() != null) btnYes.setOnClickListener(button.getValue());
                else
                    btnYes.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            dialog.dismiss();
                        }
                    });
                btnNo = dialog.findViewById(R.id.btnNo);
                btnNo.setVisibility(View.INVISIBLE);
                return;
        }


        dialog.show();
}

案例通知是: 我从传递给函数的 onClickListener 设置按钮 setOnClickListener。 所以我无法控制它的内容。现在如何添加语句 dialog.dismiss(); ? 我唯一能想到的就是找到一种方法将 OnClickListener 数组传递给 setOnCLickListener 方法。

一个用于关闭对话框,另一个用于设置按钮的实际工作...

ps:我尝试使用 setOnTouchListener 关闭对话框,但正如我所料,这不起作用...:-?

那我该怎么办?

最终编辑: 有人建议

btnYes.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                for (View.OnClickListener callback : callbacks)
                    if (callback != null)
                        callback.onClick(view);
            }
        });

(回调是 View.OnClickListener 对象的列表)这就是“如何在单个按钮上添加多个 onClickListener”问题的确切答案。

但是@greenapps 解决方案是最适合我需要的解决方案,谢谢 :)

所以我分享了可能关心的代码的最终版本:D:

公共类 CustomDialog {

private final Dialog dialog;
private Typeface font;
private CustomFontTextView cftvTitle;
private CustomFontTextView cftvContent;
private ImageView imgViwDialogTitle;
private Activity activity;
private Button btnYes;
private Button btnNo;


public CustomDialog(final Activity activity, int titleResourceId, int iconResourceId, int contentResourceId
        , HashMap<CustomDialogButton, View.OnClickListener> buttons) {

    font = Utility.setFont(activity, FontStyle.IRAN_SANS_REGULAR);
    this.activity = activity;
    dialog = new Dialog(this.activity);

    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
    dialog.setContentView(R.layout.dialog);

    setTitleTextbyId(titleResourceId);
    setContentTextById(contentResourceId);
    setTitleIconById(iconResourceId);

    setButtons(buttons);

}

public CustomDialog(Activity activity) {
    font = Utility.setFont(activity, FontStyle.IRAN_SANS_REGULAR);
    this.activity = activity;
    dialog = new Dialog(this.activity);

    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
    dialog.setContentView(R.layout.dialog);

    setTitleTextbyId(0);
    setContentTextById(0);
    setTitleIconById(0);

    setButtons(null);
}

public void show() {
    dialog.show();
}

public void setButtons(HashMap<CustomDialogButton, View.OnClickListener> buttons) {

    for (final Map.Entry<CustomDialogButton, View.OnClickListener> button : buttons.entrySet())
        switch (button.getKey()) {
            case YES:
                setButtonYes(button);
                break;
            case NO:
                setButtonNo(button);
                break;
            case OK:
                setButtonYes(button);
                btnYes.setText(R.string.ok);
                btnNo = dialog.findViewById(R.id.btnNo);
                btnNo.setVisibility(View.INVISIBLE);
                break;
        }
}

@NonNull
private void setButtonNo(final Map.Entry<CustomDialogButton, View.OnClickListener> button) {

    if (btnNo != null) return;
    btnNo = dialog.findViewById(R.id.btnNo);
        btnNo.setTypeface(font);
        btnNo.setOnClickListener(button.getValue());
        btnNo.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                dialog.dismiss();
                    if(button.getValue() != null)
                        button.getValue().onClick(view);
            }
        });
}

@NonNull
private void setButtonYes(final Map.Entry<CustomDialogButton, View.OnClickListener> button) {


    if (btnYes != null) return;
    btnYes = dialog.findViewById(R.id.btnYes);
    btnYes.setTypeface(font);
        btnYes.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                dialog.dismiss();
                if(button.getValue() != null)
                    button.getValue().onClick(view);
            }
        });
}

public void setTitleIconById(int iconResourceId) {
    this.imgViwDialogTitle = dialog.findViewById(R.id.imgViwDialogTitle);
    if (activity.getResources().getDrawable(iconResourceId) != null)
        imgViwDialogTitle.setImageResource(iconResourceId);
}

public void setContentTextById(int contentResourceId) {
    this.cftvContent = (CustomFontTextView)
            this.dialog.findViewById(R.id.txtViwDialogContent);
    if (this.activity.getString(contentResourceId) != null)
        cftvContent.setText(contentResourceId);
    else cftvTitle.setText(" ");
}

public void setTitleTextbyId(int titleResourceId) {
    this.cftvTitle = (CustomFontTextView)
            this.dialog.findViewById(R.id.txtViwDialogTitle);
    if (this.activity.getString(titleResourceId) != null)
        cftvTitle.setText(titleResourceId);
    else cftvTitle.setText(" ");
}

public void dismiss() {
    dialog.dismiss();
}

}

【问题讨论】:

  • 您将 OnClickListener 对象添加为参数,因此您可以在创建此对象的位置定义 OnClickListener 内容。这有什么问题?
  • 我在哪里创建这个对象,我无权访问对话框实例...,我只是在方法体中创建一个对话框对象,而不是在它之外...
  • 好吧,我认为您不必为此创建静态方法。而不是为你的对话框创建一个 Singleton 类,这个类应该有一个dismiss()方法,它是公共方法,所以你可以从任何地方访问它。
  • 类似btnYes.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { dialog.dismiss(); button.getValue().click(); } }。 ?
  • @greenapps 是的,正是我要找的。但是 OnClickListener 对象上没有 Click 方法...

标签: java android


【解决方案1】:
btnYes.setOnClickListener(button.getValue());

改为:

btnYes.setOnClickListener(new View.OnClickListener() { 
   @Override public void onClick(View view) { 
       dialog.dismiss(); 
       button.getValue().onClick(view); 
   }
});

【讨论】:

    猜你喜欢
    • 2014-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-19
    相关资源
    最近更新 更多