您的位置:首页 > 移动开发 > Android开发

Android 日期选择器,实现年月日三级联动

2017-03-08 11:19 591 查看
最近项目里面用到了一个日期选择器,实现现在主流的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下载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: