废话不多说先看效果,效果不符合,就不要用看了。
安卓提供自己的日期选择和时间选择,但是样式并不是自己想要的,如果非要把他们放在一起,会发现,样式不好看,而且时间和日期选择控件的大小不好控制,甚至根本没法放在一行上,所以实现自定义日期时间选择器有两种方式
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>
Demo源码地址