輕松實(shí)現(xiàn)可擴(kuò)展自定義的Android滾輪時(shí)間選擇控件
項(xiàng)目需求中有個(gè)功能模塊需要用到時(shí)間選擇控件,但是android系統(tǒng)自帶的太丑了,只能自己優(yōu)化下,結(jié)合WheelView實(shí)現(xiàn)滾輪選擇日期,好像網(wǎng)上也挺多這種文章的。但是適用范圍還是不同,希望這個(gè)能夠?qū)π枨笙嗤呐笥延幸欢◣椭?。控件?biāo)題還有年月日時(shí)分秒這些可以自己控制是否顯示,先來(lái)看效果。
1.有年月日時(shí)分的開(kāi)始時(shí)間
2.只有年月日的結(jié)束時(shí)間
3.用于有時(shí)身份證到期的時(shí)間選擇(分為勾選長(zhǎng)期和直接選擇時(shí)間兩種,另外長(zhǎng)期后面自己也可以進(jìn)行擴(kuò)展)
4.項(xiàng)目結(jié)構(gòu)
5.直接貼代碼,代碼里面注釋很詳細(xì)
<span style="font-size:18px;"><span style="font-size:14px;">package com.andrew.datechoosewheelviewdemo; import android.app.Activity; import android.app.Dialog; import android.content.Context; import android.os.Looper; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.LinearLayout; import android.widget.TextView; import com.andrew.datechoosewheelviewdemo.widget.OnWheelChangedListener; import com.andrew.datechoosewheelviewdemo.widget.OnWheelScrollListener; import com.andrew.datechoosewheelviewdemo.widget.WheelView; import com.andrew.datechoosewheelviewdemo.widget.adapters.AbstractWheelTextAdapter; import java.util.ArrayList; import java.util.Calendar; /** * 使用說(shuō)明:1.showLongTerm()是否顯示長(zhǎng)期選項(xiàng) * 2.setTimePickerGone隱藏時(shí)間選擇 * 3.接口DateChooseInterface * * 用于時(shí)間日期的選擇 * Created by liuhongxia on 2016/4/16. */ public class DateChooseWheelViewDialog extends Dialog implements View.OnClickListener { //控件 private WheelView mYearWheelView; private WheelView mDateWheelView; private WheelView mHourWheelView; private WheelView mMinuteWheelView; private CalendarTextAdapter mDateAdapter; private CalendarTextAdapter mHourAdapter; private CalendarTextAdapter mMinuteAdapter; private CalendarTextAdapter mYearAdapter; private TextView mTitleTextView; private Button mSureButton; private Dialog mDialog; private Button mCloseDialog; private LinearLayout mLongTermLayout; private TextView mLongTermTextView; //變量 private ArrayList<String> arry_date = new ArrayList<String>(); private ArrayList<String> arry_hour = new ArrayList<String>(); private ArrayList<String> arry_minute = new ArrayList<String>(); private ArrayList<String> arry_year = new ArrayList<String>(); private int nowDateId = 0; private int nowHourId = 0; private int nowMinuteId = 0; private int nowYearId = 0; private String mYearStr; private String mDateStr; private String mHourStr; private String mMinuteStr; private boolean mBlnBeLongTerm = false;//是否需要長(zhǎng)期 private boolean mBlnTimePickerGone = false;//時(shí)間選擇是否顯示 //常量 private final int MAX_TEXT_SIZE = 18; private final int MIN_TEXT_SIZE = 16; private Context mContext; private DateChooseInterface dateChooseInterface; public DateChooseWheelViewDialog(Context context, DateChooseInterface dateChooseInterface) { super(context); this.mContext = context; this.dateChooseInterface = dateChooseInterface; mDialog = new Dialog(context,R.style.dialog); initView(); initData(); } private void initData() { initYear(); initDate(); initHour(); initMinute(); initListener(); } /** * 初始化滾動(dòng)監(jiān)聽(tīng)事件 */ private void initListener() { //年份***************************** mYearWheelView.addChangingListener(new OnWheelChangedListener() { @Override public void onChanged(WheelView wheel, int oldValue, int newValue) { String currentText = (String) mYearAdapter.getItemText(wheel.getCurrentItem()); setTextViewStyle(currentText, mYearAdapter); mYearStr = arry_year.get(wheel.getCurrentItem()) + ""; } }); mYearWheelView.addScrollingListener(new OnWheelScrollListener() { @Override public void onScrollingStarted(WheelView wheel) { } @Override public void onScrollingFinished(WheelView wheel) { String currentText = (String) mYearAdapter.getItemText(wheel.getCurrentItem()); setTextViewStyle(currentText, mYearAdapter); } }); //日期******************** mDateWheelView.addChangingListener(new OnWheelChangedListener() { @Override public void onChanged(WheelView wheel, int oldValue, int newValue) { String currentText = (String) mDateAdapter.getItemText(wheel.getCurrentItem()); setTextViewStyle(currentText, mDateAdapter); // mDateCalendarTextView.setText(" " + arry_date.get(wheel.getCurrentItem())); mDateStr = arry_date.get(wheel.getCurrentItem()); } }); mDateWheelView.addScrollingListener(new OnWheelScrollListener() { @Override public void onScrollingStarted(WheelView wheel) { } @Override public void onScrollingFinished(WheelView wheel) { String currentText = (String) mDateAdapter.getItemText(wheel.getCurrentItem()); setTextViewStyle(currentText, mDateAdapter); } }); //小時(shí)*********************************** mHourWheelView.addChangingListener(new OnWheelChangedListener() { @Override public void onChanged(WheelView wheel, int oldValue, int newValue) { String currentText = (String) mHourAdapter.getItemText(wheel.getCurrentItem()); setTextViewStyle(currentText, mHourAdapter); mHourStr = arry_hour.get(wheel.getCurrentItem()) + ""; } }); mHourWheelView.addScrollingListener(new OnWheelScrollListener() { @Override public void onScrollingStarted(WheelView wheel) { } @Override public void onScrollingFinished(WheelView wheel) { String currentText = (String) mHourAdapter.getItemText(wheel.getCurrentItem()); setTextViewStyle(currentText, mHourAdapter); } }); //分鐘******************************************** mMinuteWheelView.addChangingListener(new OnWheelChangedListener() { @Override public void onChanged(WheelView wheel, int oldValue, int newValue) { String currentText = (String) mMinuteAdapter.getItemText(wheel.getCurrentItem()); setTextViewStyle(currentText, mMinuteAdapter); mMinuteStr = arry_minute.get(wheel.getCurrentItem()) + ""; } }); mMinuteWheelView.addScrollingListener(new OnWheelScrollListener() { @Override public void onScrollingStarted(WheelView wheel) { } @Override public void onScrollingFinished(WheelView wheel) { String currentText = (String) mMinuteAdapter.getItemText(wheel.getCurrentItem()); setTextViewStyle(currentText, mMinuteAdapter); } }); } /** * 初始化分鐘 */ private void initMinute() { Calendar nowCalendar = Calendar.getInstance(); int nowMinite = nowCalendar.get(Calendar.MINUTE); arry_minute.clear(); for (int i = 0; i <= 59; i++) { arry_minute.add(i + ""); if (nowMinite == i){ nowMinuteId = arry_minute.size() - 1; } } mMinuteAdapter = new CalendarTextAdapter(mContext, arry_minute, nowMinuteId, MAX_TEXT_SIZE, MIN_TEXT_SIZE); mMinuteWheelView.setVisibleItems(5); mMinuteWheelView.setViewAdapter(mMinuteAdapter); mMinuteWheelView.setCurrentItem(nowMinuteId); mMinuteStr = arry_minute.get(nowMinuteId) + ""; setTextViewStyle(mMinuteStr, mMinuteAdapter); } /** * 初始化時(shí)間 */ private void initHour() { Calendar nowCalendar = Calendar.getInstance(); int nowHour = nowCalendar.get(Calendar.HOUR_OF_DAY); arry_hour.clear(); for (int i = 0; i <= 23; i++) { arry_hour.add(i + ""); if (nowHour == i){ nowHourId = arry_hour.size() - 1; } } mHourAdapter = new CalendarTextAdapter(mContext, arry_hour, nowHourId, MAX_TEXT_SIZE, MIN_TEXT_SIZE); mHourWheelView.setVisibleItems(5); mHourWheelView.setViewAdapter(mHourAdapter); mHourWheelView.setCurrentItem(nowHourId); mHourStr = arry_hour.get(nowHourId) + ""; setTextViewStyle(mHourStr, mHourAdapter); } /** * 初始化年 */ private void initYear() { Calendar nowCalendar = Calendar.getInstance(); int nowYear = nowCalendar.get(Calendar.YEAR); arry_year.clear(); for (int i = 0; i <= 99; i++) { int year = nowYear -30 + i; arry_year.add(year + "年"); if (nowYear == year) { nowYearId = arry_year.size() - 1; } } mYearAdapter = new CalendarTextAdapter(mContext, arry_year, nowYearId, MAX_TEXT_SIZE, MIN_TEXT_SIZE); mYearWheelView.setVisibleItems(5); mYearWheelView.setViewAdapter(mYearAdapter); mYearWheelView.setCurrentItem(nowYearId); mYearStr = arry_year.get(nowYearId); } private void initView() { View view = LayoutInflater.from(mContext).inflate(R.layout.dialog_date_choose, null); mDialog.setContentView(view); mYearWheelView = (WheelView) view.findViewById(R.id.year_wv); mDateWheelView = (WheelView) view.findViewById(R.id.date_wv); mHourWheelView = (WheelView) view.findViewById(R.id.hour_wv); mMinuteWheelView = (WheelView) view.findViewById(R.id.minute_wv); mTitleTextView = (TextView) view.findViewById(R.id.title_tv); mSureButton = (Button) view.findViewById(R.id.sure_btn); mCloseDialog = (Button) view.findViewById(R.id.date_choose_close_btn); mLongTermLayout = (LinearLayout) view.findViewById(R.id.long_term_layout); mLongTermTextView = (TextView) view.findViewById(R.id.long_term_tv); mSureButton.setOnClickListener(this); mCloseDialog.setOnClickListener(this); mLongTermTextView.setOnClickListener(this); } /** * 初始化日期 */ private void initDate() { Calendar nowCalendar = Calendar.getInstance(); int nowYear = nowCalendar.get(Calendar.YEAR); arry_date.clear(); setDate(nowYear); mDateAdapter = new CalendarTextAdapter(mContext, arry_date, nowDateId, MAX_TEXT_SIZE, MIN_TEXT_SIZE); mDateWheelView.setVisibleItems(5); mDateWheelView.setViewAdapter(mDateAdapter); mDateWheelView.setCurrentItem(nowDateId); mDateStr = arry_date.get(nowDateId); setTextViewStyle(mDateStr, mDateAdapter); } public void setDateDialogTitle(String title) { mTitleTextView.setText(title); } public void setTimePickerGone(boolean isGone) { mBlnTimePickerGone = isGone; if (isGone) { LinearLayout.LayoutParams yearParams = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); yearParams.rightMargin = 22; LinearLayout.LayoutParams dateParams = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); mYearWheelView.setLayoutParams(yearParams); mDateWheelView.setLayoutParams(dateParams); mHourWheelView.setVisibility(View.GONE); mMinuteWheelView.setVisibility(View.GONE); } else { mHourWheelView.setVisibility(View.VISIBLE); mMinuteWheelView.setVisibility(View.VISIBLE); } } public void showLongTerm(boolean show) { if (show) { mLongTermLayout.setVisibility(View.VISIBLE); } else { mLongTermLayout.setVisibility(View.GONE); } } /** * 將改年的所有日期寫(xiě)入數(shù)組 * @param year */ private void setDate(int year){ boolean isRun = isRunNian(year); Calendar nowCalendar = Calendar.getInstance(); int nowMonth = nowCalendar.get(Calendar.MONTH) + 1; int nowDay = nowCalendar.get(Calendar.DAY_OF_MONTH); for (int month = 1; month <= 12; month++){ switch (month){ case 1: case 3: case 5: case 7: case 8: case 10: case 12: for (int day = 1; day <= 31; day++){ arry_date.add(month + "月" + day + "日"); if (month == nowMonth && day == nowDay){ nowDateId = arry_date.size() - 1; } } break; case 2: if (isRun){ for (int day = 1; day <= 29; day++){ arry_date.add(month + "月" + day + "日"); if (month == nowMonth && day == nowDay){ nowDateId = arry_date.size() - 1; } } }else { for (int day = 1; day <= 28; day++){ arry_date.add(month + "月" + day + "日"); if (month == nowMonth && day == nowDay){ nowDateId = arry_date.size() - 1; } } } break; case 4: case 6: case 9: case 11: for (int day = 1; day <= 30; day++){ arry_date.add(month + "月" + day + "日"); if (month == nowMonth && day == nowDay){ nowDateId = arry_date.size() - 1; } } break; default: break; } } } /** * 判斷是否是閏年 * @param year * @return */ private boolean isRunNian(int year){ if(year % 4 == 0 && year % 100 !=0 || year % 400 == 0){ return true; }else { return false; } } /** * 設(shè)置文字的大小 * @param curriteItemText * @param adapter */ public void setTextViewStyle(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(MAX_TEXT_SIZE); textvew.setTextColor(mContext.getResources().getColor(R.color.text_10)); } else { textvew.setTextSize(MIN_TEXT_SIZE); textvew.setTextColor(mContext.getResources().getColor(R.color.text_11)); } } } @Override public void onClick(View v) { switch (v.getId()) { case R.id.sure_btn://確定選擇按鈕監(jiān)聽(tīng) if (mBlnTimePickerGone) { dateChooseInterface.getDateTime(strTimeToDateFormat(mYearStr, mDateStr), mBlnBeLongTerm); } else { dateChooseInterface.getDateTime(strTimeToDateFormat(mYearStr, mDateStr , mHourStr , mMinuteStr), mBlnBeLongTerm); } dismissDialog(); break; case R.id.date_choose_close_btn://關(guān)閉日期選擇對(duì)話框 dismissDialog(); break; case R.id.long_term_tv://選擇長(zhǎng)期時(shí)間監(jiān)聽(tīng) if (!mBlnBeLongTerm) { mLongTermTextView.setBackgroundResource(R.drawable.gouxuanok); mBlnBeLongTerm = true; } else { mLongTermTextView.setBackgroundResource(R.drawable.gouxuanno); mBlnBeLongTerm = false; } default: break; } } /** * 對(duì)話框消失 */ private void dismissDialog() { if (Looper.myLooper() != Looper.getMainLooper()) { return; } if (null == mDialog || !mDialog.isShowing() || null == mContext || ((Activity) mContext).isFinishing()) { return; } mDialog.dismiss(); this.dismiss(); } /** * 顯示日期選擇dialog */ public void showDateChooseDialog() { if (Looper.myLooper() != Looper.getMainLooper()) { return; } if (null == mContext || ((Activity) mContext).isFinishing()) { // 界面已被銷毀 return; } if (null != mDialog) { mDialog.show(); return; } if (null == mDialog) { return; } mDialog.setCanceledOnTouchOutside(true); mDialog.show(); } /** * xx年xx月xx日xx時(shí)xx分轉(zhuǎn)成yyyy-MM-dd HH:mm * @param yearStr * @param dateStr * @param hourStr * @param minuteStr * @return */ private String strTimeToDateFormat(String yearStr, String dateStr, String hourStr, String minuteStr) { return yearStr.replace("年", "-") + dateStr.replace("月", "-").replace("日", " ") + hourStr + ":" + minuteStr; } private String strTimeToDateFormat(String yearStr, String dateStr) { return yearStr.replace("年", "-") + dateStr.replace("月", "-").replace("日", ""); } /** * 滾輪的adapter */ private class CalendarTextAdapter extends AbstractWheelTextAdapter { ArrayList<String> list; protected CalendarTextAdapter(Context context, ArrayList<String> list, int currentItem, int maxsize, int minsize) { super(context, R.layout.item_birth_year, R.id.tempValue, currentItem, maxsize, minsize); this.list = list; } @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) { String str = list.get(index) + ""; return str; } } /** * 回調(diào)選中的時(shí)間(默認(rèn)時(shí)間格式"yyyy-MM-dd HH:mm:ss") */ public interface DateChooseInterface{ void getDateTime(String time, boolean longTimeChecked); } } </span></span>
6.MainActivity里面使用
<span style="font-size:18px;"><span style="font-size:14px;">package com.andrew.datechoosewheelviewdemo; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; public class MainActivity extends Activity implements View.OnClickListener { private Button mStartDateButton; private Button mEndDateButton; private Button mDateValidButton; private TextView mShowContentTextView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mStartDateButton = (Button) this.findViewById(R.id.start_date_btn); mEndDateButton = (Button) this.findViewById(R.id.end_date_btn); mDateValidButton = (Button) this.findViewById(R.id.date_valid_btn); mShowContentTextView = (TextView) this.findViewById(R.id.show_content_tv); mStartDateButton.setOnClickListener(this); mEndDateButton.setOnClickListener(this); mDateValidButton.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.start_date_btn://開(kāi)始時(shí)間 DateChooseWheelViewDialog startDateChooseDialog = new DateChooseWheelViewDialog(MainActivity.this, new DateChooseWheelViewDialog.DateChooseInterface() { @Override public void getDateTime(String time, boolean longTimeChecked) { mShowContentTextView.setText(time); } }); startDateChooseDialog.setDateDialogTitle("開(kāi)始時(shí)間"); startDateChooseDialog.showDateChooseDialog(); break; case R.id.end_date_btn://結(jié)束時(shí)間 DateChooseWheelViewDialog endDateChooseDialog = new DateChooseWheelViewDialog(MainActivity.this, new DateChooseWheelViewDialog.DateChooseInterface() { @Override public void getDateTime(String time, boolean longTimeChecked) { mShowContentTextView.setText(time); } }); endDateChooseDialog.setTimePickerGone(true); endDateChooseDialog.setDateDialogTitle("結(jié)束時(shí)間"); endDateChooseDialog.showDateChooseDialog(); break; case R.id.date_valid_btn://身份證有效期 DateChooseWheelViewDialog dateValidChooseDialog = new DateChooseWheelViewDialog(MainActivity.this, new DateChooseWheelViewDialog.DateChooseInterface() { @Override public void getDateTime(String time, boolean longTimeChecked) { if (longTimeChecked) { mShowContentTextView.setText("長(zhǎng)期 "); } else { mShowContentTextView.setText(time); } } }); dateValidChooseDialog.setTimePickerGone(true); dateValidChooseDialog.showLongTerm(true); dateValidChooseDialog.setDateDialogTitle("身份證到期時(shí)間"); dateValidChooseDialog.showDateChooseDialog(); break; default: break; } } } </span></span>
代碼下載地址:
github:https://github.com/hongxialiu/DateChooseWheelViewDemo
源碼下載: WheelView滾輪時(shí)間選擇控件
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android入門(mén)之彈出式對(duì)話框的實(shí)現(xiàn)
Android Studio里有一種Dialog叫PopWindow,它是一種“可阻塞式Dialog”,即彈出后除非你給它一個(gè)“動(dòng)作”否則就一直顯示在那。本文就將實(shí)現(xiàn)這樣的彈出式對(duì)話框,感興趣的可以了解一下2022-11-11Android?Jetpack庫(kù)重要組件WorkManager的使用
WorkManager是Android?Jetpack的一個(gè)強(qiáng)大的組件,用于處理后臺(tái)耗時(shí)任務(wù)。后臺(tái)任務(wù)可以是一次性的,也可以是重復(fù)的,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08Android編程使用內(nèi)容提供者方式(ContentProvider)進(jìn)行存儲(chǔ)的方法
這篇文章主要介紹了Android編程使用內(nèi)容提供者方式進(jìn)行存儲(chǔ)的方法,涉及Android內(nèi)容提供者的創(chuàng)建,配置及針對(duì)數(shù)據(jù)的增刪改查等操作技巧,需要的朋友可以參考下2016-01-01Android實(shí)現(xiàn)簡(jiǎn)易記事本
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)簡(jiǎn)易記事本,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-07-07Android超詳細(xì)介紹自定義多選框與點(diǎn)擊按鈕跳轉(zhuǎn)界面的實(shí)現(xiàn)
這篇文章主要介紹了在Android開(kāi)發(fā)中如何來(lái)實(shí)現(xiàn)自定義多選框以及如何實(shí)現(xiàn)點(diǎn)擊按鈕跳轉(zhuǎn)界面的功能,感興趣的朋友快來(lái)看看吧2022-03-03ActivityLifecycleCallbacks如何判斷APP是否在前臺(tái)
這篇文章主要為大家詳細(xì)介紹了ActivityLifecycleCallbacks判斷APP是否在前臺(tái)的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07