最近项目里面用到了一个日期选择器,实现现在主流的WheelView滑动选择,整理了下,做了个Demo.废话不多说,直接上代码.
主布局:activity_main.xml
代码语言:javascript复制<?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:
代码语言:javascript复制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;
}
}
主要的类:
代码语言:javascript复制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();
}
}
}
底部弹出框布局:
代码语言:javascript复制<?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
运行效果图:
以上就是本文的全部内容,希望对大家的学习有所帮助。