【问题标题】:Design Pattern not working with OnClickListener [closed]设计模式不适用于 OnClickListener [关闭]
【发布时间】:2018-08-24 14:09:36
【问题描述】:

我正在尝试为我的所有对话框开发一个抽象的 OnClickListener 调用程序。

public abstract class  A {
  public void handleError() {
    if (dialogs != null && activity != null) {
       final String mNoxMessages[] = God.getMnoxMessage((Context) activity, response);
       ((Activity) activity).runOnUiThread(new Thread
           (new Runnable() {
              public void run() {
                  dialogs.showDialogForMessage("title", "description", 
                  "ok", "cancel",
                  new View.OnClickListener() {
                     @Override
                        public void onClick(View view) {
//breakpoint location here never reaches
                           performDialogOkAction(response);
                           dialogs.clearAll();
                       }
                  }, 
                  new View.OnClickListener() {
                     @Override
                         public void onClick(View view) {
//breakpoint location here never reaches
                             performDialogCancelAction(response);
                             dialogs.clearAll();
                        }
                  }
               }));
     );}
   }
   public abstract void performDialogOkAction(Object errorCode);
   public abstract void performDialogCancelAction(Object errorCode);

}


public void showDialogForMessage(String title, String description, 
                     String okButtonText, String cancelButtonText,
                     View.OnClickListener okOnClick,
                     View.OnClickListener cancelOnClick) {

    ok = informationDialog.findViewById(R.id.information_ok);
    cancel = informationDialog.findViewById(R.id.information_cancel);

    ok.setText(okButtonText);
    cancel.setText(cancelButtonText);

    ok.setOnClickListener(okOnClick);
    cancel.setOnClickListener(cancelOnClick);
}


public class B extends A {
 @Override
    public void performDialogOkAction(Object errorCode) {
       //breakpoint location here never reaches
 }
}

当我单击按钮时,控件根本不会转到 performDialogOkAction 方法。

我在这里错过了什么?

【问题讨论】:

  • dialogs是什么对象?
  • dialogs.showDialogForMessage 被调用,甚至setOnClickListener 被调用..
  • 又增加了2个位置,断点没有到达onClick内部,这是根本原因
  • 我猜是因为缺少minimal reproducible example。例如,你没有显示你在哪里或如何使用B,或者informationDialog 是什么,或者它是在哪里创建和显示的,或者A 如何访问response,即使它没有在任何地方声明等等。老实说,以目前的形式,这种设计似乎有点令人费解。您是否考虑过继承 DialogDialogFragment 并在那里处理所有这些?

标签: java android design-patterns


【解决方案1】:

代码不起作用的原因是因为从未调用过handleError()。您有两种选择:

  1. handleError()替换为构造函数A()

  2. 在 B 的构造函数中调用 handleError()

【讨论】:

  • 不,handleError被调用了,我放了一个断点来检查..那不是问题..
  • 断点是否在inside performDialogOkAction?
  • 是的,断点在方法内部的语句上
【解决方案2】:

发现问题。

我在我的主要活动中调用它,阻止任何对话框执行任何操作。

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    if (ev.getAction() == MotionEvent.ACTION_DOWN) {
        getDialogs().clearAll();
        getDialogs().dimissSnackBar() ;
    }
    return super.dispatchTouchEvent(ev);
}

一旦我注释了上面的代码,我就可以得到我的 onClick 事件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-27
    相关资源
    最近更新 更多