- 实现功能:
选择今天之后的日期,并展示年、月、日。 -
效果图
实现步骤:
1、首先我们要导入LoopView和ButterKnife第三方框架。
//滚轮
implementation 'com.weigan:loopView:0.1.2'
//ButterKnife
compile 'com.jakewharton:butterknife:8.5.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.5.1'
2、在xml实现页面布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/cFFFFFF"
android:orientation="vertical">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="@dimen/d44"
android:layout_marginTop="@dimen/d8">
<TextView
android:id="@+id/tvCancel"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_alignParentLeft="true"
android:layout_marginLeft="@dimen/d10"
android:paddingLeft="@dimen/d5"
android:paddingRight="@dimen/d15"
android:background="@drawable/login_ripper"
android:gravity="center"
android:text="@string/text_cancle"
android:textColor="@color/cBBBBBB"
android:textSize="@dimen/f17" />
<TextView
android:id="@+id/tvFinish"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_alignParentRight="true"
android:layout_marginRight="@dimen/d10"
android:paddingLeft="@dimen/d15"
android:paddingRight="@dimen/d5"
android:background="@drawable/login_ripper"
android:gravity="center"
android:text="@string/text_complete"
android:textColor="@color/c4A90E2"
android:textSize="@dimen/f17" />
</RelativeLayout>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="@dimen/d177"
android:layout_marginBottom="@dimen/d20"
android:layout_marginTop="@dimen/d20">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#FFFFFF"
android:orientation="horizontal"
android:paddingBottom="5dip"
android:paddingTop="5dip">
<View
android:layout_width="@dimen/d20"
android:layout_height="match_parent" />
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1">
<com.weigan.loopview.LoopView
android:id="@+id/loopViewYear"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:awv_isLoop="false"
app:awv_centerTextColor="@color/c000000"
app:awv_outerTextColor="@color/c999999"
app:awv_textsize="22" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginLeft="40dip"
android:text="年"
android:textColor="@color/c000000"
android:textSize="@dimen/f22" />
</FrameLayout>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1">
<com.weigan.loopview.LoopView
android:id="@+id/loopViewMonth"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:awv_isLoop="false"
app:awv_centerTextColor="@color/c000000"
app:awv_outerTextColor="@color/c999999"
app:awv_textsize="22" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginLeft="40dip"
android:text="月"
android:textColor="@color/c000000"
android:textSize="@dimen/f22" />
</FrameLayout>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1">
<com.weigan.loopview.LoopView
android:id="@+id/loopViewDay"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:awv_isLoop="false"
app:awv_centerTextColor="@color/c000000"
app:awv_outerTextColor="@color/c999999"
app:awv_textsize="22" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical|right"
android:layout_marginRight="15dip"
android:textColor="@color/c000000"
android:textSize="@dimen/f22"
android:text="日" />
</FrameLayout>
<View
android:layout_width="@dimen/d20"
android:layout_height="match_parent" />
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="@dimen/d1"
android:layout_gravity="center_vertical"
android:layout_marginBottom="@dimen/d16"
android:background="@color/c40CDCDCD" />
<View
android:layout_width="match_parent"
android:layout_height="@dimen/d1"
android:layout_gravity="center_vertical"
android:layout_marginTop="@dimen/d16"
android:background="@color/c40CDCDCD" />
</FrameLayout>
</LinearLayout>
3、代码分析
- 设置当前年份对应的月份里的天数,其中我们要考虑瑞年和平年,以及那个月份。代码如下:
private void setCourentDayAndMonthAndYear() {
if (NOW_MONTH == 1 || NOW_MONTH == 3 || NOW_MONTH == 5 || NOW_MONTH == 7 || NOW_MONTH == 8 ||
NOW_MONTH == 10 || NOW_MONTH == 12) {
if (NOW_DAY > 31) {
NOW_MONTH += 1;
NOW_DAY = 1;
if (NOW_MONTH > 12) {
NOW_YEAR += 1;
NOW_MONTH = 1;
}
}
} else if (NOW_MONTH == 4 || NOW_MONTH == 6 || NOW_MONTH == 9 || NOW_MONTH == 11) {
if (NOW_DAY > 30) {
NOW_MONTH += 1;
NOW_DAY = 1;
}
} else if (NOW_MONTH == 2) {
if ((NOW_YEAR % 100 == 0) && (NOW_YEAR % 400 == 0) || (NOW_YEAR % 100 != 0) && (NOW_YEAR % 4 == 0)) {
if (NOW_DAY > 29) {
NOW_MONTH += 1;
NOW_DAY = 1;
}
} else {
if (NOW_DAY > 28) {
NOW_MONTH += 1;
NOW_DAY = 1;
}
}
}
}
- 设置选中月份对应的天数
private void setDay(int index, boolean select) {
if (index == 0 || index == 2 || index == 4 || index == 6 || index == 7 || index == 9 || index == 11) {
mListDay.clear();
for (int i = 1; i < 32; i++) {
mListDay.add(getTwoPositiveInteger(i));
}
day = 31;
if (select) {
loopViewDay.setItems(mListDay.subList(NOW_DAY - 1, mListDay.size()));
} else {
loopViewDay.setItems(mListDay);
}
loopViewDay.setCurrentPosition(0);
} else if (index == 3 || index == 5 || index == 8 || index == 10) {
mListDay.clear();
for (int i = 1; i < 31; i++) {
mListDay.add(getTwoPositiveInteger(i));
}
day = 30;
if (select) {
loopViewDay.setItems(mListDay.subList(NOW_DAY - 1, mListDay.size()));
} else {
loopViewDay.setItems(mListDay);
}
loopViewDay.setCurrentPosition(0);
} else if (index == 1) {
mListDay.clear();
for (int i = 1; i < 29; i++) {
mListDay.add(getTwoPositiveInteger(i));
}
day = 28;
if (select) {
loopViewDay.setItems(mListDay.subList(NOW_DAY - 1, mListDay.size()));
} else {
loopViewDay.setItems(mListDay);
}
if (startyear == 1) {
mListDay.clear();
for (int i = 1; i < 30; i++) {
mListDay.add(getTwoPositiveInteger(i));
}
day = 29;
if (select) {
loopViewDay.setItems(mListDay.subList(NOW_DAY - 1, mListDay.size()));
} else {
loopViewDay.setItems(mListDay);
}
} else {
mListDay.clear();
for (int i = 1; i < 29; i++) {
mListDay.add(getTwoPositiveInteger(i));
}
day = 28;
if (select) {
loopViewDay.setItems(mListDay.subList(NOW_DAY - 1, mListDay.size()));
} else {
loopViewDay.setItems(mListDay);
}
}
loopViewDay.setCurrentPosition(0);
}
}
4、具体实现代码:
public class CounterLmeDateDialog extends Dialog {
@BindView(R.id.tvCancel)
TextView tvCancel;
@BindView(R.id.tvFinish)
TextView tvFinish;
@BindView(R.id.loopViewDay)
LoopView loopViewDay;
@BindView(R.id.loopViewMonth)
LoopView loopViewMonth;
@BindView(R.id.loopViewYear)
LoopView loopViewYear;
//接口相关
private OnDialogClickListener mOnDialogClickListener;// 控件点击接口
private int YEAR_CONT = 10;//年的数量
private int NOW_YEAR; //当前Year
private int NOW_MONTH = 0;//当前月份
private int NOW_DAY = 0;//当前天数
private int mSelectYear;
private int mSelectMonth;
private int mSelectDay;
private List<String> mListYear = new ArrayList<>();//开始年份数组
private List<String> mListMonth = new ArrayList<>();//开始月份数组
private List<String> mListDay = new ArrayList<>();//开始日期数组
private String mStartTime = "";//开始时间
private int startyear;
private int day;
private Long currentDate; //当前时间
private String dateIndex[];
private int mYearIndex = 0;
private int mMonthIndex = 0;
private int mDayIndex = 0;
public CounterLmeDateDialog(@NonNull Context context) {
super(context);
}
public CounterLmeDateDialog(@NonNull Context context, int themeResId, Long date) {
super(context, themeResId);
this.currentDate = date;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
View view = View.inflate(getContext(), R.layout.dialog_counter_lme_date, null);
setContentView(view);
KnifeKit.bind(this, view);
/**
* 整理时间数据
*/
Calendar c = Calendar.getInstance();
int year = c.get(Calendar.YEAR);
NOW_YEAR = year;
NOW_MONTH = c.get(Calendar.MONTH) + 1;
NOW_DAY = c.get(Calendar.DAY_OF_MONTH) + 1;
setCourentDayAndMonthAndYear();
for (int i = 0; i < YEAR_CONT; i++) {
mListYear.add((year + i) + "");
}
for (int i = 1; i < 13; i++) {
mListMonth.add(getTwoPositiveInteger(i));
}
for (int i = 1; i < 32; i++) {
mListDay.add(getTwoPositiveInteger(i));
}
loopViewDay.setDividerColor(getContext().getResources().getColor(R.color.c00000000));
loopViewMonth.setDividerColor(getContext().getResources().getColor(R.color.c00000000));
loopViewYear.setDividerColor(getContext().getResources().getColor(R.color.c00000000));
String callBackData = stampToDate(currentDate);
dateIndex = callBackData.split("-");
//设置齿轮时间
loopViewYear.setItems(mListYear);
if ((NOW_YEAR + "").equals(dateIndex[0])) {
loopViewMonth.setItems(mListMonth.subList(NOW_MONTH - 1, mListMonth.size()));
if (NOW_MONTH == Integer.valueOf(dateIndex[1])) {
setDay(NOW_MONTH - 1, true);
} else {
setDay(NOW_MONTH - 1, false);
}
} else {
loopViewMonth.setItems(mListMonth);
setDay(NOW_MONTH - 1, false);
}
//把时间转成时间戳
Log.i("---> : ", DateUtil.getStringDateByLong(currentDate, 4));
if (currentDate != 0) {
if ((NOW_YEAR + "").equals(mListYear.get(0))) {
for (int i = 0; i < mListYear.size(); i++) {
if (dateIndex[0].equals(mListYear.get(i))) {
mSelectYear = Integer.valueOf(dateIndex[0]);
loopViewYear.setCurrentPosition(i);
}
}
String month = dateIndex[1];
int countMonth = Integer.parseInt(month);
if (dateIndex[0].equals(NOW_YEAR+ "")) {
List<String> monthLists = mListMonth.subList(NOW_MONTH - 1, mListMonth.size());
for (int i =0; i < monthLists.size(); i++){
if (monthLists.get(i).equals(month)) {
loopViewMonth.setCurrentPosition(i);
mSelectMonth = Integer.parseInt(monthLists.get(i));
break;
}
}
} else {
loopViewMonth.setCurrentPosition(countMonth - 1);
mSelectMonth = countMonth;
}
String day = dateIndex[2];
int countDay = Integer.parseInt(day);
if (countMonth == NOW_MONTH) {
List<String> dayLists = mListDay.subList(NOW_DAY - 1, mListDay.size());
for (int i = 0; i < dayLists.size(); i ++){
if (dayLists.get(i).equals(day)){
loopViewDay.setCurrentPosition(i);
mSelectDay = Integer.parseInt(dayLists.get(i));
break;
}
}
} else {
loopViewDay.setCurrentPosition((countDay - 1));
mSelectDay = countDay;
}
mStartTime = mSelectYear + "-" + mSelectMonth + "-" + mSelectDay;
} else {
for (int i = 0; i < mListYear.size(); i++) {
if (dateIndex[0].equals(mListYear.get(i))) {
mSelectYear = Integer.valueOf(dateIndex[0]);
loopViewYear.setCurrentPosition(i);
}
}
String month = dateIndex[1];
int countMonth = Integer.parseInt(month);
mSelectMonth = countMonth;
loopViewMonth.setCurrentPosition((countMonth - 1));
String day = dateIndex[2];
int countDay = Integer.parseInt(day);
mSelectDay = countDay;
loopViewDay.setCurrentPosition((countDay - 1));
mStartTime = mSelectYear + "-" + mSelectMonth + "-" + mSelectDay;
}
} else {
loopViewDay.setCurrentPosition(0);
loopViewMonth.setCurrentPosition(0);
loopViewYear.setCurrentPosition(0);
}
initlistener();
}
//設置當前天數傢一
private void setCourentDayAndMonthAndYear() {
if (NOW_MONTH == 1 || NOW_MONTH == 3 || NOW_MONTH == 5 || NOW_MONTH == 7 || NOW_MONTH == 8 ||
NOW_MONTH == 10 || NOW_MONTH == 12) {
if (NOW_DAY > 31) {
NOW_MONTH += 1;
NOW_DAY = 1;
if (NOW_MONTH > 12) {
NOW_YEAR += 1;
NOW_MONTH = 1;
}
}
} else if (NOW_MONTH == 4 || NOW_MONTH == 6 || NOW_MONTH == 9 || NOW_MONTH == 11) {
if (NOW_DAY > 30) {
NOW_MONTH += 1;
NOW_DAY = 1;
}
} else if (NOW_MONTH == 2) {
if ((NOW_YEAR % 100 == 0) && (NOW_YEAR % 400 == 0) || (NOW_YEAR % 100 != 0) && (NOW_YEAR % 4 == 0)) {
if (NOW_DAY > 29) {
NOW_MONTH += 1;
NOW_DAY = 1;
}
} else {
if (NOW_DAY > 28) {
NOW_MONTH += 1;
NOW_DAY = 1;
}
}
}
}
private void initlistener() {
//开始年份监听
loopViewYear.setListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(int index) {
try {
int yearstart = Integer.parseInt(mListYear.get(index));
mSelectYear = yearstart;
if (mSelectYear == NOW_YEAR) {
loopViewMonth.setItems(mListMonth.subList(NOW_MONTH - 1, mListMonth.size()));
loopViewDay.setCurrentPosition(0);
loopViewMonth.setCurrentPosition(0);
if (mSelectMonth == NOW_MONTH) {
setDay(mMonthIndex, true);
} else {
setYear(yearstart, index);
}
} else {
loopViewMonth.setItems(mListMonth);
loopViewDay.setCurrentPosition(0);
loopViewMonth.setCurrentPosition(0);
setYear(yearstart, index);
}
} catch (Exception e) {
e.printStackTrace();
}
}
});
//开始月份监听
loopViewMonth.setListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(int index) {
mMonthIndex = index;
try {
if (mSelectYear == NOW_YEAR) {
mSelectMonth = Integer.parseInt(mListMonth.subList(NOW_MONTH - 1, mListMonth.size()).get(index));
loopViewDay.setCurrentPosition(0);
if (mSelectMonth == NOW_MONTH) {
setDay(index, true);
} else {
setDay(index, false);
}
} else {
mSelectMonth = Integer.parseInt(mListDay.get(index));
loopViewDay.setCurrentPosition(0);
setDay(index, false);
}
} catch (Exception e) {
e.printStackTrace();
}
}
});
//开始日期监听
loopViewDay.setListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(int index) {
}
});
}
private void setYear(int yearstart, int index) {
loopViewMonth.setCurrentPosition(0);
if (mSelectYear == NOW_YEAR) {
loopViewMonth.setItems(mListMonth.subList(NOW_MONTH - 1, mListMonth.size()));
if ((yearstart % 100 == 0) && (yearstart % 400 == 0) || (yearstart % 100 != 0) && (yearstart % 4 == 0)) {
startyear = 1;
if (mSelectMonth == NOW_MONTH) {
setDay(mMonthIndex, true);
} else {
setDay(mMonthIndex, false);
}
} else {
startyear = 0;
if (mSelectMonth == NOW_MONTH) {
setDay(mMonthIndex, true);
} else {
setDay(mMonthIndex, false);
}
}
} else {
loopViewMonth.setItems(mListMonth);
if ((yearstart % 100 == 0) && (yearstart % 400 == 0) || (yearstart % 100 != 0) && (yearstart % 4 == 0)) {
startyear = 1;
setDay(mMonthIndex, false);
} else {
startyear = 0;
setDay(mMonthIndex, false);
}
}
}
private void setDay(int index, boolean select) {
if (index == 0 || index == 2 || index == 4 || index == 6 || index == 7 || index == 9 || index == 11) {
mListDay.clear();
for (int i = 1; i < 32; i++) {
mListDay.add(getTwoPositiveInteger(i));
}
day = 31;
if (select) {
loopViewDay.setItems(mListDay.subList(NOW_DAY - 1, mListDay.size()));
} else {
loopViewDay.setItems(mListDay);
}
loopViewDay.setCurrentPosition(0);
} else if (index == 3 || index == 5 || index == 8 || index == 10) {
mListDay.clear();
for (int i = 1; i < 31; i++) {
mListDay.add(getTwoPositiveInteger(i));
}
day = 30;
if (select) {
loopViewDay.setItems(mListDay.subList(NOW_DAY - 1, mListDay.size()));
} else {
loopViewDay.setItems(mListDay);
}
loopViewDay.setCurrentPosition(0);
} else if (index == 1) {
mListDay.clear();
for (int i = 1; i < 29; i++) {
mListDay.add(getTwoPositiveInteger(i));
}
day = 28;
if (select) {
loopViewDay.setItems(mListDay.subList(NOW_DAY - 1, mListDay.size()));
} else {
loopViewDay.setItems(mListDay);
}
if (startyear == 1) {
mListDay.clear();
for (int i = 1; i < 30; i++) {
mListDay.add(getTwoPositiveInteger(i));
}
day = 29;
if (select) {
loopViewDay.setItems(mListDay.subList(NOW_DAY - 1, mListDay.size()));
} else {
loopViewDay.setItems(mListDay);
}
} else {
mListDay.clear();
for (int i = 1; i < 29; i++) {
mListDay.add(getTwoPositiveInteger(i));
}
day = 28;
if (select) {
loopViewDay.setItems(mListDay.subList(NOW_DAY - 1, mListDay.size()));
} else {
loopViewDay.setItems(mListDay);
}
}
loopViewDay.setCurrentPosition(0);
}
}
@Override
public void onDetachedFromWindow() {
if (isShowing())
dismiss();
super.onDetachedFromWindow();
}
@Override
public void show() {
super.show();
WindowManager m = getWindow().getWindowManager();
Display d = m.getDefaultDisplay();
WindowManager.LayoutParams p = getWindow().getAttributes();
p.width = d.getWidth(); //设置dialog的宽度为当前手机屏幕的宽度
getWindow().setAttributes(p);
}
@OnClick({R.id.tvCancel, R.id.tvFinish})
public void onViewClicked(View view) {
switch (view.getId()) {
case R.id.tvCancel:
dismiss();
break;
case R.id.tvFinish:
if (mOnDialogClickListener != null) {
dismiss();
try {
String year = mListYear.get(loopViewYear.getSelectedItem());
String month;
String day;
if (Integer.valueOf(year) == NOW_YEAR) {
month = mListMonth.subList(NOW_MONTH - 1, mListMonth.size()).get(loopViewMonth.getSelectedItem());
} else {
month = mListMonth.get(loopViewMonth.getSelectedItem());
}
if (Integer.valueOf(year) == NOW_YEAR && Integer.valueOf(month) == NOW_MONTH) {
day = mListDay.subList(NOW_DAY - 1, mListDay.size()).get(loopViewDay.getSelectedItem());
} else {
day = mListDay.get(loopViewDay.getSelectedItem());
}
mOnDialogClickListener.dialogClick(this, view, dateToStamp(year + "-" + month + "-" + day));
} catch (ParseException e) {
e.printStackTrace();
}
}
break;
}
}
public void setOnDialogClickListener(OnDialogClickListener l) {
this.mOnDialogClickListener = l;
}
/**
* 控件点击事件接口
*/
public interface OnDialogClickListener {
public void dialogClick(Dialog dialog, View v, long date);
}
/*
* 将时间戳转换为时间
*/
public String stampToDate(long l) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
return simpleDateFormat.format(l);
}
/*
* 将时间转换为时间戳
*/
public long dateToStamp(String s) throws ParseException {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
Date date = simpleDateFormat.parse(s);
return date.getTime();
}
public String getDateChina() {
String year = mStartTime.split("-")[0];
String mon = mStartTime.split("-")[1];
String day = mStartTime.split("-")[2];
int chinaMonth = 0;
String monthValue = "";
for (int i = 0; i < mListMonth.size(); i++) {
if (mon.equals(mListMonth.get(i))) {
chinaMonth = i;
}
}
if (chinaMonth < 9) {
monthValue = "0" + (chinaMonth + 1);
} else {
monthValue = "" + (chinaMonth + 1);
}
return year + "-" + monthValue + "-" + day;
}
private String getTwoPositiveInteger(int a) {
DecimalFormat format = new DecimalFormat("00");
return format.format(a);
}
}
5、调用此dialog对话框:
private void initDateDialog() {
Long date;
if (ValueUtil.isStrNotEmpty(tvDate.getText().toString())) {
date = DateUtil.dateToStamp(tvDate.getText().toString(), 2);
} else {
date = System.currentTimeMillis();
}
mCounterLmeDateDialog = new CounterLmeDateDialog(getContext(), R.style.Theme_dialog, date);
mCounterLmeDateDialog.setCancelable(true);
mCounterLmeDateDialog.getWindow().setWindowAnimations(R.style.dialogWindowAnim);
mCounterLmeDateDialog.getWindow().setGravity(Gravity.BOTTOM);
mCounterLmeDateDialog.setOnDialogClickListener(new CounterLmeDateDialog.OnDialogClickListener() {
@Override
public void dialogClick(Dialog dialog, View v, long date) {
mSelectData = date;
tvDate.setText(DateUtil.getStringDateByLong(date, 2));
}
});
}