2016-05-09 7 views
0

私は開始時刻と終了時刻を取得する必要があるため、私は2つのDatePickerFragmentを持っています。私はほぼ同じ2つの方法を持っていますが、それらをリファクタリングする方法はありますか?

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を実行する必要がありますが、別のボタンが2つあるため、別のコールバックを設定する別の方法が必要です。私は非常にドライではないので、この繰り返しを避けたい。

これを修正するにはどうすればよいですか?

+0

両方の機能は同じですか? – RScottCarson

+0

オンデートのものは開始時間マークを設定し、ondateSecondは終了マークを設定するだけなので、一定の時間があります。そう、はい、彼らは他のバールを除いて同じです。 – HappyR

答えて

0

技術的には、異なるヴァールを設定しているため、機能が異なりすぎて繰り返しすぎていません。複製されたコードを凝縮する1つの方法は、別の方法に移動することです。これを試してください:

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

(私が知っていると私はこれを削除しますされていない場合)、私はこれを正しく理解していれば、あなたはこの

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()関数自体を無効にすることができますについては

関連する問題