废话不多说先看效果,效果不符合,就不要用看了。

android自定义日期年月 安卓如何设置日期_System

安卓提供自己的日期选择和时间选择,但是样式并不是自己想要的,如果非要把他们放在一起,会发现,样式不好看,而且时间和日期选择控件的大小不好控制,甚至根本没法放在一行上,所以实现自定义日期时间选择器有两种方式

1.自己写自定义控件,需要能滚动的WheelView,虽然网上有三方的WheelView,但是我们自己还要懂自己如何计算日期时间,时间确实比较麻烦,我们要去学习日历,很费劲
2.就是自己去根据安卓自己的日期和时间控件,进行组合,而这样,我们就需要解决两个问题

a.样式问题;


自己添加了安卓自己的日期控件会发现,各个版本样式不一样,当在一个系统运行效果是这样,但换个系统,样式就不一样了。那么就需要自己强制定义一个样式,如上图的样式是android:Theme.Holo.Light.Dialog

需要在style.xml自定义样式MyDialogStyleBottom

<!-- 自定义dialogActivity的样式 -->
    <style name="MyDialogStyleBottom" parent="android:Theme.Holo.Light.Dialog">
        <item name="android:windowAnimationStyle">@style/AnimBottom</item>
        <item name="android:windowFrame">@null</item>
        <!-- 边框 -->
        <item name="android:windowIsFloating">false</item>
        <!-- 是否浮现在activity之上 -->
        <item name="android:windowIsTranslucent">true</item>
        <!-- 半透明 -->
        <item name="android:windowNoTitle">true</item>
        <!-- 无标题 -->
        <item name="android:windowBackground">@android:color/transparent</item>
        <!-- 背景透明 -->
        <item name="android:backgroundDimEnabled">true</item>
        <!-- 模糊 -->
    </style>

那么需要自己的activity样式采用这个,就需要manifest配置如下

<span style="white-space:pre">	</span><activity
            android:name=".DatePickActivity"
            android:theme="@style/MyDialogStyleBottom" >
        </activity>

b.就是控件大小问题

用的时候,发现当强制将两个控件放在一行,会导致日期或时间显示不全,无论怎么调整布局宽度,都无法显示完全,在查看源码时后看到,安卓自己的时间和日期选择器都会用到numberpicker,就可以从这里着手,它们都是FrameLayout的子类,只需要找到其中的numberpicker,进行重新调整位置就行

<span style="white-space:pre">	</span>/**
	 * 数据初始化
	 */
	private void init() {
		datePicker.setCalendarViewShown(false);
		timePicker.setIs24HourView(true);
		resizePikcer(datePicker);// 调整datepicker大小
		resizePikcer(timePicker);// 调整timepicker大小
		String str = getIntent().getStringExtra("date");
		if (TextUtils.isEmpty(str)) {
			System.out.println("isempty");
			datestrold = "";
			datestr = "";
		} else {
			datestr = str;
			datestrold = str;
		}

	}

<span style="white-space:pre">	</span>/**
	 * 调整FrameLayout大小
	 * 
	 * @param tp
	 */
	private void resizePikcer(FrameLayout tp) {
		List<NumberPicker> npList = findNumberPicker(tp);
		for (NumberPicker np : npList) {
			resizeNumberPicker(np);
		}
	}

<span style="white-space:pre">	</span>/*
	 * 调整numberpicker大小
	 */
	private void resizeNumberPicker(NumberPicker np) {
		LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(Util.dip2px(this, 45),
				LayoutParams.WRAP_CONTENT);
		params.setMargins(Util.dip2px(this, 5), 0, Util.dip2px(this, 5), 0);
		np.setLayoutParams(params);

	}

<span style="white-space:pre">	</span>/**
	 * 得到viewGroup里面的numberpicker组件
	 * 
	 * @param viewGroup
	 * @return
	 */
	private List<NumberPicker> findNumberPicker(ViewGroup viewGroup) {
		List<NumberPicker> npList = new ArrayList<NumberPicker>();
		View child = null;
		if (null != viewGroup) {
			for (int i = 0; i < viewGroup.getChildCount(); i++) {
				child = viewGroup.getChildAt(i);
				if (child instanceof NumberPicker) {
					npList.add((NumberPicker) child);
				} else if (child instanceof LinearLayout) {
					List<NumberPicker> result = findNumberPicker((ViewGroup) child);
					if (result.size() > 0) {
						return result;
					}
				}
			}
		}
		return npList;
	}


DatePickActivity.java


@ContentView(R.layout.activity_date_pick)
public class DatePickActivity extends Activity {

	@ViewInject(R.id.date_picker)
	private DatePicker datePicker;

	@ViewInject(R.id.time_picker)
	private TimePicker timePicker;

	private String datestrold;
	private String datestr;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		ViewUtils.inject(this);
		init();
	}

	/**
	 * 数据初始化
	 */
	private void init() {
		datePicker.setCalendarViewShown(false);
		timePicker.setIs24HourView(true);
		resizePikcer(datePicker);// 调整datepicker大小
		resizePikcer(timePicker);// 调整timepicker大小
		String str = getIntent().getStringExtra("date");
		if (TextUtils.isEmpty(str)) {
			System.out.println("isempty");
			datestrold = "";
			datestr = "";
		} else {
			datestr = str;
			datestrold = str;
		}

	}

	
	/**
	 * 实现onTouchEvent触屏函数但点击屏幕时
	 * 
	 * @param v
	 */
	@OnClick(R.id.repair_date_other)
	public void exit(View v) {
		back(false);
	}
	
	/**
	 * 调整FrameLayout大小
	 * 
	 * @param tp
	 */
	private void resizePikcer(FrameLayout tp) {
		List<NumberPicker> npList = findNumberPicker(tp);
		for (NumberPicker np : npList) {
			resizeNumberPicker(np);
		}
	}

	/*
	 * 调整numberpicker大小
	 */
	private void resizeNumberPicker(NumberPicker np) {
		LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(Util.dip2px(this, 45),
				LayoutParams.WRAP_CONTENT);
		params.setMargins(Util.dip2px(this, 5), 0, Util.dip2px(this, 5), 0);
		np.setLayoutParams(params);

	}

	/**
	 * 得到viewGroup里面的numberpicker组件
	 * 
	 * @param viewGroup
	 * @return
	 */
	private List<NumberPicker> findNumberPicker(ViewGroup viewGroup) {
		List<NumberPicker> npList = new ArrayList<NumberPicker>();
		View child = null;
		if (null != viewGroup) {
			for (int i = 0; i < viewGroup.getChildCount(); i++) {
				child = viewGroup.getChildAt(i);
				if (child instanceof NumberPicker) {
					npList.add((NumberPicker) child);
				} else if (child instanceof LinearLayout) {
					List<NumberPicker> result = findNumberPicker((ViewGroup) child);
					if (result.size() > 0) {
						return result;
					}
				}
			}
		}
		return npList;
	}

	/**
	 * 点击取消
	 * 
	 * @param v
	 */
	@OnClick(R.id.repair_date_sel_cancel)
	public void cancel(View v) {
		back(true);
	}
	
	/**
	 * 点击确定
	 * 
	 * @param v
	 */
	@OnClick(R.id.repair_date_sel_ok)
	public void ok(View v) {
		back(false);
	}

	/**
	 * 处理返回按键
	 */
	@Override
	public void onBackPressed() {
		back(true);
		super.onBackPressed();
	}

	/**
	 * 关闭调用 old为true则不变,false则改变
	 * 
	 * @param old是否不变
	 */
	private void back(boolean old) {
		// 获取时间选择
		Intent intent = new Intent();
		if (old) {
			intent.putExtra("date", datestrold);
		} else {
			datestr = getData();
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
			try {
				Date date = sdf.parse(datestr);
				if (!compare(date))
					return;
				intent.putExtra("date", datestr);
				setResult(Activity.RESULT_OK, intent);
			} catch (ParseException e) {
				e.printStackTrace();
			}
		}
		finish();
	}

	// 比较时间
	private boolean compare(Date dt1) {
		Date curDate = new Date(System.currentTimeMillis());
		if (dt1.getTime() > curDate.getTime()) {
			System.out.println("选的时间大于现在的时间");
			return true;
		} else if (dt1.getTime() < curDate.getTime()) {
			Util.showToast(this, "预约时间必须大于当前时间");
			return false;
		} else {// 相等
			System.out.println("相等");
			return false;
		}
	}

	private String getData() {
		StringBuilder str = new StringBuilder().append(datePicker.getYear()).append("-")
				.append((datePicker.getMonth() + 1) < 10 ? "0" + (datePicker.getMonth() + 1)
						: (datePicker.getMonth() + 1))
				.append("-")
				.append((datePicker.getDayOfMonth() < 10) ? "0" + datePicker.getDayOfMonth()
						: datePicker.getDayOfMonth())
				.append(" ")
				.append((timePicker.getCurrentHour() < 10) ? "0" + timePicker.getCurrentHour()
						: timePicker.getCurrentHour())
				.append(":").append((timePicker.getCurrentMinute() < 10) ? "0" + timePicker.getCurrentMinute()
						: timePicker.getCurrentMinute());

		return str.toString();
	}
}



activity_date_pick.xml


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center_horizontal" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:background="@color/transparent"
        android:gravity="center_horizontal"
        android:orientation="vertical" >
		<View 
		    android:id="@+id/repair_date_other"
		    android:layout_width="match_parent"
		    android:layout_height="0dp"
		    android:layout_weight="1"/>
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/igray" >

            <Button
                android:id="@+id/repair_date_sel_cancel"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentLeft="true"
                android:background="@color/transparent"
                android:text="取消"
                android:textColor="@color/blue"
                android:textSize="20sp" />

            <Button
                android:id="@+id/repair_date_sel_ok"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentRight="true"
                android:background="@color/transparent"
                android:textColor="@color/blue"
                android:text="确定"
                android:textSize="20sp" />
        </RelativeLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/white"
            android:orientation="horizontal"
             >
                <DatePicker
                    android:id="@+id/date_picker"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="5"
                     >
                </DatePicker>

                <TimePicker
                    android:id="@+id/time_picker"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="4"
                    android:visibility="visible"
                     />

        </LinearLayout>
    </LinearLayout>

</RelativeLayout>