[英]I have two methods which are nearly the same, how to refactor them?
我有兩個DatePickerFragment
因為我需要選擇開始時間和結束時間。
private void showDatePickerTimePeriodStart() {
final DatePickerFragment date = new DatePickerFragment();
// Sets up the current date in Dialog.
final Calendar calender = Calendar.getInstance();
final 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));
date.setArguments(args);
// Sets callback to the captured data.
date.setCallBack(ondate);
date.show(getFragmentManager(), "Date Picker");
}
OnDateSetListener ondate = new OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
final Calendar calendar = Calendar.getInstance();
calendar.clear();
calendar.set(year, monthOfYear, dayOfMonth);
millisSinceEpochStart = calendar.getTimeInMillis();
}
};
private void showDatePickerTimePeriodEnd() {
final DatePickerFragment date = new DatePickerFragment();
// Sets up the current date in Dialog.
final Calendar calender = Calendar.getInstance();
final 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));
date.setArguments(args);
/**
* Set Call back to capture selected date
*/
date.setCallBack(ondateSecond);
date.show(getFragmentManager(), "Date Picker");
}
OnDateSetListener ondateSecond = new OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
final Calendar calendar = Calendar.getInstance();
calendar.clear();
calendar.set(year, monthOfYear, dayOfMonth);
millisSinceEpochEnd = calendar.getTimeInMillis();
}
};
片段:
public class DatePickerFragment extends DialogFragment {
OnDateSetListener ondateSet;
public DatePickerFragment() {}
public void setCallBack(OnDateSetListener ondate) {
ondateSet = ondate;
}
private int year;
private int month;
private int 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);
}
}
還有一個片段,也是一樣。
在我看來,如果我設置了第一個Date,則需要執行setCallBack
,但是我有兩個單獨的按鈕,所以據我所知,我需要另一個方法,該方法可以設置另一個回調。 我想避免這種重復,因為它不是很干。
我該如何解決?
從技術上講,由於它設置了不同的變量,因此它具有不同的功能,並且沒有進行過多的重復。 壓縮復制代碼的一種方法是將其移至另一種方法。 嘗試這個:
public long getMillis(int year, int monthOfYear, int dayOfMonth){
final Calendar calendar = Calendar.getInstance();
calendar.clear();
calendar.set(year, monthOfYear, dayOfMonth);
return calendar.getTimeInMillis();
}
然后,您可以簡單地讓您的回調調用上述方法。
OnDateSetListener ondate= new OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
millisSinceEpochStart = getMillis(year, monthOfYear, dayOfMonth);
}
};
...
OnDateSetListener ondateSecond = new OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
millisSinceEpochEnd = getMillis(year, monthOfYear, dayOfMonth);
}
};
如果我正確理解了這一點(如果不告訴我,我將刪除它),則可以執行以下操作
public class DatePickerFragment extends DialogFragment{
// What you already have
...
// Show the date time picker on click
// (assuming the click listener is already setup)
public void showDateTimePicker(){
final DatePickerFragment date = new DatePickerFragment();
// Sets up the current date in Dialog.
final Calendar calender = Calendar.getInstance();
final 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));
date.setArguments(args);
/**
* Set Call back to capture selected date
*/
date.setCallBack(getCallback());
date.show(getFragmentManager(), "Date Picker");
}
public OnDateSetListener getCallback(){
return new OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
final Calendar calendar = Calendar.getInstance();
calendar.clear();
calendar.set(year, monthOfYear, dayOfMonth);
setTime(calendar.getTimeInMillis());
}
};
}
public void setTime(long timeInMillis){
// Override this method and do what you want with the millis
}
}
然后,在DatePickerFragment中要做的就是重寫setTime(long timeInMillis)並使用該值做您想做的事情。
例如
public class StartDatePickerFragment extends DatePickerFragment{
@Override
public void setTime(long timeInMillis){
millisSinceEpochStart = timeInMillis;
// Do whatever else you want in the override call
...
}
// Do whatever else you want outside of the method
...
}
如果您不想使用默認的偵聽器,也可以覆蓋getCallback()函數本身。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.