如何在函数内的另一个 class 中放置一个警告对话框

How to put an alert dialog in another class inside a function

伙计们,我已经在我的应用程序中创建了一个自定义 date and time picker,现在我正在多次使用它 picker。因此,为了避免代码冗余,我认为我应该将该函数放在另一个 class 中的单独函数中,从那里我可以在需要时调用它,但我无法这样做,请帮忙。 单独的 class 是:

public class DateTimePicker {
    String str;

    public String returnDate(final Context ctx) {
        AlertDialog.Builder builder1 = new AlertDialog.Builder(ctx);
        final DatePicker picker1 = new DatePicker(ctx);

        try {
            Field f[] = picker1.getClass().getDeclaredFields();
            for (Field field : f) {
                if (field.getName().equals("mYearPicker")|| field.getName().equals("mYearSpinner") ) {
                    field.setAccessible(true);
                    Object yearPicker = new Object();
                    yearPicker = field.get(picker1);
                    ((View) yearPicker).setVisibility(View.GONE);
                }
            }
        } catch(Exception ex) {
            ex.printStackTrace();
        }
        picker1.setCalendarViewShown(false);

        builder1.setTitle("Please select date on which you would be leaving :")
            .setView(picker1)
            .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int whichButton) {
                    SimpleDateFormat parseFormat = new SimpleDateFormat("EEE dd MMM");
                    Date date1 = new Date();
                    date1.setDate(picker1.getDayOfMonth());
                    date1.setMonth(picker1.getMonth());
                    final String s = parseFormat.format(date1);
                    Log.e("DATE",s);

                    //Time picker
                    AlertDialog.Builder builder = new AlertDialog.Builder(ctx);
                    final TimePicker picker = new TimePicker(ctx);
                    picker.setIs24HourView(true);
                    builder.setTitle("Please select time at which you would be leaving :")
                        .setView(picker)
                        .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int whichButton) {
                                int hour = picker.getCurrentHour();
                                int minute = picker.getCurrentMinute();
                                str = s + " " + hour + ":" + minute;
                            }
                        })
                        .setNegativeButton("One way", new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int whichButton) {
                                dialog.dismiss();
                            }
                        }).create().show();
                        //Time picker
                    }
                }
            )
            .setNegativeButton("One way", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int whichButton) {
                    dialog.dismiss();
                }
            })
            .create().show();

        return "hello "+ str ;
    }

我使用上述 class 的代码是:

DateTimePicker obj = new DateTimePicker();
Log.e("Object", "Created");
String st = obj.returnDate(this.getActivity());
Log.e("Function", "Called");
System.out.println("Value returned :" + st);
leaving.setText(st);

在日志中我得到“hello null”一旦我调用该函数它甚至不等待用户输入就打印evething。 请帮忙谢谢

如果您调用 show(),代码将不会停止并等待用户输入。尝试添加:

[...]
}).create().show();
Log.i("Dialog", "Show called");

了解发生了什么。

如果您想使用对话框中的输入数据,您必须从肯定按钮侦听器中调用一个函数:

.setPositiveButton("OK",
new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int whichButton) {
        int hour=picker.getCurrentHour();
        int minute=picker.getCurrentMinute();

        sendToSomewhere("+hour+":"+minute");
    }
})

您总是会 "hello null" 返回,因为该对话框在内部创建了一个新线程,并且该对话框的答案仅在相应的按钮点击侦听器中可用。

你可以做的是给创建对话框的函数一个callback方法,一旦你在对话框中有了答案就调用这个方法。

有关如何将函数作为参数传递的实施详细信息,请参阅 Java Pass Method as Parameter

编辑

转念一想,将 onClickListeners 作为对话函数的参数发送要优雅得多。

您可以为流程中的所有最后三个按钮定义 onclick,例如

DialogInterface.OnClickListener
     yesButton = new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int whichButton) {
                    int hour = picker.getCurrentHour();
                    int minute = picker.getCurrentMinute();
                    str = s + " " + hour + ":" + minute;
                     SomeFunction();
            }
        });

并将这些对象中的 3 个传递给你的对话框函数,它需要一个像

这样的函数头
public void returnDate(final Context ctx, OnClickListener yes, OnClickListener no1, OnClickListener no2) {

基本上你应该定义返回void的方法。要接受用户输入的字符串,可以使用 callback.

  • 获取 OnUserInputListener 作为构造函数参数(尽管您可以通过其他方式获取)
  • 定义接口在DateTimePickerclass.

您的 DateTimePicker class 将如下所示:

public class DateTimePicker {
    private final OnUserInputListener onUserInputListener;

    // String str; <-- this field value has no use

    DateTimePicker(OnUserInputListener onUserInputListener) {
        this.onUserInputListener = onUserInputListener;
    }

    public void returnDate(final Context ctx) {

        ...

        public void onClick(DialogInterface dialog, int whichButton) {
            int hour = picker.getCurrentHour();
            int minute = picker.getCurrentMinute();
            str = s + " " + hour + ":" + minute;
            onUserInputListener.onUserInput(str); // CALL BACK!!!
        }

        ...

    }

    public interface OnUserInputListener {
        void onUserInput(String string);
    }
}

对于调用方class,它应该实现OnUserInputListener。

public class MainActivity extends Activity implements OnUserInputListener {

    ...

    DateTimePicker obj = new DateTimePicker(this);
    obj.returnDate(this.getActivity());

    ...

    @override
    public void onUserInput(String string) {
        System.out.println("Value returned :" + string);
        leaving.setText(string);
    }
}

这可能对你有帮助!

public class DatePickerFragment extends DialogFragment implements
        DatePickerDialog.OnDateSetListener {
    TextView textView, tv;

    public DatePickerFragment(TextView textView, TextView text) {
        this.textView = textView;
        tv = text;
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        // Use the current date as the default date in the picker
        final Calendar c = Calendar.getInstance();
        int year = c.get(Calendar.YEAR);
        int month = c.get(Calendar.MONTH);
        int day = c.get(Calendar.DAY_OF_MONTH);
        return new DatePickerDialog(getActivity(), this, year, month, day);
    }

    public void onDateSet(DatePicker view, int year, int month, int day) {
        mCalendar.set(Calendar.YEAR, year);
        mCalendar.set(Calendar.MONTH, month);
        mCalendar.set(Calendar.DAY_OF_MONTH, day);
        SimpleDateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT);
        String dateForButton = dateFormat.format(mCalendar.getTime());
        textView.setText(dateForButton);
        tv.setVisibility(View.VISIBLE);
    }
}

并用于显示对话框

dateFragment = new DatePickerFragment(toDate, tvTo);
dateFragment.show(getFragmentManager(), "Dialog Title");

可以在activity/自定义class

中使用

尝试在 DateTimePicker 中添加自定义日期选择监听器:

public interface OnDateSelectedListener{
  public void onDateSelected(String date);
}

在 DateTimePicker 中添加自定义接口并设置监听器引用 returnDate :

public class DateTimePicker {

    public void returnDate(final Context ctx, final OnDateSelectedListener onDateSelectedListener) {
        AlertDialog.Builder builder1 = new AlertDialog.Builder(ctx);
        final DatePicker picker1 = new DatePicker(ctx);

        try {
            Field f[] = picker1.getClass().getDeclaredFields();
            for (Field field : f) {
                if (field.getName().equals("mYearPicker") || field.getName().equals("mYearSpinner")) {
                    field.setAccessible(true);
                    Object yearPicker = new Object();
                    yearPicker = field.get(picker1);
                    ((View) yearPicker).setVisibility(View.GONE);
                }
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        picker1.setCalendarViewShown(false);

        builder1.setTitle("Please select date on which you would be leaving :")
                .setView(picker1)
                .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int whichButton) {
                                SimpleDateFormat parseFormat = new SimpleDateFormat("EEE dd MMM");
                                Date date1 = new Date();
                                date1.setDate(picker1.getDayOfMonth());
                                date1.setMonth(picker1.getMonth());
                                final String s = parseFormat.format(date1);
                                Log.e("DATE", s);

                                //Time picker
                                AlertDialog.Builder builder = new AlertDialog.Builder(ctx);
                                final TimePicker picker = new TimePicker(ctx);
                                picker.setIs24HourView(true);
                                builder.setTitle("Please select time at which you would be leaving :")
                                        .setView(picker)
                                        .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                                            public void onClick(DialogInterface dialog, int whichButton) {
                                                int hour = picker.getCurrentHour();
                                                int minute = picker.getCurrentMinute();
                                                onDateSelectedListener.onDateSelected(s + " " + hour + ":" + minute);
                                            }
                                        })
                                        .setNegativeButton("One way", new DialogInterface.OnClickListener() {
                                            public void onClick(DialogInterface dialog, int whichButton) {
                                                dialog.dismiss();
                                            }
                                        }).create().show();
                            }
                        }
                )
                .setNegativeButton("One way", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                        dialog.dismiss();
                    }
                })
                .create().show();
    }

    public interface OnDateSelectedListener{
        public void onDateSelected(String date);
    }

}

现在使用 OnDateSelectedListener 引用调用 DateTimePicker :

DateTimePicker dateTimePicker = new DateTimePicker();
dateTimePicker.returnDate(this.getActivity(), new DateTimePicker.OnDateSelectedListener() {
   @Override
   public void onDateSelected(String date) {
      leaving.setText(st);
   }
});