簡體   English   中英

單個按鈕上有多個onClickListener

[英]multiple onClickListener on a single Button

在我的項目中,我必須在應用程序的不同部分使用對話框,缺點是相同的代碼用於創建和顯示每次使用的對話框! 因此,我決定創建一個用於創建和顯示對話框的函數,只要需要,我就可以調用它,

問題是,對話框上有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對象的列表),這就是“如何在單個Button上添加多個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();
}

}

btnYes.setOnClickListener(button.getValue());

改成:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM