我有两个Dialog Picker:Check in and Check Out。但是我希望在点击Check In中的日期后,它会在此之前禁用日期。因此,当我在Checkout上点击2019年3月6日时,它应该是2019年3月7日,依此类推。
签入和签出图像
date picker fragment.Java:
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
Calendar c = Calendar.getInstance();
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH);
int day = c.get(Calendar.DAY_OF_MONTH);
DatePickerDialog dialog = new DatePickerDialog(getContext(), (DatePickerDialog.OnDateSetListener)getActivity(), year, month, day);
dialog.getDatePicker().setMinDate(System.currentTimeMillis()-1000);
return dialog;
}
details.Java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_details);
final DialogFragment datePicker = new DatePickerFragment();
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
datePicker.show(getSupportFragmentManager(),"Date Picker");
startDateOrEndDate = true ;
}
});
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
datePicker.show(getSupportFragmentManager(),"Date Picker");
startDateOrEndDate = false ;
}
});
}
public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
Calendar c = Calendar.getInstance();
c.set(Calendar.YEAR, year );
c.set(Calendar.MONTH, month);
c.set(Calendar.DAY_OF_MONTH, dayOfMonth);
String date = DateFormat.getDateInstance(DateFormat.FULL).format(c.getTime());
TextView textView = (TextView) findViewById(R.id.checkInTV);
TextView textView2 = (TextView) findViewById(R.id.checkOutTV);
if (startDateOrEndDate) {
textView.setText(date);
} else {
textView2.setText(date);
}
}
您可以复制粘贴以下代码,然后添加您的代码。
MainActivity
public class MainActivity extends AppCompatActivity implements
DatePickerDialog.OnDateSetListener{
final long[]l = new long[1];
boolean startDateOrEndDate;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button en = findViewById(R.id.entry);
Button ex = findViewById(R.id.exit);
final myDatepickerFragment datePicker = new myDatepickerFragment();
en.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
l[0]= System.currentTimeMillis();
datePicker.show(getSupportFragmentManager(),l[0]+"");
startDateOrEndDate = true ;
}
});
ex.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
datePicker.show(getSupportFragmentManager(),l[0]+"");
startDateOrEndDate = false ;
}
});
}
@Override
public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
Calendar c = Calendar.getInstance();
c.set(Calendar.YEAR, year);
c.set(Calendar.MONTH, month);
c.set(Calendar.DAY_OF_MONTH, dayOfMonth);
l[0]= c.getTimeInMillis()+24*60*60*1000;
String date = DateFormat.getDateInstance(DateFormat.FULL).format(c.getTime());
System.out.println(date);
TextView textView = (TextView) findViewById(R.id.checkInTV);
TextView textView2 = (TextView) findViewById(R.id.checkOutTV);
if (startDateOrEndDate) {
textView.setText(date);
} else {
textView2.setText(date);
}
}
}
Fragment类
public class myDatepickerFragment extends DialogFragment {
private String tag;
@Override
public void show(FragmentManager manager, String tag) {
super.show(manager, tag);
this.tag = tag;
}
@NonNull
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
Calendar c = Calendar.getInstance();
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH);
int day = c.get(Calendar.DAY_OF_MONTH);
long l = Long.parseLong(tag);
DatePickerDialog dialog = new DatePickerDialog(getContext(), (DatePickerDialog.OnDateSetListener)getActivity(), year, month, day);
dialog.getDatePicker().setMinDate(l-1000);
dialog.getDatePicker().setBackgroundColor(Color.rgb(50,100,100));
return dialog;
} }
我之前开始尝试使用“tag”属性;可能没有正确的字帖风格,但它符合我的目的。
顺便说一下,你似乎在(主)活动中实现了监听器,但我没有看到“@override”。你能解释一下吗?
我相信您正在寻找的是重新设计日期选择器代码,以便在创建时可以设置setMinDate()
,以便您可以传递最小日期。现在你正在设置最小日期:
dialog.getDatePicker().setMinDate(System.currentTimeMillis() - 1000);
这适用于第一个日期选择器,因为今天给出的最小日期是,但是对于第二个日期选择器,您希望在第一个日期作为最小日期传递。
在创建日期选择器片段方面,我不知道您的其他代码是什么样的,但假设您正在使用片段,则可以在创建片段时将最小日期放在参数包中。以下是在创建片段时如何传递最小日期的示例:
// This would be the start date the user had previously chosen
long startDate = 0L
Bundle bundle = new Bundle();
// We only want to put in the min date if this is the second date
if (!startDateOrEndDate) {
bundle.putLong("minDate", startDate);
}
// Create the Fragment, set the bundle as its arguments
DatePickerFragment fragment = new DatePickerFragment();
fragment.setArguments(bundle);
然后,在DatePickerFragment
中,您将相应地设置最小日期:
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
// Dialog Creation code here
// Default the min date to today
long minDate = System.currentTimeMillis() - 1000;
// Check if there are arguments
Bundle args = getArguments();
if (args != null) {
// If there are args, grab the min date from it (default to today just in case)
minDate = args.getLong("minDate", minDate);
}
dialog.getDatePicker().setMinDate(minDate);
return dialog;
}
有几点需要考虑:
(startDate + 1 day)
而不是startDate
,因此在传递minDate
时需要考虑到这一点。总的来说,这应该让您了解如何继续。
旁注:我建议将布尔值重命名为明文,例如isStartDate
。这样,如果它是真的,你知道它是开始日期,反之亦然。 startDateOrEndDate
没有告诉我们它是哪一个,如果它是真的,它只是告诉我们它是开始日期还是结束日期。
编辑 - 2019年3月11日
鉴于您的新代码,您可以使用我上面所述的方式更改它
details.Java
private long startDate = -1L;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_details);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
DialogFragment datePicker = new DatePickerFragment();
datePicker.show(getSupportFragmentManager(),"Date Picker");
startDateOrEndDate = true ;
}
});
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (startDate == -1L) {
// Start date hasn't been chosen yet, tell user to do so
Toast.makeText(Details.this, "Please choose start date", Toast.LENGTH_SHORT).show();
return;
}
// Add the start date to the bundle
Bundle bundle = new Bundle();
bundle.putLong("minDate", startDate);
// Create the Fragment, set the bundle as its arguments
DatePickerFragment datePicker = new DatePickerFragment();
datePicker.setArguments(bundle);
datePicker.show(getSupportFragmentManager(),"Date Picker");
startDateOrEndDate = false ;
}
});
}
public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
Calendar c = Calendar.getInstance();
c.set(Calendar.YEAR, year );
c.set(Calendar.MONTH, month);
c.set(Calendar.DAY_OF_MONTH, dayOfMonth);
String date = DateFormat.getDateInstance(DateFormat.FULL).format(c.getTime());
TextView textView = (TextView) findViewById(R.id.checkInTV);
TextView textView2 = (TextView) findViewById(R.id.checkOutTV);
if (startDateOrEndDate) {
// If this is the start date, save it to the instance variable above
startDate = c.getTimeinMillis();
textView.setText(date);
} else {
textView2.setText(date);
}
}
在onCreateDialog()
的DatePickerFragment
中使用上面原始答案中的代码。
如果这有意义,请告诉我!