Android日期選擇器實(shí)現(xiàn)年月日三級(jí)聯(lián)動(dòng)
最近項(xiàng)目里面用到了一個(gè)日期選擇器,實(shí)現(xiàn)現(xiàn)在主流的WheelView滑動(dòng)選擇,整理了下,做了個(gè)Demo.廢話不多說(shuō),直接上代碼.
主布局:activity_main.xml
<?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:
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;
}
}
主要的類(lèi):
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);
//設(shè)置SelectPicPopupWindow的View
this.setContentView(view);
//設(shè)置SelectPicPopupWindow彈出窗體的寬
this.setWidth(ViewGroup.LayoutParams.MATCH_PARENT);
//設(shè)置SelectPicPopupWindow彈出窗體的高
this.setHeight(ViewGroup.LayoutParams.MATCH_PARENT);
//設(shè)置SelectPicPopupWindow彈出窗體可點(diǎn)擊
this.setFocusable(true);
//設(shè)置SelectPicPopupWindow彈出窗體動(dòng)畫(huà)效果
// this.setAnimationStyle(R.style.AnimBottom);
//實(shí)例化一個(gè)ColorDrawable顏色為半透明
ColorDrawable dw = new ColorDrawable(0xb0000000);
//設(shè)置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);
}
/**
* 設(shè)置字體大小
*
* @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+"";
}
/**
* 設(shè)置年月日
*
* @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);
}
/**
* 設(shè)置年份
*
* @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;
}
/**
* 設(shè)置月份
*
* @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;
}
/**
* 計(jì)算每月多少天
*
* @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();
}
}
}
底部彈出框布局:
<?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>
運(yùn)行效果圖:

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android中src和background的區(qū)別詳解
這篇文章主要介紹了Android中src和background的區(qū)別詳解的相關(guān)資料,需要的朋友可以參考下2016-09-09
android如何獲取手機(jī)聯(lián)系人的數(shù)據(jù)庫(kù)示例代碼
很多人在做手機(jī)聯(lián)系人的apk時(shí)會(huì)遇到,如何獲取手機(jī)聯(lián)系人數(shù)據(jù)庫(kù)的問(wèn)題,本篇文章主要介紹了android如何獲取手機(jī)聯(lián)系人的數(shù)據(jù)庫(kù)示例代碼,有興趣的可以了解一下。2017-01-01
android USB如何修改VID具體實(shí)現(xiàn)
在android 設(shè)備的Linux 內(nèi)核中把 USB 驅(qū)動(dòng)的 PID VID 修改以后,也許之前的adb工具就不能識(shí)別設(shè)備了,會(huì)打印出"device not found"的提示2013-06-06
Android中二維碼的掃描和生成(使用zxing庫(kù))
ZXing是一個(gè)開(kāi)放源碼的,用Java實(shí)現(xiàn)的多種格式的1D/2D條碼圖像處理庫(kù),它包含了聯(lián)系到其他語(yǔ)言的端口,下面這篇文章主要給大家介紹了關(guān)于Android中二維碼掃描和生成的相關(guān)資料,主要使用的zxing庫(kù),需要的朋友可以參考下2022-09-09
實(shí)例詳解android studio如何導(dǎo)入.so文件的方法
通過(guò)實(shí)例給大家詳細(xì)講解了如何在android studio如何導(dǎo)入.so文件以及中間遇到的問(wèn)題解決辦法,需要的讀者們可以仔細(xì)學(xué)習(xí)一下。2017-12-12
Android自定義控件實(shí)現(xiàn)下拉刷新效果
這篇文章主要為大家詳細(xì)介紹了Android自定義控件實(shí)現(xiàn)下拉刷新效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08
Android studio圓形進(jìn)度條 百分?jǐn)?shù)跟隨變化
這篇文章主要為大家詳細(xì)介紹了Android studio圓形進(jìn)度條,百分號(hào)跟隨變化,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10
Android獲取和讀取短信驗(yàn)證碼的實(shí)現(xiàn)方法
這篇文章主要介紹了Android獲取和讀取短信驗(yàn)證碼的實(shí)現(xiàn)方法,文章內(nèi)容介紹了如何讀取剛收到的短信的相關(guān)內(nèi)容,以及Android獲取短信驗(yàn)證碼的方法,感興趣的小伙伴們可以參考一下2016-03-03
Android 7.0系統(tǒng)webview 顯示https頁(yè)面空白處理方法
今天小編就為大家分享一篇Android 7.0系統(tǒng)webview 顯示https頁(yè)面空白處理方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07

