如何在函数内的另一个 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 作为构造函数参数(尽管您可以通过其他方式获取)
- 定义接口在
DateTimePicker
class.
您的 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);
}
});
伙计们,我已经在我的应用程序中创建了一个自定义 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 作为构造函数参数(尽管您可以通过其他方式获取)
- 定义接口在
DateTimePicker
class.
您的 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);
}
});