package net.coding.program.common;
import android.app.Activity;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.view.ContextThemeWrapper;
import android.view.View;
import android.widget.DatePicker;
import android.widget.LinearLayout;
import android.widget.NumberPicker;
import net.coding.program.R;
import java.text.SimpleDateFormat;
import java.util.Calendar;
/**
* Created by chaochen on 14/12/23.
* 日期选择
*/
public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener {
public static final String PARAM_MAX_TODYA = "PARAM_MAX_TODYA";
public static final String PARAM_DATA = "date";
// SetTimeType mTimeType = SetTimeType.Cancel;
// 小米手机不管按那个按钮都会调用 onDataSet,只好在click事件里面做标记
// enum SetTimeType {
// Cancel, Set, Clear;
// };
private DateSet mDateSet;
@Override
public void onAttach(Activity activity) {
if (activity instanceof DateSet) {
mDateSet = (DateSet) activity;
}
super.onAttach(activity);
}
private static boolean isBrokenSamsungDevice() {
return (Build.MANUFACTURER.equalsIgnoreCase("samsung")
&& isBetweenAndroidVersions(
Build.VERSION_CODES.LOLLIPOP,
Build.VERSION_CODES.LOLLIPOP_MR1));
}
private static boolean isBetweenAndroidVersions(int min, int max) {
return Build.VERSION.SDK_INT >= min && Build.VERSION.SDK_INT <= max;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
String dateString = getArguments().getString(PARAM_DATA);
if (dateString.isEmpty()) {
dateString = new SimpleDateFormat("yyyy-MM-dd")
.format(Calendar.getInstance().getTimeInMillis());
}
boolean maxToday = getArguments().getBoolean(PARAM_MAX_TODYA, false);
String[] date = dateString.split("-");
int year = Integer.valueOf(date[0]);
int month = Integer.valueOf(date[1]) - 1;
int day = Integer.valueOf(date[2]);
Context context = getActivity();
if (isBrokenSamsungDevice()) {
context = new ContextThemeWrapper(getActivity(), android.R.style.Theme_Holo_Light_Dialog);
}
final DatePickerDialog datePickerDialog = new DatePickerDialog(context, this, year, month, day);
if (maxToday) {
datePickerDialog.getDatePicker().setMaxDate(Calendar.getInstance().getTimeInMillis());
}
if (getArguments().getBoolean("clear", false)) {
datePickerDialog.setButton(DialogInterface.BUTTON_NEUTRAL, "清除", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
mDateSet.dateSetResult("", true);
dialog.cancel();
}
});
}
datePickerDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
datePickerDialog.setButton(DialogInterface.BUTTON_POSITIVE, "确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
DatePicker datePicker = datePickerDialog.getDatePicker();
dateSet(datePicker.getYear(), datePicker.getMonth(), datePicker.getDayOfMonth());
dialog.cancel();
}
});
LinearLayout layoutParent = (LinearLayout) datePickerDialog.getDatePicker().getChildAt(0);
LinearLayout layout = (LinearLayout) layoutParent.getChildAt(0);
for (int i = 0; i < layout.getChildCount(); i++) {
View v = layout.getChildAt(i);
if (v instanceof NumberPicker) {
setNumberPicker((NumberPicker) v);
}
}
return datePickerDialog;
}
// 用来取代onDateSet
private void dateSet(int year, int monthOfYear, int dayOfMonth) {
final Calendar c = Calendar.getInstance();
c.set(year, monthOfYear, dayOfMonth);
if (mDateSet != null) {
mDateSet.dateSetResult(Global.dayFromTime(c.getTimeInMillis()), false);
}
}
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
// 因为小米手机一定会调这个接口,即使选择了取消,干脆不用这个接口算了
}
public void setNumberPicker(NumberPicker spindle) {
java.lang.reflect.Field[] pickerFields = NumberPicker.class
.getDeclaredFields();
for (java.lang.reflect.Field pf : pickerFields) {
if (pf.getName().equals("mSelectionDivider")) {
pf.setAccessible(true);
try {
pf.set(spindle, getResources().getDrawable(R.drawable.line_green));
} catch (Exception e) {
Global.errorLog(e);
}
break;
}
}
}
public interface DateSet {
void dateSetResult(String date, boolean clear);
}
}