大佬教程收集整理的这篇文章主要介绍了Android自定义控件之日期选择控件使用详解,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
@OnClick(R.id.btn0) public void btn0() { final AlertDialog dialog = new AlertDialog.builder(context).create(); dialog.show(); Window window = dialog.getWindow(); window.setContentView(R.layout.dialog_CHANGE_DATE); window.setBACkgroundDrawable(new ColorDrawable(0x00000000)); // 处理5.0以上对话框的白边问题 window.setGravity(Gravity.bOTTOM); final DatePickerView datePickerView = (DatePickerView) window.findViewById(R.id.datePickerView); //打开页面时需要选中的日期 TODO datePickerView.setDate(2015,5,11); // datePickerView.setDate(birthdayArray[0],birthdayArraY[1],birthdayarray[2]); final int[] birthdayArray = new int[3]; datePickerView.addOnSELEctedChangingListener(new DatePickerView.onSELEctedChangedListener() { @Override public void OnSELEctedChanged(int[] oldValue,int[] newvalue) { birthdayArray[0] = newValue[0]; birthdayArraY[1] = newValue[1]; birthdayarray[2] = newValue[2]; } }); window.findViewById(R.id.tvCancel).setOnClickListener(new View.onClickListener() { @Override public void onClick(View view) { dialog.dismiss(); } }); window.findViewById(R.id.tvOK).setOnClickListener(new View.onClickListener() { @Override public void onClick(View view) { dialog.dismiss(); btn0.setText(birthdayArray[0] + "年" + birthdayArraY[1] + "月" + birthdayarray[2] + "日"); } }); }
1.WheelView 源码(有修改)
2.xml布局文件
<?xml version="1.0" encoding="utf-8"?> <!--widget_date_picker.xml--> <!--注意修改页面自定义控件的包名--> <LinearLayout xmlns:android="http://scheR_407_11845@as.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <de.bvb.rxdemo.widget.DateSELEctWidget.wheelview.WheelView android:id="@+id/wheelViewYear" android:layout_width="0dp" android:layout_height="match_parent" android:layout_gravity="center" android:layout_weight="1"/> <de.bvb.rxdemo.widget.DateSELEctWidget.wheelview.WheelView android:id="@+id/wheelViewMonth" android:layout_width="0dp" android:layout_height="match_parent" android:layout_gravity="center" android:layout_weight="1"/> <de.bvb.rxdemo.widget.DateSELEctWidget.wheelview.WheelView android:id="@+id/wheelViewDay" android:layout_width="0dp" android:layout_height="match_parent" android:layout_gravity="center" android:layout_weight="1"/> </LinearLayout>
<?xml version="1.0" encoding="utf-8"?> <!--dialog_CHANGE_DATE.xml--> <!--注意修改页面自定义控件的包名--> <LinearLayout xmlns:android="http://scheR_407_11845@as.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:BACkground="@android:color/transparent" android:gravity="bottom" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:BACkground="@android:color/white" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="48dp" android:orientation="horizontal"> <TextView android:id="@+id/tvCancel" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:BACkground="#F9F9F9" android:gravity="center" android:text="取消" android:textColor="#43AAFC"/> <View android:layout_width="1px" android:layout_height="match_parent" android:BACkground="#D7D7D7"/> <TextView android:id="@+id/tvOK" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:BACkground="#F9F9F9" android:gravity="center" android:text="确定" android:textColor="#43AAFC"/> </LinearLayout> <View android:layout_width="match_parent" android:layout_height="1px" android:BACkground="#D7D7D7"/> <de.bvb.rxdemo.widget.DateSELEctWidget.DatePickerView android:id="@+id/datePickerView" android:layout_width="match_parent" android:layout_height="wrap_content"/> </LinearLayout> </LinearLayout>
3.java文件
package de.bvb.rxdemo.widget.DateSELEctWidget; import android.content.Context; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; import android.widget.LinearLayout; import android.widget.TextView; import java.util.ArrayList; import de.bvb.rxdemo.R; import de.bvb.rxdemo.widget.DateSELEctWidget.wheelview.onWheelChangedListener; import de.bvb.rxdemo.widget.DateSELEctWidget.wheelview.onWheelScrollListener; import de.bvb.rxdemo.widget.DateSELEctWidget.wheelview.WheelView; import de.bvb.rxdemo.widget.DateSELEctWidget.wheelview.adapter.AbstractWheelTextAdapter1; public class DatePickerView extends LinearLayout { private static final int YEAR_MIN = 1950; private static final int YEAR_MAX = 2020; privatE int year = YEAR_MIN; privatE int month = 1; privatE int day = 1; private ArrayList<Integer> yearList = new ArrayList<>(YEAR_MAX - YEAR_MIN + 1); private ArrayList<Integer> monthList = new ArrayList<>(12); private ArrayList<Integer> dayList = new ArrayList<>(31); private DateTextAdapter yearAdapter; private DateTextAdapter monthAdapter; private DateTextAdapter dayAdapter; private Context context; private WheelView wheelViewYear; private WheelView wheelViewMonth; private WheelView wheelViewDay; public DatePickerView(Context context) { this(context,null); } public DatePickerView(Context context,AttributeSet attrs) { this(context,attrs,0); } public DatePickerView(Context context,AttributeSet attrs,int defStyleAttr) { super(context,defStyleAttr); this.context = context; init(); } private void init() { for (int i = YEAR_MIN; i < YEAR_MAX + 1; i++) { yearList.add(i); } for (int i = 1; i < 13; i++) { monthList.add(i); } for (int i = 1; i < 32; i++) { dayList.add(i); } LayoutInflater.from(context).inflate(R.layout.widget_date_picker,this); // View.inflate(context,R.layout.widget_date_picker,this); wheelViewYear = (WheelView) findViewById(R.id.wheelViewYear); wheelViewMonth = (WheelView) findViewById(R.id.wheelViewMonth); wheelViewDay = (WheelView) findViewById(R.id.wheelViewDay); wheelViewYear.setCyclic(true);// 可循环滚动 wheelViewMonth.setCyclic(true);// 可循环滚动 wheelViewDay.setCyclic(true);// 可循环滚动 yearAdapter = new DateTextAdapter(context); monthAdapter = new DateTextAdapter(context); dayAdapter = new DateTextAdapter(context); yearAdapter.setList(yearList); monthAdapter.setList(monthList); dayAdapter.setList(dayList); wheelViewYear.setViewAdapter(yearAdapter); wheelViewMonth.setViewAdapter(monthAdapter); wheelViewDay.setViewAdapter(dayAdapter); wheelViewYear.addChangingListener(new OnWheelChangedListener() { @Override public void onChanged(WheelView wheel,int oldValue,int newvalue) { year = YEAR_MIN + newValue; int days = calcDay(year,month); // days=28 dayList = getDayList(days); dayAdapter.setList(dayList); if (day > days) { dayAdapter.currenTindex = days - 1; wheelViewDay.setCurrentItem(dayAdapter.currenTindeX); } else { dayAdapter.currenTindex = day - 1; // day = 30 } if (onSELEctedChangedListener != null) { onSELEctedChangedlistener.onSELEctedChanged(parseInt2Array(YEAR_MIN + oldValue,month,day),getSELEctDate()); } } }); wheelViewMonth.addChangingListener(new OnWheelChangedListener() { @Override public void onChanged(WheelView wheel,int newvalue) { month = 1 + newValue; int days = calcDay(year,month); // days=28 dayList = getDayList(days); dayAdapter.setList(dayList); if (day > days) { dayAdapter.currenTindex = days - 1; wheelViewDay.setCurrentItem(dayAdapter.currenTindeX); } else { dayAdapter.currenTindex = day - 1; // day = 30 } if (onSELEctedChangedListener != null) { onSELEctedChangedlistener.onSELEctedChanged(parseInt2Array(year,1 + oldValue,getSELEctDate()); } } }); wheelViewDay.addChangingListener(new OnWheelChangedListener() { @Override public void onChanged(WheelView wheel,int newvalue) { day = 1 + newValue; if (onSELEctedChangedListener != null) { onSELEctedChangedlistener.onSELEctedChanged(parseInt2Array(year,oldValue + 1),getSELEctDate()); } } }); wheelViewYear.addScrollingListener(onWheelScrollListener); wheelViewMonth.addScrollingListener(onWheelScrollListener); wheelViewDay.addScrollingListener(onWheelScrollListener); } OnWheelScrollListener onWheelScrollListener = new OnWheelScrollListener() { @Override public void onScrollingStarted(WheelView wheel) { } @Override public void onScrollingFinished(WheelView wheel) { setTextViewStyle(); } }; private void setTextViewStyle() { setTextViewSize(year + "",yearAdapter); setTextViewSize(month + "",monthAdapter); setTextViewSize(day + "",dayAdapter); } private void setTextViewSize(String currentItemText,AbstractWheelTextAdapter1 adapter) { ArrayList<View> arrayList = adapter.getTextViews(); int size = arrayList.size(); String currentText; TextView textView; Boolean current; for (int i = 0; i < size; i++) { textView = (TextView) arrayList.get(i); currentText = textView.getText().toString(); current = currentItemText.equals(currentText); textView.setTextColor(current ? adapter.SELEcted_text_color : adapter.un_SELEcted_text_color); textView.setTextSize(current ? adapter.SELEcted_text_size : adapter.un_SELEcted_text_sizE); } } /** * 设置控件的初始值 * * @param year * @param month * @param day */ public void setDate(int year,int month,int day) { //验证合法性 if (year > YEAR_MAX || year < YEAR_MIN) { year = YEAR_MIN; // throw new RuntimeException("年份必须在[" + YEAR_MIN + "," + YEAR_MAX + "]之间"); } if (month > 12 || month < 1) { month = 1; // throw new RuntimeException("月份份必须在[" + 1 + "," + 12 + "]之间"); } final int days = calcDay(year,month); if (day > days || day < 1) { day = 1; // throw new RuntimeException("日期份必须在[" + 1 + "," + days + "]之间"); } this.year = year; this.month = month; this.day = day; yearAdapter.currenTindex = DatePickerView.this.year - YEAR_MIN; monthAdapter.currenTindex = DatePickerView.this.month - 1; dayAdapter.currenTindex = DatePickerView.this.day - 1; wheelViewYear.setCurrentItem(yearAdapter.currenTindeX); wheelViewMonth.setCurrentItem(monthAdapter.currenTindeX); wheelViewDay.setCurrentItem(dayAdapter.currenTindeX); } public void addOnSELEctedChangingListener(OnSELEctedChangedListener onSELEctedChangedListener) { this.onSELEctedChangedListener = onSELEctedChangedListener; } private OnSELEctedChangedListener onSELEctedChangedListener; public interface OnSELEctedChangedListener { void OnSELEctedChanged(int[] oldValue,int[] newvalue); } privatE int[] parseInt2Array(int year,int day) { return new int[]{year,day}; } privatE int[] getSELEctDate() { return new int[]{year,day}; } private ArrayList<Integer> getDayList(int days) { if (days <= 0) { return null; } ArrayList<Integer> list = new ArrayList(days); for (int i = 1; i < days + 1; i++) { list.add(i); } return list; } privatE int calcDay(int year,int month) { int days = 0; switch (month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: days = 31; break; case 4: case 6: case 9: case 11: days = 30; break; case 2: days = (year % 400 == 0 || (year % 100 != 0 && year % 4 == 0)) ? 29 : 28; break; } return days; } private class DateTextAdapter extends AbstractWheelTextAdapter1 { ArrayList<Integer> list; public DateTextAdapter(Context context) { super(context,android.R.layout.simple_list_item_1); // super(context,R.layout.item_birth_year); // setItemTextresource(R.id.tempvalue); // item_birth_year.xml 内容如下 // <?xml version="1.0" encoding="utf-8"?> // <LinearLayout xmlns:android="http://scheR_407_11845@as.android.com/apk/res/android" // android:layout_width="match_parent" // android:layout_height="35dip" // android:gravity="center" // android:orientation="horizontal"> // <TextView // android:id="@+id/tempValue" // android:layout_width="match_parent" // android:layout_height="match_parent" // android:gravity="center" // android:textColor="#ffff0000"/> // </LinearLayout> } public void setList(ArrayList<Integer> list) { this.list = list; notifyDataChangedEvent(); } @Override protected CharSequence getItemText(int indeX) { return list == null ? "" : String.valueOf(list.get(indeX)); } @Override public int getItemsCount() { return list == null ? 0 : list.size(); } } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。
以上是大佬教程为你收集整理的Android自定义控件之日期选择控件使用详解全部内容,希望文章能够帮你解决Android自定义控件之日期选择控件使用详解所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。