最近项目里面用到了一个日期选择器,实现现在主流的WheelView滑动选择,整理了下,做了个Demo.废话不多说,直接上代码.
主布局:activity_main.xml
[java] view plain copy <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.example.user.mydate.MainActivity"> <TextView android:id="@+id/selectDate" android:layout_width="match_parent" android:layout_height="30dp" android:gravity="center" android:onClick="selectDate" android:clickable="true" android:text="日期选择" /> </RelativeLayout> MainActivity:<pre name="code" class="java">package com.example.user.mydate; import android.app.Activity; import android.os.Bundle; import android.view.Gravity; import android.view.View; import android.view.Window; import android.widget.TextView; import android.widget.Toast; import com.example.user.mydate.view.ChangeDatePopwindow; public class MainActivity extends Activity { private TextView selectDate; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); selectDate= (TextView) findViewById(R.id.selectDate); } public void selectDate(View v){ if (v.getId()==R.id.selectDate){ selectDate(); } } private String[] selectDate() { final String[] str = new String[10]; ChangeDatePopwindow mChangeBirthDialog = new ChangeDatePopwindow( this); mChangeBirthDialog.setDate("2016", "1", "1"); mChangeBirthDialog.showAtLocation(selectDate, Gravity.BOTTOM, 0, 0); mChangeBirthDialog.setBirthdayListener(new ChangeDatePopwindow.OnBirthListener() { @Override public void onClick(String year, String month, String day) { // TODO Auto-generated method stub Toast.makeText(MainActivity.this,year + "-" + month + "-" + day,Toast.LENGTH_LONG).show(); StringBuilder sb = new StringBuilder(); sb.append(year.substring(0, year.length() - 1)).append("-").append(month.substring(0, day.length() - 1)).append("-").append(day); str[0] = year + "-" + month + "-" + day; str[1] = sb.toString(); selectDate.setText(year + "-" + month + "-" + day); } }); return str; } } 主要的类: [java] view plain copy package com.example.user.mydate.view; import android.content.Context; import android.graphics.drawable.ColorDrawable; import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.widget.PopupWindow; import android.widget.TextView; import com.example.user.mydate.R; import com.example.user.mydate.view.wheelview.OnWheelChangedListener; import com.example.user.mydate.view.wheelview.OnWheelScrollListener; import com.example.user.mydate.view.wheelview.WheelView; import com.example.user.mydate.view.wheelview.adapter.AbstractWheelTextAdapter1; import java.util.ArrayList; import java.util.Calendar; /** * Author: Chen.yuan * Email: hubeiqiyuan2010@163.com * Date: 2016/7/28 17:37 * Description:日期选择window */ public class ChangeDatePopwindow extends PopupWindow implements View.OnClickListener { private Context context; private WheelView wvYear; private WheelView wvMonth; private WheelView wvDay; private TextView btnSure; private TextView btnCancel; private ArrayList<String> arry_years = new ArrayList<String>(); private ArrayList<String> arry_months = new ArrayList<String>(); private ArrayList<String> arry_days = new ArrayList<String>(); private CalendarTextAdapter mYearAdapter; private CalendarTextAdapter mMonthAdapter; private CalendarTextAdapter mDaydapter; private String month; private String day; private String currentYear = getYear(); private String currentMonth = getMonth(); private String currentDay = getDay(); private int maxTextSize = 24; private int minTextSize = 14; private boolean issetdata = false; private String selectYear; private String selectMonth; private String selectDay; private OnBirthListener onBirthListener; public ChangeDatePopwindow(final Context context) { super(context); this.context = context; View view=View.inflate(context, R.layout.dialog_myinfo_changebirth,null); wvYear = (WheelView) view.findViewById(R.id.wv_birth_year); wvMonth = (WheelView) view.findViewById(R.id.wv_birth_month); wvDay = (WheelView) view.findViewById(R.id.wv_birth_day); btnSure = (TextView) view.findViewById(R.id.btn_myinfo_sure); btnCancel = (TextView) view.findViewById(R.id.btn_myinfo_cancel); //设置SelectPicPopupWindow的View this.setContentView(view); //设置SelectPicPopupWindow弹出窗体的宽 this.setWidth(ViewGroup.LayoutParams.MATCH_PARENT); //设置SelectPicPopupWindow弹出窗体的高 this.setHeight(ViewGroup.LayoutParams.MATCH_PARENT); //设置SelectPicPopupWindow弹出窗体可点击 this.setFocusable(true); //设置SelectPicPopupWindow弹出窗体动画效果 // this.setAnimationStyle(R.style.AnimBottom); //实例化一个ColorDrawable颜色为半透明 ColorDrawable dw = new ColorDrawable(0xb0000000); //设置SelectPicPopupWindow弹出窗体的背景 this.setBackgroundDrawable(dw); btnSure.setOnClickListener(this); btnCancel.setOnClickListener(this); if (!issetdata) { initData(); } initYears(); mYearAdapter = new CalendarTextAdapter(context, arry_years, setYear(currentYear), maxTextSize, minTextSize); wvYear.setVisibleItems(5); wvYear.setViewAdapter(mYearAdapter); wvYear.setCurrentItem(setYear(currentYear)); initMonths(Integer.parseInt(month)); mMonthAdapter = new CalendarTextAdapter(context, arry_months, setMonth(currentMonth), maxTextSize, minTextSize); wvMonth.setVisibleItems(5); wvMonth.setViewAdapter(mMonthAdapter); wvMonth.setCurrentItem(setMonth(currentMonth)); initDays(Integer.parseInt(day)); mDaydapter = new CalendarTextAdapter(context, arry_days, Integer.parseInt(currentDay) - 1, maxTextSize, minTextSize); wvDay.setVisibleItems(5); wvDay.setViewAdapter(mDaydapter); wvDay.setCurrentItem(Integer.parseInt(currentDay) - 1); wvYear.addChangingListener(new OnWheelChangedListener() { @Override public void onChanged(WheelView wheel, int oldValue, int newValue) { // TODO Auto-generated method stub String currentText = (String) mYearAdapter.getItemText(wheel.getCurrentItem()); selectYear = currentText; setTextviewSize(currentText, mYearAdapter); currentYear = currentText.substring(0, currentText.length()-1).toString(); Log.d("currentYear==",currentYear); setYear(currentYear); initMonths(Integer.parseInt(month)); mMonthAdapter = new CalendarTextAdapter(context, arry_months, 0, maxTextSize, minTextSize); wvMonth.setVisibleItems(5); wvMonth.setViewAdapter(mMonthAdapter); wvMonth.setCurrentItem(0); calDays(currentYear, month); } }); wvYear.addScrollingListener(new OnWheelScrollListener() { @Override public void onScrollingStarted(WheelView wheel) { // TODO Auto-generated method stub } @Override public void onScrollingFinished(WheelView wheel) { // TODO Auto-generated method stub String currentText = (String) mYearAdapter.getItemText(wheel.getCurrentItem()); setTextviewSize(currentText, mYearAdapter); } }); wvMonth.addChangingListener(new OnWheelChangedListener() { @Override public void onChanged(WheelView wheel, int oldValue, int newValue) { // TODO Auto-generated method stub String currentText = (String) mMonthAdapter.getItemText(wheel.getCurrentItem()); selectMonth = currentText; setTextviewSize(currentText, mMonthAdapter); setMonth(currentText.substring(0, 1)); initDays(Integer.parseInt(day)); mDaydapter = new CalendarTextAdapter(context, arry_days, 0, maxTextSize, minTextSize); wvDay.setVisibleItems(5); wvDay.setViewAdapter(mDaydapter); wvDay.setCurrentItem(0); calDays(currentYear, month); } }); wvMonth.addScrollingListener(new OnWheelScrollListener() { @Override public void onScrollingStarted(WheelView wheel) { // TODO Auto-generated method stub } @Override public void onScrollingFinished(WheelView wheel) { // TODO Auto-generated method stub String currentText = (String) mMonthAdapter.getItemText(wheel.getCurrentItem()); setTextviewSize(currentText, mMonthAdapter); } }); wvDay.addChangingListener(new OnWheelChangedListener() { @Override public void onChanged(WheelView wheel, int oldValue, int newValue) { // TODO Auto-generated method stub String currentText = (String) mDaydapter.getItemText(wheel.getCurrentItem()); setTextviewSize(currentText, mDaydapter); selectDay = currentText; } }); wvDay.addScrollingListener(new OnWheelScrollListener() { @Override public void onScrollingStarted(WheelView wheel) { // TODO Auto-generated method stub } @Override public void onScrollingFinished(WheelView wheel) { // TODO Auto-generated method stub String currentText = (String) mDaydapter.getItemText(wheel.getCurrentItem()); setTextviewSize(currentText, mDaydapter); } }); } public void initYears() { for (int i = Integer.parseInt(getYear()); i > 1950; i--) { arry_years.add(i + "年"); } } public void initMonths(int months) { arry_months.clear(); for (int i = 1; i <= months; i++) { arry_months.add(i + "月"); } } public void initDays(int days) { arry_days.clear(); for (int i = 1; i <= days; i++) { arry_days.add(i + "日"); } } private class CalendarTextAdapter extends AbstractWheelTextAdapter1 { ArrayList<String> list; protected CalendarTextAdapter(Context context, ArrayList<String> list, int currentItem, int maxsize, int minsize) { super(context, R.layout.item_birth_year, NO_RESOURCE, currentItem, maxsize, minsize); this.list = list; setItemTextResource(R.id.tempValue); } @Override public View getItem(int index, View cachedView, ViewGroup parent) { View view = super.getItem(index, cachedView, parent); return view; } @Override public int getItemsCount() { return list.size(); } @Override protected CharSequence getItemText(int index) { return list.get(index) + ""; } } public void setBirthdayListener(OnBirthListener onBirthListener) { this.onBirthListener = onBirthListener; } @Override public void onClick(View v) { if (v == btnSure) { if (onBirthListener != null) { onBirthListener.onClick(selectYear, selectMonth, selectDay); Log.d("cy",""+selectYear+""+selectMonth+""+selectDay); } } else if (v == btnSure) { } else { dismiss(); } dismiss(); } public interface OnBirthListener { public void onClick(String year, String month, String day); } /** * 设置字体大小 * * @param curriteItemText * @param adapter */ public void setTextviewSize(String curriteItemText, CalendarTextAdapter adapter) { ArrayList<View> arrayList = adapter.getTestViews(); int size = arrayList.size(); String currentText; for (int i = 0; i < size; i++) { TextView textvew = (TextView) arrayList.get(i); currentText = textvew.getText().toString(); if (curriteItemText.equals(currentText)) { textvew.setTextSize(maxTextSize); } else { textvew.setTextSize(minTextSize); } } } public String getYear() { Calendar c = Calendar.getInstance(); return c.get(Calendar.YEAR)+""; } public String getMonth() { Calendar c = Calendar.getInstance(); return c.get(Calendar.MONTH) + 1+""; } public String getDay() { Calendar c = Calendar.getInstance(); return c.get(Calendar.DATE)+""; } public void initData() { setDate(getYear(), getMonth(), getDay()); this.currentDay = 1+""; this.currentMonth = 1+""; } /** * 设置年月日 * * @param year * @param month * @param day */ public void setDate(String year, String month, String day) { selectYear = year + "年"; selectMonth = month + "月"; selectDay = day + "日"; issetdata = true; this.currentYear = year; this.currentMonth = month; this.currentDay = day; if (year == getYear()) { this.month = getMonth(); } else { this.month = 12+""; } calDays(year, month); } /** * 设置年份 * * @param year */ public int setYear(String year) { int yearIndex = 0; if (!year.equals(getYear())) { this.month = 12+""; } else { this.month = getMonth(); } for (int i = Integer.parseInt(getYear()); i > 1950; i--) { if (i == Integer.parseInt(year)) { return yearIndex; } yearIndex++; } return yearIndex; } /** * 设置月份 * * @param month * @param month * @return */ public int setMonth(String month) { int monthIndex = 0; calDays(currentYear, month); for (int i = 1; i < Integer.parseInt(this.month); i++) { if (Integer.parseInt(month) == i) { return monthIndex; } else { monthIndex++; } } return monthIndex; } /** * 计算每月多少天 * * @param month * @param year */ public void calDays(String year, String month) { boolean leayyear = false; if (Integer.parseInt(year) % 4 == 0 && Integer.parseInt(year) % 100 != 0) { leayyear = true; } else { leayyear = false; } for (int i = 1; i <= 12; i++) { switch (Integer.parseInt(month)) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: this.day = 31+""; break; case 2: if (leayyear) { this.day = 29+""; } else { this.day = 28+""; } break; case 4: case 6: case 9: case 11: this.day = 30+""; break; } } if (year.equals( getYear()) && month .equals( getMonth())) { this.day = getDay(); } } }
底部弹出框布局:
[java] view plain copy <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/ly_myinfo_changeaddress" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/color_transparent" android:gravity="bottom" android:orientation="vertical" > <LinearLayout android:id="@+id/ly_myinfo_changeaddress_child" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:background="@color/white" android:orientation="vertical" > <RelativeLayout android:layout_width="match_parent" android:layout_height="44dp" > <TextView android:id="@+id/btn_myinfo_cancel" android:layout_width="wrap_content" android:layout_height="match_parent" android:paddingLeft="12dp" android:text="取消" android:gravity="center" android:layout_alignParentLeft="true" android:layout_marginRight="15dip" android:textColor="@color/color_e84515" android:textSize="13sp" /> <TextView android:id="@+id/btn_myinfo_sure" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_alignParentRight="true" android:gravity="center" android:text="完成" android:textColor="@color/color_e84515" android:paddingRight="12dp" android:textSize="12sp" /> </RelativeLayout> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="0.5dp" android:background="@color/color_d8d8d8" /> <LinearLayout android:layout_width="match_parent" android:layout_height="160dip" android:orientation="horizontal" android:gravity="center_vertical"> <com.example.user.mydate.view.wheelview.WheelView android:id="@+id/wv_birth_year" android:layout_width="0dip" android:layout_weight="1" android:layout_height="match_parent" android:layout_gravity="center_vertical" /> <com.example.user.mydate.view.wheelview.WheelView android:id="@+id/wv_birth_month" android:layout_width="0dip" android:layout_weight="1" android:layout_height="match_parent" android:layout_gravity="center_vertical" /> <com.example.user.mydate.view.wheelview.WheelView android:id="@+id/wv_birth_day" android:layout_width="0dip" android:layout_weight="1" android:layout_height="match_parent" android:layout_gravity="center_vertical" /> </LinearLayout> </LinearLayout> </LinearLayout>
运行效果图:
demo下载