java - 我有两个几乎相同的方法,如何重构它们?

标签 java android android-fragments dry

我有两个 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();
    }
};

fragment :

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);
    }
}

还有一个Fragment,也是一样的。

所以在我看来,如果我设置第一个日期,我需要执行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);
    }
};

关于java - 我有两个几乎相同的方法,如何重构它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37124323/

相关文章:

java - 如何在 Java 中创建一个用于创建文本字段的 GUI 按钮?

java - 使用泛型在 Java 中实现 B 树

c# - 如何从代码 Xamarin 将 TextView 添加到 StackView?

android - 在android中保持ActionBar图标的按下状态

android - Fragment 中 onCreateView 和 onViewCreated 的区别

java - 如何从表单检索 jsp web 项目中的 json obj 值

java - 需要带有 Spring-data-MongoDB 的 mongo-java-driver

android - ViewModel体系结构困境

javascript - 是否可以在我的服务器上为我的网站禁用 JS

android - 执行脚本IntrinsicYuvToRgb