使用单个侦听器多次调用 DatePicker
Calling DatePicker multiple times using single listener
我有相同格式的日期和时间字段。所以我需要为这些字段提供四个日期和时间选择器。目前我能够得到它,但是所有字段都显示相同的时间和日期,并且当我 select 来自第一个选择器的时间和日期时,所有字段都被设置。
我使用了几种方法,一些方法正在检查每个字段的视图 ID、将 ID 提供给对话框以及在 onCreateDialog 方法中使用 switch 等。但对我来说没有任何效果。请建议我如何实现这一目标。
我的 DatePicker 代码:
public void showDatePicker() {
DatePickerFragment date1 = new DatePickerFragment();
/**
* Set Up Current Date Into dialog
*/
Calendar calender = Calendar.getInstance();
Bundle args = new Bundle();
args.putInt("year", calender.get(Calendar.YEAR));
args.putInt("month", calender.get(Calendar.MONTH));
args.putInt("day", calender.get(Calendar.DAY_OF_MONTH));
date1.setArguments(args);
/**
* Set Call back to capture selected date
*/
date1.setCallBack(ondate);
date1.show(getSupportFragmentManager(), "Date Picker");
}
DatePickerDialog.OnDateSetListener ondate = new DatePickerDialog.OnDateSetListener() {
public void onDateSet(DatePicker view, int year, int monthOfYear,
int dayOfMonth) {
date.setText(String.valueOf(dayOfMonth) + "-" + String.valueOf(monthOfYear + 1)
+ "-" + String.valueOf(year));
dateValue = date.getText().toString();
est_compDate.setText(String.valueOf(dayOfMonth) + "-" + String.valueOf(monthOfYear + 1)
+ "-" + String.valueOf(year));
estValue = est_compDate.getText().toString();
act_compDate.setText(String.valueOf(dayOfMonth) + "-" + String.valueOf(monthOfYear + 1)
+ "-" + String.valueOf(year));
actValue = act_compDate.getText().toString();
notify_date.setText(String.valueOf(dayOfMonth) + "-" + String.valueOf(monthOfYear + 1)
+ "-" + String.valueOf(year));
notifyValue = notify_date.getText().toString();
}
};
我的 DatePickerFragment 代码:
public class DatePickerFragment extends DialogFragment {
DatePickerDialog.OnDateSetListener ondateSet;
public DatePickerFragment() {
}
public void setCallBack(DatePickerDialog.OnDateSetListener ondate) {
ondateSet = ondate;
}
private int year, month, day;
@Override
public void setArguments(Bundle args) {
super.setArguments(args);
year = args.getInt("year");
month = args.getInt("month");
day = args.getInt("day");
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
return new DatePickerDialog(getActivity(), ondateSet, year, month, day);
}
}
所以当我 select date.setText 行的时间和日期选择器时,所有其他三个都同时设置。
我正在使用 onClick 方法调用选取器方法:
public void datePicker(View view) {
showDatePicker();
}
请告诉我可以做什么。如果您需要更多信息,请告诉我。提前致谢。
更新:
在你的 DialogFragment 中创建一个接口,并在其中放置一个抽象方法,它将你的日期保存在它的参数中的字符串中。然后在您的主 activity 中实现此接口并在您的 activity 中覆盖 DateInString(String) 方法,这将在您的 activity.then 中为您提供选定的日期,您可以将其显示在您想要的位置。
我正在向您展示一个工作代码,其中我必须在两个地方设置日期,您可以通过修改 activity...
中的 DateInString(String) 覆盖方法多次使用它
对话框片段:
public class Date extends android.support.v4.app.DialogFragment implements DatePickerDialog.OnDateSetListener {
DatePickerData datePickerData ;
String date = null;
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Calendar cal = Calendar.getInstance();
int year = cal.get(Calendar.YEAR);
byte month = (byte)cal.get(Calendar.MONTH);
byte day = (byte ) cal.get(Calendar.DAY_OF_MONTH);
return new DatePickerDialog(getActivity(),this,year,month,day);
}
@Override
public void onDateSet(DatePicker datePicker, int selectedYear, int selectedMonth, int selectedDay) {
Calendar cal = Calendar.getInstance();
cal.set(selectedYear,selectedMonth,selectedDay);
SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
date = dateFormat.format(cal.getTime());
passDate(date);
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
datePickerData = (DatePickerData)activity;
}
public void passDate(String date){
datePickerData.DateInString(date);
public interface DatePickerData{
public void DateInString(String date);
}
}
和你的Activity:
public class ActMarkAttendance extends FragmentActivity implements Date.DatePickerData{
private boolean isStartDate = false;
private TextView startDateTextView;
private TextView endDateTextView;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_act_view_attendance);
startDateTextView = (TextView) findViewById(R.id.startDateTextView_attView);
endDateTextView = (TextView) findViewById(R.id.endDateTextView_attView);
startDateTextView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
isStartDate = true;
showDateFragment();
}
});
endDateTextView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
isStartDate = false;
showDateFragment();
}
});
}
private void showDateFragment(){
Date dateFragment = new Date();
dateFragment.show(fm,General.NOTHING);
}
@Override
public void DateInString(String date) {
if (isStartDate)
startDateViewer.setText(date);
else
endDateViewer.setText(date);
}
}
我有相同格式的日期和时间字段。所以我需要为这些字段提供四个日期和时间选择器。目前我能够得到它,但是所有字段都显示相同的时间和日期,并且当我 select 来自第一个选择器的时间和日期时,所有字段都被设置。
我使用了几种方法,一些方法正在检查每个字段的视图 ID、将 ID 提供给对话框以及在 onCreateDialog 方法中使用 switch 等。但对我来说没有任何效果。请建议我如何实现这一目标。
我的 DatePicker 代码:
public void showDatePicker() {
DatePickerFragment date1 = new DatePickerFragment();
/**
* Set Up Current Date Into dialog
*/
Calendar calender = Calendar.getInstance();
Bundle args = new Bundle();
args.putInt("year", calender.get(Calendar.YEAR));
args.putInt("month", calender.get(Calendar.MONTH));
args.putInt("day", calender.get(Calendar.DAY_OF_MONTH));
date1.setArguments(args);
/**
* Set Call back to capture selected date
*/
date1.setCallBack(ondate);
date1.show(getSupportFragmentManager(), "Date Picker");
}
DatePickerDialog.OnDateSetListener ondate = new DatePickerDialog.OnDateSetListener() {
public void onDateSet(DatePicker view, int year, int monthOfYear,
int dayOfMonth) {
date.setText(String.valueOf(dayOfMonth) + "-" + String.valueOf(monthOfYear + 1)
+ "-" + String.valueOf(year));
dateValue = date.getText().toString();
est_compDate.setText(String.valueOf(dayOfMonth) + "-" + String.valueOf(monthOfYear + 1)
+ "-" + String.valueOf(year));
estValue = est_compDate.getText().toString();
act_compDate.setText(String.valueOf(dayOfMonth) + "-" + String.valueOf(monthOfYear + 1)
+ "-" + String.valueOf(year));
actValue = act_compDate.getText().toString();
notify_date.setText(String.valueOf(dayOfMonth) + "-" + String.valueOf(monthOfYear + 1)
+ "-" + String.valueOf(year));
notifyValue = notify_date.getText().toString();
}
};
我的 DatePickerFragment 代码:
public class DatePickerFragment extends DialogFragment {
DatePickerDialog.OnDateSetListener ondateSet;
public DatePickerFragment() {
}
public void setCallBack(DatePickerDialog.OnDateSetListener ondate) {
ondateSet = ondate;
}
private int year, month, day;
@Override
public void setArguments(Bundle args) {
super.setArguments(args);
year = args.getInt("year");
month = args.getInt("month");
day = args.getInt("day");
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
return new DatePickerDialog(getActivity(), ondateSet, year, month, day);
}
}
所以当我 select date.setText 行的时间和日期选择器时,所有其他三个都同时设置。
我正在使用 onClick 方法调用选取器方法:
public void datePicker(View view) {
showDatePicker();
}
请告诉我可以做什么。如果您需要更多信息,请告诉我。提前致谢。
更新: 在你的 DialogFragment 中创建一个接口,并在其中放置一个抽象方法,它将你的日期保存在它的参数中的字符串中。然后在您的主 activity 中实现此接口并在您的 activity 中覆盖 DateInString(String) 方法,这将在您的 activity.then 中为您提供选定的日期,您可以将其显示在您想要的位置。 我正在向您展示一个工作代码,其中我必须在两个地方设置日期,您可以通过修改 activity...
中的 DateInString(String) 覆盖方法多次使用它对话框片段:
public class Date extends android.support.v4.app.DialogFragment implements DatePickerDialog.OnDateSetListener {
DatePickerData datePickerData ;
String date = null;
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Calendar cal = Calendar.getInstance();
int year = cal.get(Calendar.YEAR);
byte month = (byte)cal.get(Calendar.MONTH);
byte day = (byte ) cal.get(Calendar.DAY_OF_MONTH);
return new DatePickerDialog(getActivity(),this,year,month,day);
}
@Override
public void onDateSet(DatePicker datePicker, int selectedYear, int selectedMonth, int selectedDay) {
Calendar cal = Calendar.getInstance();
cal.set(selectedYear,selectedMonth,selectedDay);
SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
date = dateFormat.format(cal.getTime());
passDate(date);
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
datePickerData = (DatePickerData)activity;
}
public void passDate(String date){
datePickerData.DateInString(date);
public interface DatePickerData{
public void DateInString(String date);
}
}
和你的Activity:
public class ActMarkAttendance extends FragmentActivity implements Date.DatePickerData{
private boolean isStartDate = false;
private TextView startDateTextView;
private TextView endDateTextView;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_act_view_attendance);
startDateTextView = (TextView) findViewById(R.id.startDateTextView_attView);
endDateTextView = (TextView) findViewById(R.id.endDateTextView_attView);
startDateTextView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
isStartDate = true;
showDateFragment();
}
});
endDateTextView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
isStartDate = false;
showDateFragment();
}
});
}
private void showDateFragment(){
Date dateFragment = new Date();
dateFragment.show(fm,General.NOTHING);
}
@Override
public void DateInString(String date) {
if (isStartDate)
startDateViewer.setText(date);
else
endDateViewer.setText(date);
}
}