【问题标题】:how to pass an onclick handler to a custom dialog class如何将 onclick 处理程序传递给自定义对话框类
【发布时间】:2018-02-01 21:40:31
【问题描述】:

我正在尝试创建一个自定义类来显示是/否 AlertDialog,但我希望 onClick 处理程序位于实例化自定义类的活动中。到目前为止,自定义类如下所示:

public class YesNoDialog  {
private Context gContext = null;
private DialogInterface.OnClickListener onClickListener;
private AlertDialog alertDialog = null;

public YesNoDialog(Context context,
               DialogInterface.OnClickListener listener) {
    this.gContext = context;
    this.onClickListener = listener;
}

public void ShowDialog() {

    AlertDialog.Builder alertDialogBuilder = new  
                      AlertDialog.Builder(this.gContext);
    alertDialogBuilder.setTitle("Hello World");
    alertDialogBuilder
            .setMessage("Are you sure?")
            .setCancelable(false)
            .setPositiveButton("Yes",this.onClickListener)
            .setNegativeButton("No",this.onClickListener);
    alertDialog = alertDialogBuilder.create();
    alertDialog.show();
  }
}

我的想法是将上下文和 onClick 处理程序传递给构造函数中的对象,然后将处理程序分配给 .setPositive 和 .setNegative 按钮。

我在 MainActivity 类中实现了 DialogInterface.OnClickListener:

public class MainActivity
        extends AppCompatActivity
        implements DialogInterface.OnClickListener {

并在 MainActivity 中创建了 onClick 处理程序,当在对话框中单击“是”或“否”按钮时应调用该处理程序。

@Override
public void onClick(DialogInterface dialog, int id) {
    Log.d("DIALOG RETURNS ID=", Integer.toString(id));
    dialog.dismiss();
}

我不确定我是否走在正确的轨道上,但我一直在试图弄清楚我现在如何将 onClick 处理程序传递给 YesNoDialog 对象。我已经尝试了几种变体:

YesNoDialog dialog = new YesNoDialog(this, MainActivity.onClick);

没有成功(不会编译)。我也尝试过只传递上下文,假设这可能是我真正需要的 .setPositive 和 .setNegative 按钮处理程序,但这也不起作用......这个调用需要一个 DialogInterface.OnClickListener。

感觉就像我接近了,但我无法克服障碍。谁能帮我把这些点联系起来?

【问题讨论】:

    标签: android dialog


    【解决方案1】:

    创建一个类(DialogUtils)并在其中添加此方法。

    public static void showPopUp(Context context
                , String title
                , String msg
                , String positiveBtnTxt
                , String negativeBtnTxt
                , DialogInterface.OnClickListener positiveBtnListener
                , DialogInterface.OnClickListener negativeBtnListener){
    
        final AlertDialog errorDialog;
        AlertDialog.Builder errorDialogBuilder = new AlertDialog.Builder(context, R.style.NativeDialogue);
        errorDialogBuilder.setTitle(title);
        errorDialogBuilder.setMessage(msg);
        errorDialogBuilder.setPositiveButton(positiveBtnTxt, positiveBtnListener);
        errorDialogBuilder.setNegativeButton(negativeBtnTxt, negativeBtnListener);
        errorDialog = errorDialogBuilder.create();
        errorDialog.show();
    }
    

    这样调用方法:

    DialogUtils.showPopUp(this, "title", "message", "positive btn name", "Negative Btn name", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            "Your action"
        }
    }, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            "Your action"
        }
    });
    

    【讨论】:

    • 这应该得到一百万个赞!一个简单的解决方案应该是一个简单的任务。正如@Malcom 所建议的那样,我花了几个小时以“正确”的方式对其进行编码,结果却陷入了 onAttach() - 不被称为地狱,并且有比我想要的更多的代码。谢谢!
    【解决方案2】:

    这在 Android 中的 the official documentation on dialogs 中有描述。简而言之,您需要执行以下步骤:

    1. 为您的对话框创建一个DialogFragment,以便在设备旋转或以其他方式更改配置时正确恢复。
    2. 创建一个允许您发送对话结果的界面。
    3. 在活动中实现此接口。
    4. 将活动投射到onAttach 中的DialogFragment 内的接口,并将其存储在某个字段中。不要忘记在onDetach 中设置为null
    5. 当点击对话框按钮时,可以调用相应的接口方法,Activity会得到结果。

    或者,如果您只将此对话框与一个活动一起使用,则您可能不声明接口并简单地存储对活动的引用。

    【讨论】:

      【解决方案3】:

      您可以在 MainActivity 类中创建一种方法。如下所示。

      public void onClickOnYesButton(int id){
      
      }
      

      传递 MainActivity 引用,如下所示。

      public YesNoDialog(MainActivity context) {
      this.gContext = context;
      }
      

      并使用 MainActivity 引用调用 onClickOnYessButton

      任务完成!

      【讨论】:

      • 谢谢。如果我理解正确,您是在向 YesNoDialog 中的构造函数建议一个 mod,它将限制其对 MainActivity 的使用。我想在任何活动中使用它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-22
      相关资源
      最近更新 更多